続・右プロンプト

zshで右プロンプトにgitの状態を表示させてみたが、zshの最近のバージョン(4.3.10)のvcs_infoは、いちいちgitを呼ばなくてもリポジトリの状態を把握できるらしい。 毎回gitが走ると当然遅いので、vcs_infoに切り替えてみた。

# right prompt
autoload -Uz add-zsh-hook
autoload -Uz vcs_info

zstyle ':vcs_info:*' enable git svn hg bzr
zstyle ':vcs_info:*' formats '[%b]'
zstyle ':vcs_info:*' actionformats '[%b|%a]'
zstyle ':vcs_info:(svn|bzr):*' branchformat '%b:r%r'
zstyle ':vcs_info:bzr:*' use-simple true

autoload -Uz is-at-least
if is-at-least 4.3.10; then
  zstyle ':vcs_info:git:*' check-for-changes true
  zstyle ':vcs_info:git:*' stagedstr "+"
  zstyle ':vcs_info:git:*' unstagedstr "-"
  zstyle ':vcs_info:git:*' formats '[%b[%c%u]]'
  zstyle ':vcs_info:git:*' actionformats '[%b|%a[%c%u]]'
fi

function _update_vcs_info_msg() {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
}
add-zsh-hook precmd _update_vcs_info_msg
RPROMPT="%1(v|%F{green}%1v%f|) [%20<..<%~]"

.zshrcはこんな感じ。 mergeやrebaseでconflictすれば[(ブランチ名)|rebase]のようになり、staged changeがあれば+、unstaged changeがあれば-で示してくれる。 前回やったように色を変えたかったが、vcs_infoでは無理のようだ。色を変えるなら速度に目をつぶってgitを呼ぶしかないのかなぁ。