こんにちは、河野です。
zshのvcs_infoはとても便利ですが、svnだとgitのように豊富に情報が出ないので、hookでがんばってみます。
出力内容の調整
現在の状態はこんな感じです。
| 1 2 3 4 5 | % svn st ?       hoge.txt M       fuga.txt !       piyo.txt | 
このstatusをプロンプトで確認できるようになると、便利ですよね。
出力を 記号:数 にするために、awk で整形します。
| 1 2 3 | % svn st | awk '{ c[$1] += 1; } END{for (k in c) {printf "%s:%s ", k, c[k]}}' !:1 ?:1 M:1 | 
こんな感じです。とりあえずfunctionにしておきます。
| 1 2 3 | funciton count_svn_st() {   svn st | awk '{ c[$1] += 1; } END{for (k in c) {printf "%s:%s ", k, c[k]}}' } | 
vcs_infoのhookの設定
作ったfunctionをhookに設定します。
svnの場合、stagedやunstagedの情報は取得できませんが、値の設定ができるようです。強引ですが、unstagedにcount_svn_stで取得した情報を入力しています。出力フォーマットはformatsで指定して、色はとりあえず赤にしてみました。
| 1 2 3 4 5 6 7 8 9 10 | zstyle ':vcs_info:svn:*' formats '%F{white}(%s) - %F{cyan}[%b]%f' '%F{red}%u%f' zstyle ':vcs_info:svn+set-message:*' hooks svn-extra-info function +vi-svn-extra-info() {   if [[ "$1" != "1" ]]; then     return 0   fi   hook_com[unstaged]+=`count_svn_st` } | 
hookで呼び出すfunctionは+vi-というprefixを付ける必要があります。
プロンプトに出力
vcs_infoで設定された情報をプロンプトに出力します。
vcs_info_msgを更新する _update_vcs_info_msg と、プロンプトを更新する _update_prompt の2つのfunctionがあって、これは以前から使っているものを修正しています。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | function _update_vcs_info_msg() {   local -a messages   local pr_vcs   LANG=en_US.UTF-8 vcs_info   if [[ -z ${vcs_info_msg_0_} ]]; then     pr_vcs=""   else     [[ -n "$vcs_info_msg_0_" ]] && messages+=( "${vcs_info_msg_0_}" )     [[ -n "$vcs_info_msg_1_" ]] && messages+=( "${vcs_info_msg_1_}" )     pr_vcs="\n${(j: :)messages}"   fi   echo "$pr_vcs" } function _update_prompt() {     RPROMPT=""     PR_VCS=`_update_vcs_info_msg`     PR_SEP="%(1j,%F{magenta}%#%f,%#)"     PROMPT=" $PR_FULLPATH$PR_VCS $PR_USR $PR_SEP "     RPROMPT="$RPR_HOST" } add-zsh-hook precmd _update_prompt | 
完成です!
実際の表示は以下のようになります。
これだけだと、サーバー側の更新がわからないとか、awkを都度実行してるのもどうなんだとか、もう少し調整できそうですが、全く分からないよりはマシなので、これでしばらく良いかなと思います。
参考:zsh の vcs_info に独自の処理を追加して stash 数とか push していない件数とか何でも表示する - Qiita [キータ]

 
						
