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


@hmmrjn さんの 5分でターミナルの「MacBook:~ Taro$」を見やすくして絶頂する方法を元にプロンプト(bash)をカスタマイズしていましたが、マシン乗り換えを機にzshに引っ越したので、同じようなカスタマイズをzshでも行いました。

完成品はこちら
カレントディレクトリと(git配下なら)カレントブランチを表示します。

前準備

フォントインストール

Menlo for Powerline.ttfをダウンロードしてインストールします。
ディレクトリとブランチ名の後ろの右三角「▶︎」を使いたいためです。落ちてきた.ttfファイルをダブルクリックすればインストーラーが起動します。

フォント切り替え

インストールしたらターミナルの環境設定(⌘,)の プロファイル>テキスト>フォントをインストールした「Menlo for Powerline」に変更します。
変更したらターミナルを再起動する。

.zshrcに追記

.zshrcに以下を追記します。

.zshrc
autoload -Uz vcs_info
setopt prompt_subst

# vcs_info_msg_0_変数をどのように表示するかフォーマットの指定  %b: ブランチ名
zstyle ':vcs_info:git:*' formats '%b'
precmd () { vcs_info }

# プロンプトを見やすくする
export PROMPT='%K{250} %F{016}%C%k%K{118}%f%F{250}%f%F{016}%{${vcs_info_msg_0_}%f%k%F{118}%f $'

が化けていますがMenlo for Powerlineなら「▶︎」のように表示されるはずです。
とりあえず完成させたい人はここで終わり。以下解説です。

2行めまで

autoload -Uz vcs_info
setopt prompt_subst

autoloadで$FPATHにあるビルトイン関数を読み込んできます。
-Uは読み込み時にユーザーが定義したaliasを無視して読み込みます。-zはシェルを明示的にzshとして読み込みます。

vcs_infoはバージョン管理システムから情報をとってくる関数です。git以外にsvnなどでも利用できます。
autoload -Uz vcs_infoだけだと読み込むだけで実行はしません。今回はあとの行でプロンプトを表示する度に毎回実行するように設定するため、ここでの実行は不要です。

setopt prompt_substすることで後ほどセットするPROMPT変数内で変数展開するようになります。

6行めまで

zstyle ':vcs_info:git:*' formats '%b'
precmd () { vcs_info }

zstyleでgitの情報が入る変数vcs_info_msg_0_のフォーマットを設定します。%bはカレントブランチを表します。
他にはどのバージョン管理システムを使っているかを表す%sなどもあります。詳しくはThe Z Shell Manual

precmd () {}はプロンプトを表示する度に実行する関数です。ここでgitから情報を取得するvcs_infoを実行することで、プロンプトを表示する度に変数vcs_info_msg_0_の中身を最新に書き換えます。

9行め

export PROMPT='%K{250} %F{016}%C%k%K{118}%f%F{250}%f%F{016}%{${vcs_info_msg_0_}%f%k%F{118}%f $'

PROMPTに表示するフォーマットを設定します。

${vcs_info_msg_0_}で、先ほとフォーマットを指定したvcs_info_msg_0_に入っているgitの情報を展開します。

また背景色は%K{色番号}で開始地点を指定し、%kで終了地点を指定します。
文字色は%F{色番号}で開始地点を指定し、%fで終了地点を指定します。

図示すると

右三角「▶︎」の部分の色は%F{色番号}で指定するため、文字色指定がやや入り組んでいます。

また{}内で使える色番号は for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echoで確認することができます。

解説は以上です。
git配下外では緑の背景が出ないようにしたりしたいなあ(vcs_info_msg_0_でPROMPTを条件分岐すれば多分できる。)

最後にコメントをベタベタ書いたバージョンを貼っておきます。(私の.zshrcそのまま)

.zshrc
#gitのブランチ名を表示する
autoload -Uz vcs_info
# vcs_info_msg_0_変数をどのように表示するかフォーマットの指定
## デフォルトのフォーマット
### %s: どのバージョン管理システムを使っているか(git, svnなど)
### %b: ブランチ名
zstyle ':vcs_info:git:*' formats '%b'
# プロンプトを表示する直前に毎回実行する
precmd () { vcs_info }

# ターミナルを見やすくする
# PROMPT変数内で変数展開する
setopt prompt_subst
## 使える色の確認は for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echo
## 背景色の変更 %K{色番号}で開始 %kで終了
## 文字色の変更 %F{色番号}で開始 %fで終了
export PROMPT='%K{250} %F{016}%C%k%K{118}%f%F{250}%f%F{016}%{${vcs_info_msg_0_}%f%k%F{118}%f $'

参考リンク