zshでvcs_infoを省略しながら表示
Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法 - mollifier delta blogを原形にして, 表示を工夫してみた.
if [[ $ZSH_VERSION == (<5->|4.<4->|4.3.<10->)* ]]; then autoload -Uz vcs_info zstyle ':vcs_info:(git|svn):*' formats '%R' '%S' '%b' zstyle ':vcs_info:(git|svn):*' actionformats '%R' '%S' '%b|%a' zstyle ':vcs_info:*' formats '%R' '%S' '%s:%b' zstyle ':vcs_info:*' actionformats '%R' '%S' '%s:%b|%a' precmd_vcs_info () { psvar=() LANG=en_US.UTF-8 vcs_info repos=`print -nD "$vcs_info_msg_0_"` [[ -n "$repos" ]] && psvar[2]="$repos" [[ -n "$vcs_info_msg_1_" ]] && psvar[3]="$vcs_info_msg_1_" [[ -n "$vcs_info_msg_2_" ]] && psvar[1]="$vcs_info_msg_2_" } typeset -ga precmd_functions precmd_functions+=precmd_vcs_info PROMPT="%(!.%F{red}.%F{green})%U%n@%6>>%m%>>%u%f:%1(j.%j.)%(!.#.>) " local dirs='[%F{yellow}%3(v|%32<..<%3v%<<|%60<..<%~%<<)%f]' local vcs='%3(v|[%25<\<<%F{yellow}%2v%f@%F{blue}%1v%f%<<]|)' RPROMPT="$dirs$vcs" fi
if [[ $ZSH_VERSION == ... の行
vcs_infoは新しめのzshでないと動かず, たまに古い環境で同じ.zshrcを使うことがあるので, zshのバージョンをチェックしておく.
repos= ...の行
print -nDしておかないとホームディレクトリが~にならない. reposがlocalじゃないのは, もしも省略されたリポジトリのパスを知りたくなったらecho $reposで分かるようにするため.
typeset ..., precmd_functions+= の行
PROMPT= ... の行
vcs_info関係ないけど, rootになってるとき赤くしたり, バックグラウンドで実行中のジョブ数を表示したり. あとホスト名が長かったら先頭の部分だけ表示する.
local dirs= ...の行
右プロンプトのディレクトリ表示. リポジトリ内ではリポジトリルートからの相対パスを, そうでなければ普通にカレントディレクトリのパスを表示する.
[ # そのまま印字 %F{yellow} # ここから黄色 %3(v # if psvar[3] | # then %32<..< # 32文字を超えたら左側を「..」で省略 %3v # psvar[3](リポジトリルートからの相対パスが入っている)を表示 %<< # 左側省略ここまで | # else %60<..< # 60文字を超えたら左側を「..」で省略 %~ # カレントディレクトリを表示 %<< # 省略ここまで ) # fi %f # 黄色ここまで ] # そのまま印字
local vcs= ...の行
右プロンプトのVCS情報. [リポジトリルート@ブランチ]の形式.
%3(v # if psvar[3] | # then [ # そのまま印字 %25<\<< # 25文字を超えたら左側を「<」で省略 %F{yellow} # ここから黄色 %2v # psvar[2](リポジトリルートのパスが入っている)を表示 %f # 黄色ここまで @ # そのまま印字 %F{blue} # ここから青色 %1v # psvar[1](ブランチ情報が入っている)を表示 %f # 青色ここまで %<< # 左側省略ここまで ] # そのまま印字 | # else # なにも印字しない ) # fi