このところ歳をとった影響なのか何なのか, git を使ったプロジェクトでリモートへの push 忘れが頻発するようになったので少しは作業環境を見直してみよう, ということで .zshrc とにらめっこしました。

何が問題なのか

改善前は zsh の RPROMPT (画面の右側) にカレントディレクトリの git のブランチ名を次のような形で表示していました。

(git)-(feature/current-branch)

この表示でわかるのは git リポジトリで尚且つブランチが feature/current-branch にいるということだけでした。

結果何が起こるかというと「作業し終わって push したつもりで忘れて翌日気づく」といったトラブルです。場合によっては発注元から一切作業しているように見えないまま 1 日経過する, というなんとも芳しくない状態が生まれたりします。

zsh-git-prompt を使って状態を可視化する

1 から作るのは面倒なので zsh のプラグインか何かを探してみると zsh-git-prompt というのがありました。現在いるブランチから remote との差分まで表示してくれるようです。

olivierverdier/zsh-git-prompt

インストールは Mac の Homebrew で対応できました。

$ brew install zsh-git-prompt

設定を追加して RPROMPT に次のように表示されるようにしました。

改善後の git リポジトリの状態表示

zsh-git-prompt の設定方法

基本は README の Install の通りです。~/.zshrc に次の内容を追加しています。

source "/usr/local/opt/zsh-git-prompt/zshrc.sh"
ZSH_THEME_GIT_PROMPT_PREFIX="["
ZSH_THEME_GIT_PROMPT_SUFFIX=" ]"
ZSH_THEME_GIT_PROMPT_BRANCH="%{$fg[white]%}"
ZSH_THEME_GIT_PROMPT_STAGED="%{$fg[green]%}%{ %G%}"
ZSH_THEME_GIT_PROMPT_CONFLICTS="%{$fg[magenta]%}%{x%G%}"
ZSH_THEME_GIT_PROMPT_CHANGED="%{$fg[red]%}%{+%G%}"
ZSH_THEME_GIT_PROMPT_BEHIND="%{$fg[red]%}%{-%G%}"
ZSH_THEME_GIT_PROMPT_AHEAD="%{$fg[green]%}%{+%G%}"
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[green]%}%{✔%G%}"
RPROMPT='$(git_super_status)'

zshrc.sh を確認するとカスタマイズ可能な変数があるので必要に応じて変更できます。

私の場合はデフォルトの bold と派手目の色や表示がどうもしっくりこなかったので変更しています。

注意点として RPROMPT$(git_super_status) を囲むクォートは 必ずシングルクォート にする必要があります。ダブルクォートにするとディレクトリを移動しても正しく情報が表示されません。(参考: ZSH git prompt not detecting git changes)

ダブルクォートにしてしまいしばらく悩みました。