こんにちは、河野です。
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 [キータ]