ターミナルのプロンプトにgitの差分(diff)のステップ数を表示させたい

そもそもターミナルのプロンプトって?

「プロンプト」はターミナルの中でuser_name@host_name ~ %で表示される、ユーザーにコマンドを入力するための待ち受け状態を示すテキストのこと。

なぜ差分(diff)を表示させたいのか

開発をしていると知らず知らずのうちにdiffが肥大化することがあり、大量の差分を持ったプルリクエストを作ってしまいます。肥大化する前に先輩エンジニアにレビューしてもらう環境を整えようとdiffを表示させてみます。

先に結果

以下のように表示させました。

差分がない時

差分が存在する時

方法

イケてないかと思いますが、目的は達成しています。以下のように~/.zshrcを編集しました。

autoload -Uz vcs_info
setopt prompt_subst
# gitのブランチ名等表示
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{yellow}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{red}+"
zstyle ':vcs_info:*' formats "%F{green}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'

precmd () {
  vcs_info

  # git diff --shortstatのinsertion, deletionを抽出して表示する
  export GIT_DIFF_INSERTION=''
  export GIT_DIFF_DELETION=''
  if [ -n "$(git status --short 2>/dev/null)" ];then
    git_diff_stat=$(git diff --shortstat)
    if [[ $git_diff_stat == *insertion* ]];then
      export GIT_DIFF_INSERTION=+$(echo $git_diff_stat | sed -E 's/.*, (.*) insertion.*/\1/')
    fi
    if [[ $git_diff_stat == *deletion* ]];then
      export GIT_DIFF_DELETION=-$(echo $git_diff_stat | sed -E 's/.*, (.*) deletion.*/\1/')
    fi
  fi
}
PROMPT='%n@%m %c'\$vcs_info_msg_0_''
PROMPT=${PROMPT}' %F{green}${GIT_DIFF_INSERTION}%F{red}${GIT_DIFF_DELETION}
%f$ '

おわりに

今回は若干無理やり感はありますが、ターミナルのプロンプトにgitの差分(diff)のステップ数を表示させてみました。 シェルスクリプト使うのはまだ不慣れなので、イケてるzshrcがかけるようになってきたら更新する予定です。