zshのvcs_infoでgitのなんやかんやらを表示しようとした時の対応について

やることの9割は以下の内容です。
[zsh の vcs_info に独自の処理を追加して stash 数とか push していない件数とか何でも表示する](http://qiita.com/items/8d5a627d773758dd8078)

自分の環境で動作させようとしたときに軽くハマったので記載しておく。

## RPROMPTじゃなくてPROMPTに表示しようとした場合

参照元のサイトだと、gitのステータスなんやらはRPROMPTに表示ですが、WindowsでPosh-Git使ってる見としてはPROMPTの右端に表示したいところ。
というわけでそのようにしてみますが、このままやろうとすると色の指定とかがエスケープ食らってそのまま(%F{yellow}~%fみたいに)表示されてしまうので、そこに気をつけましょう。
表示にはpsvarを使います。

```sh:PROMPTに表示
function _update_vcs_info_msg() {
    psvar=()

    LANG=en_US.UTF-8 vcs_info

    if [[ -z ${vcs_info_msg_0_} ]]; then
        # vcs_info で何も取得していない場合はプロンプトを表示しない
        psvar[1]=""
        psvar[2]=""
        psvar[3]=""
    else
        # vcs_info で情報を取得した場合
        # $vcs_info_msg_0_ , $vcs_info_msg_1_ , $vcs_info_msg_2_ を
        # それぞれ緑、黄色、赤で表示する
        [[ -n "$vcs_info_msg_0_" ]] && psvar[1]=( "${vcs_info_msg_0_}" )
        [[ -n "$vcs_info_msg_1_" ]] && psvar[2]=( "${vcs_info_msg_1_}" )
        [[ -n "$vcs_info_msg_2_" ]] && psvar[3]=( "${vcs_info_msg_2_}" )
    fi
}
add-zsh-hook precmd _update_vcs_info_msg

……

PROMPT="%# %F{green}%1v%f %F{yellow}%2v%f %F{red}%3v%f  > "
```

_update_vcs_info_msg()には出力する文字だけをpsvarに、文字の色づけはPROMPTで行うようにすれば上手く行きます。

## git-svnをgitと同じ様に表示しよう

正直自分はgitリポジトリだけで無く、svnリポジトリも結構使います。
なんで、svnリポジトリをgitで扱うためにgit-svnを使うのですが、なぜかstash数やunstageなものが出ない！
というわけでなんやかんやしてたのですが、どうも%sで出力されるのがgit-svn、stash数やら表示するためのがgitと……違う？
と思い至りmanとか見てみたところ、どうもgitとgit-svnは違うものとして扱われている模様。

じゃあ、こうすればいいじゃない。

```sh:git-svn対応
zstyle ':vcs_info:*' enable git svn hg bzr
# 標準のフォーマット(git 以外で使用)
# misc(%m) は通常は空文字列に置き換えられる
zstyle ':vcs_info:*' formats '(%s)-[%b]'
zstyle ':vcs_info:*' actionformats '(%s)-[%b]' '%m' '<!%a>'
zstyle ':vcs_info:(svn|bzr):*' branchformat '%b:r%r'
zstyle ':vcs_info:bzr:*' use-simple true


if is-at-least 4.3.10; then
    # git 用のフォーマット
    # git のときはステージしているかどうかを表示
    zstyle ':vcs_info:git:*' formats '(%s)-[%b]' '%c%u %m'
    zstyle ':vcs_info:git:*' actionformats '(%s)-[%b]' '%c%u %m' '<!%a>'
    zstyle ':vcs_info:git:*' check-for-changes true
    zstyle ':vcs_info:git:*' stagedstr "+"    # %c で表示する文字列
    zstyle ':vcs_info:git:*' unstagedstr "-"  # %u で表示する文字列

    zstyle ':vcs_info:git-svn:*' formats '(%s)-[%b]' '%c%u %m'
    zstyle ':vcs_info:git-svn:*' actionformats '(%s)-[%b]' '%c%u %m' '<!%a>'
    zstyle ':vcs_info:git-svn:*' check-for-changes true
    zstyle ':vcs_info:git-svn:*' stagedstr "+"    # %c で表示する文字列
    zstyle ':vcs_info:git-svn:*' unstagedstr "-"  # %u で表示する文字列
fi

# hooks 設定
if is-at-least 4.3.11; then
    # git のときはフック関数を設定する

    # formats '(%s)-[%b]' '%c%u %m' , actionformats '(%s)-[%b]' '%c%u %m' '<!%a>'
    # のメッセージを設定する直前のフック関数
    # 今回の設定の場合はformat の時は2つ, actionformats の時は3つメッセージがあるので
    # 各関数が最大3回呼び出される。
     zstyle ':vcs_info:git+set-message:*' hooks \
                                            git-hook-begin \
                                            git-untracked \
                                            git-push-status \
                                            git-nomerge-branch \
                                            git-stash-count

     zstyle ':vcs_info:git-svn+set-message:*' hooks \
                                            git-hook-begin \
                                            git-untracked \
                                            git-push-status \
                                            git-nomerge-branch \
                                            git-stash-count
```

正直、同じことしてるのが重複してるのであまりよろしくないとは思う。
いい方法があるなら是非教えて欲しい所です。

**コメントでor表現が可能な事を教えて頂きました。**
@mollifier さんありがとうございます！

```sh:
    zstyle ':vcs_info:(git|git-svn):*' formats '(%s)-[%b]' '%c%u %m'
……
     zstyle ':vcs_info:(git|git-svn)+set-message:*' hooks \
……
```

こんな風に書けば同じ事書かなくてもいいですね！

これでgit-svnで持ってきたリポジトリでもgitと同じ表示になります。