Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法

2012/12/13 追記

zsh 4.3.11 以降の新しい機能を使って改良しました。 -> 「zsh の vcs_info に独自の処理を追加して stash 数とか push していない件数とか何でも表示する - Qiita


最近Gitを使い始めた。で、ブランチとか使うようになって、今どのブランチにいるのかをzshのプロンプトに表示したくなってきた。「そういやそんなブログのエントリ、よく見かけるな」と思ってちょっと調べてみた。

gitコマンドを呼び出してなんかやってる例が多いけど、manを読んでたらzsh自体にそういうのが組み込まれてたので紹介。vcs_info ってのを使うと解決する。

zshrcの例

いきなりだけど zshrc の書き方の例。

autoload -Uz vcs_info
zstyle ':vcs_info:*' formats '(%s)-[%b]'
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]'
precmd () {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
}
RPROMPT="%1(v|%F{green}%1v%f|)"

実際の様子はこんな感じ。

右プロンプトにGitのブランチ名とかが出てる。

2009/08/20 追記

vcs_info で Subversion のリビジョン番号が出ない問題を参考に、 vcs_info コマンド行の LANG の指定を追加した。これで Subversion のときにリビジョン番号がちゃんと表示されるようになる。

vcs_info とは

vcs_info は、Subversion(svn), Git, Mercurial(hg) といったバージョン管理システムの情報を自動的に取得するzshの関数。version control system(vcs) の情報、という意味。今のブランチ名をプロンプトに表示したりできるようになる。

いろんなシステムに対応してたり、何かと高機能で便利だと思う。詳しくは man zshcontrib の GATHERING INFORMATION FROM VERSION CONTROL SYSTEMS を参照。

設定内容の解説

zstyle ':vcs_info:*' formats '(%s)-[%b]' 行について

ここで基本的な表示フォーマットを指定している。「%なんとか」 の意味は以下の通り。

%s
どのバージョン管理システムを使用しているか。git とか svn とかに置き換えられる。
%b
ブランチ情報。

あとは、こんなのもあるもよう。

%R
リポジトリのルートディレクトリのパス
%r
リポジトリ
%S
リポジトリのルートディレクトリから見た、今のディレクトリの相対パス
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]' 行について

基本的に表示フォーマットは formats で指定するんだけど、actionformats ってのもある。マージでコンフリクトしたとか、何か特別なことが起こった場合にこの actionformats に基づいて表示される。

マージでコンフリクトを起こした場合の例。

actionformats の %a が merge ってアクション名に置き換わってる。これはコンフリクトを解消するまで残るので、うっかり忘れたりしなくて便利。

RPROMPT="%1(v|%F{green}%1v%f|)" について

RPROMPT の右側で %1(v| ... |) とやってるとこは、バージョン管理システムのディレクトリにいたらそれを表示、そうでないなら空文字列、ってやってる。詳しくは man zshmisc の %(x.true-text.false-text) またはzshの本の100ページを参照。

最後に

こんな感じで、フォーマットとか色とか変えて試してみるといいよ。

今回参考にしたページは以下。

2010/09/23 追記

後で細かく修正してエントリ書いた。こっちの方が便利になってる。

2つ目の「Git の作業コピーに...」の記事に今僕が使ってる設定が書いてあるよ。