zshでvcs_infoを省略しながら表示

Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法 - mollifier delta blogを原形にして, 表示を工夫してみた.

  • 主にgitを使っているのでgitの場合はVCS名は表示しない
  • svnの場合はリビジョンが表示されることで識別できるのでVCS名は表示しない
  • リポジトリのパスはぜんぶ出なくてもいい
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のバージョンをチェックしておく.

ztyle ':vcs_info:*' ... の行

%R
リポジトリルートのフルパス
%S
リポジトリルートからの相対パス
%b
ブランチ情報
%a
アクション
%s
VCS

gitかsvnのときは%sなしで, それ以外は%s:をつける.

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