会社のgitリポジトリにgithub.comの個人アカウントでcommitしてしまったことのあるエンジニアのみなさん、zshのプロンプトにgitの現在のユーザーアカウントを表示して再発を防止しませんか?
vcs_infoを使ってzshのプロンプトにgit(を始めとするVCS)の情報を表示している方は多いと思います。
人によって多少違っても、.zshrcはだいたいこんな感じになってるかと思います。
# ブランチ名をRPROMPTで表示
autoload -Uz add-zsh-hook
autoload -Uz vcs_info
setopt PROMPT_SUBST # プロンプト表示ごとに変数を展開する
zstyle ':vcs_info:*' formats '(%s)-[%b]'
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]'
_vcs_precmd () { vcs_info } # vcs_info関数を呼び出す。vcs情報はformatsで整形され vcs_info_msg_0_ に挿入される
add-zsh-hook precmd _vcs_precmd # 上の関数をプロンプト表示前に実行させる
RPROMPT='%F{green}${vcs_info_msg_0_}%f'
このvcs_infoにはフック機能があり(zsh version>=4.3.11)、任意のユーザー定義関数を実行させることができます。この機能を使って、プロンプトに git config user.email
の結果を追加することがきます。
autoload -Uz add-zsh-hook
autoload -Uz vcs_info
setopt PROMPT_SUBST
zstyle ':vcs_info:*' formats '(%s)-[%b] %m' # hook_com[misc]を出力するため%mを追加
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a] %m'
_vcs_precmd () { vcs_info }
add-zsh-hook precmd _vcs_precmd
RPROMPT='%F{green}${vcs_info_msg_0_}%f'
# gitリポジトリにいる場合、set-messageフックでgit-config-user関数が呼び出されるように登録
zstyle ':vcs_info:git+set-message:*' hooks git-config-user
# "+vi-<フック名>"関数で、hook_com[misc]にgit config user.emailの結果を代入する
function +vi-git-config-user(){
hook_com[misc]+=`git config user.email`
}
多少字幅はとりますが、このフックの仕組みを使えば、「gitレポジトリとアカウントの組み合わせが違う時だけプロンプトに出す」など、いろいろと作り込んでいけますね。
参考文献
zsh: 26. User Contributions
zsh の vcs_info に独自の処理を追加して stash 数とか push していない件数とか何でも表示する - Qiita
Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法 - mollifier delta blog