Ubuntu Weekly Recipe

第382回 達人になれない人のためのtmux/screenラッパープログラムByobu入門2015

この記事を読むのに必要な時間:およそ 5.5 分

Bash+ByobuでステータスにGitのブランチ名を表示する

Gitを使っていると,しばしばワーキングツリーがどのブランチなのか知りたくなります。ただ毎回「git branch」と入力するのも面倒なので,Byobuのステータスラインに表示してくれると便利です。

zshにはvcs_infoという,Gitだけでなくバージョン管理システム全般の情報を取得する仕組みが存在します。さらにprecmdを組み合わせれば,プロンプトやウィンドウ名にブランチ名を表示できるぐらいならすぐに実現できるようです。

今回のターゲットであるBashはvcs_infoもprecmdもありません注4⁠。しかしながらGitパッケージには/usr/lib/git-core/git-sh-promptという,リポジトリのステータスを取得するスクリプトが存在するのでこれを使うことにしましょう。

注4)
似たような仕組みを実装している人はいます。

Byobuには,⁠$BYOBU_CONFIG_DIR/bin/」以下に「数字_スクリプト名」というスクリプトを用意すると,数字で指定した秒間隔でスクリプトを実行し,その結果をステータス欄に表示する「custom」ステータスが存在します。customステータスを有効にするにはまず,F9キーの設定画面から「ステータス通知に切り替え」にて「custom」を選択してください。

次に「$BYOBU_CONFIG_DIR/bin/01_vsc_info」という名前のファイルを以下のような内容で作成します。

#!/bin/bash -e

PKG=byobu
. /usr/lib/byobu/include/common

CURDIR=$(tmux list-panes -F "#{pane_active} #{pane_current_path}")
CURDIR=$(echo $CURDIR | grep "^1" | cut -d' ' -f2-)
BRANCH=""
if [ -e /usr/lib/git-core/git-sh-prompt ]; then
    . /usr/lib/git-core/git-sh-prompt
    cd "$CURDIR" && BRANCH=$(__git_ps1 %s);
fi
STATUS=$(color m W; printf $BRANCH; color -)
echo $STATUS

あとは実行権限を付けて,Gitリポジトリ以下に移動するとブランチ名がステータス欄に表示されるはずです。別のリポジトリを表示している別のウィンドウに移動すると,表示が切り替わることも確認しておきましょう。何も表示されないようであれば,⁠$BYOBU_CONFIG_DIR/bin/01_vcs_info」を実行して,その結果が正しいかどうかをまず確認しましょう。

「tmux list-panes」は現在のウィンドウのペイン一覧を表示するコマンドです。pane_activeはアクティブペインに1,それ以外は0と表示します。pane_current_pathはそのペインのパスを表示します。残りのgrepとcutを使って,現在のアクティブペインのパスを取得しているということになります。

colorは/usr/lib/byobu/include/commonから取り込まれているshutilsで定義されている,tmux用の色変更コマンドを出力する関数です。

ファイル名に「01」とついていることからわかるように,これは常に1秒ごとに実行されるとても非効率なスクリプトです。よってステータス欄に表示するということはあまりせず,イベントをフックしやすいウィンドウ名やプロンプト名を変更する形の方が良いでしょう。ただtmuxは現在,各コマンドをフックできる仕組みを実装中なので,これが取り込まれればステータス欄への表示も現実的になるかもしれませんね。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。