zshでGitのブランチ名をプロンプトに表示する

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

zshでGitのブランチ名をプロンプトに表示する

zshのプロンプトに、Gitのブランチ名を表示させたくなった。

ちょうど、↓の図のような感じに。

Screenshot of terminal

bashではgit-completion.bashで定義される__git_ps1を使って、例えば↓のような感じで書いていたけど、

# Show git branch name
if [ -n "$(type -t __git_ps1)" ]; then
    PS1='\u@\h \w$(__git_ps1)\n\$ '
fi

zshではvcs_infoという関数を使って実現するらしい。

vcs_infoはGitに限らず、各種のVCS (Version Control System)に対応しているようなので、一度設定しておけばCVSやSubversion、Mercurialなんかにも対応できるようだ。

詳細は続きで。

vcs_infoの設定方法は↓のサイトに書いてあった。

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

いきなりだけど 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|)"

これをこのまま.zshrcに貼り付ければ普通に動くし、実際にあちこちでコピペされて使われているみたいなんだけど、それだけだとちょっとおもしろくない。

というより、中身がわからないコードをそのまんま貼り付けて使うのはやっぱ嫌だよねっていうことで、zshの勉強も兼ねていろいろと調べてみることにした。

リソース

結論から言うと、man zshcontribするだけでvcs_infoに関する必要な情報はほとんど手に入った。

zsh: 26. User Contributions

26.4 Gathering information from version control systems

In a lot of cases, it is nice to automatically retrieve information from version control systems (VCSs), such as subversion, CVS or git, to be able to provide it to the user; possibly in the user’s prompt. So that you can instantly tell which branch you are currently on, for example.

In order to do that, you may use the vcs_info function.

あとは、man zshmiscでプロンプトの設定方法について少し調べただけ。

zsh: 13. Prompt Expansion

13.1 Expansion of Prompt Sequences

Prompt sequences undergo a special form of expansion. This type of expansion is also available using the -P option to the print builtin.

設定サンプル

man zshcontribの中で紹介されている設定サンプルが↓。

autoload -Uz vcs_info
zstyle ':vcs_info:*' actionformats '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
zstyle ':vcs_info:*' formats       '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{5}]%f '
zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{3}%r'
precmd () { vcs_info }
PS1='%F{5}[%F{2}%n%F{5}] %F{3}%3~ ${vcs_info_msg_0_}%f%# '

わかる範囲で解説。

autoload -Uz vcs_info

vcs_infoをロードするための一行。

zstyle ':vcs_info:*' actionformats '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '

actionformatsの指定。actionformatsはマージコンフリクトなどの特殊なアクションが起こったときに使われるフォーマットらしい。

サンプルの設定のうち、%F{n}%fは色関係のシーケンスだから、それを除くと'(%s)-[%b|%a] 'と同じで、'(VCSの名前)-[ブランチの名前|アクションの名前] 'というような意味。

ちなみに、actionformatsなんかは適切なデフォルト値が設定されているので、デフォルトで良いなら改めて指定する必要はなし。

zstyle ':vcs_info:*' formats       '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{5}]%f '

formatsの指定。formatsはactionformatsが使われないときに使われるフォーマットで、つまりは通常時に使われるフォーマット。

formatsのデフォルト値は" (%s)-[%b]%u%c-"で、" (VCSの名前)-[ブランチの名前]ステージングされてない変更があれば'U'ステージングされた変更があれば'S'-"というような意味。

ちなみに、formatsやactionformatsはフォーマットのリストを指定することができるので、例えば

zstyle ':vcs_info:*' formats '%s' '%b' '%u' '%c'

というような指定ができる。その場合、後述の${vcs_info_msg_0_}に加えて${vcs_info_msg_1_}${vcs_info_msg_2_}が使用可能になる。

zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{3}%r'

branchformatの指定。branchformatは%bの展開に使うフォーマットで、ブランチ名のほかにリビジョンナンバーなどを表示したいときに使う。

この例では、zstyleのコンテキストに':vcs_info:(sv[nk]|bzr):*'が指定されているので、svn, svk, bzrに対してのみこの設定が有効になる (コンテキストの2番目は対象のVCSを指定する)。

precmd () { vcs_info }

precmd (プロンプト表示前に呼び出される関数)でvcs_info関数を呼び出す。VCSの情報やformatsを利用して${vcs_info_msg_0_}がセットされる。

PS1='%F{5}[%F{2}%n%F{5}] %F{3}%3~ ${vcs_info_msg_0_}%f%# '

プロンプトの設定。プロンプトに${vcs_info_msg_0_}に埋め込むことでvcs_infoの結果をプロンプトに表示する。

ちなみに、PS1やPROMPTに直接${vcs_info_msg_0_}を埋め込みたい場合は、PROMPT_SUBSTオプションを有効にしておかなければいけない。PROMPT_SUBSTを有効にしない場合は、precmdの中で${vcs_info_msg_0_}の値をpsvarに保存して、%1vなどを使ってプロンプトに埋め込まなければいけない。

precmd() {
    psvar=()
    vcs_info
    psvar[1]=$vcs_info_msg_0_
}
PROMPT='%n@%m %~%1v%# '

結論

最終的に、.zshrcには↓のような形で設定した。

# VCS settings
autoload -Uz vcs_info
precmd() {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    psvar[1]=$vcs_info_msg_0_
}
PROMPT=$'%2F%n@%m%f %3F%~%f%1v\n%# '

Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法 - ess supからの変更点。

  1. formatsやactionformatsはデフォルト設定をそのまま使ったのでzstyleをカット。
  2. $vcs_info_msg_0_が空かどうかをチェックするロジックは不要っぽかったのでカット。
  3. RPROMPTの%1(v|%F{green}%1v%f|)も冗長っぽかったのでカット。

結果的に、設定がとてもシンプルになって素人でもわかりやすい感じになった。

まとめ

  • vcs_infoはすごい。
  • zshはすごい。
  • %nF%fで色指定ができるのを初めて知った。
スポンサーサイト

関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/209-169aa984

トラックバック

コメント

シンプルで素晴らしいですね。
拝借させていただきました。
  • 2013-02-27
  • by DQNEO
  • id:-

コメントの投稿

お名前
コメント
編集キー
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。