2009年08月14日
Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法
最近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
- ブランチ情報。
あとは、こんなのもあるもよう。
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ページを参照。
最後に
こんな感じで、フォーマットとか色とか変えて試してみるといいよ。
今回参考にしたページは以下。
- http://michael-prokop.at/blog/2008/12/15/mikas-advent-calendar-day-15-zsh-vcs_info/
- man zshcontrib(1) - user contributions to zsh
2010/09/23 追記
後で細かく修正してエントリ書いた。こっちの方が便利になってる。
2つ目の「Git の作業コピーに...」の記事に今僕が使ってる設定が書いてあるよ。
- 永遠に未完成 - vcs_info で Subversion のリビジョン番号が出ない...
- 写経日記 - vcs_info: function definition file not found
- bsiyoの日記 - diary
- すぎゃーんメモ - zshでgitのbranch名をPROMPTに表示させるようにな...
- Yarukidenized:ヤルキデナイズド - git のブランチ名 *と作業状態*...
- のみなスケッチ - vcs_info
- おつあり - Re: git のブランチ名を zsh の右プロンプトに表示+ st...
- ess sup - zsh の vcs_info で Bazaar を使うときは use-simple を...
- 貳佰伍拾陸夜日記 - zshでvcs_infoを省略しながら表示
- [開発][Cygwin]zsh の vcs_info が神!のごとく重かったので…
- powerbombkunの日記 - vcs_info使ってみた
- s9gの日記 - vcs_info の使い方 あるいは prompt_subst のススメ
- ess sup - zsh で Git の作業コピーに変更があるかどうかをプロンプ...
- mfumiの日記 - VimのステータスラインにGitのブランチ名を表示
- Clipboard - zsh 導入メモ
- 成らぬは人の為さぬなりけり - zshでプロンプトにGitなどSCMのブラ...
- 125 http://reader.livedoor.com/reader/
- 101 http://www.hsbt.org/diary/20100319.html
- 96 http://b.hatena.ne.jp/hotentry/it
- 87 http://d.hatena.ne.jp/uasi/20091025/1256458798
- 86 http://blog.dealforest.net/2009/08/repositorys-branch-preview-zsh-prompt/
- 77 http://d.hatena.ne.jp/thinca/20090820/1250701903
- 67 http://d.hatena.ne.jp/sugyan/20091021/1256059079
- 64 http://twitter.com/
- 52 http://liosk.blog103.fc2.com/blog-entry-209.html
- 52 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=B0V&q=コマンドヒストリ+zsh&btnG=検索&lr=lang_ja


