理系学生日記

おまえはいつまで学生気分なのか

zsh のプロンプトで git のブランチ名とステージしてないファイルの有無とかを表示させる

どういうことかというと、こういう感じですね。git ブランチ名のあとに、ステージされて(いる|いない)変更点があるかどうかを S/U で表示しています。

zsh では、git に代表される VCS の情報を取得することができ、git に限って言えばブランチ名だけでなく、ステージされているファイルやステージされてないファイルの有無なんかも取得することができます。これをプロンプトに反映してやれば、今カレントディレクトリ下にあるリポジトリに commit が漏れているファイルがあるか、といったことを一目で把握できるようになるということになります。

上記の実現方法として、以下のようなことをしています。詳細は zshcontrib(1) を見れば良いです。

autoload -U colors
colors
autoload -Uz vcs_info
autoload -Uz add-zsh-hook
zstyle ':vcs_info:*' enable git cvs svn hg           # git, cvs, svn, mercurial で有効化
zstyle ':vcs_info:git:*' check-for-changes true      # commit 漏れとかがあるかどうかのチェックを有効化
zstyle ':vcs_info:git:stagedstr:*:' S                # ステージされた変更点があることを示す文字列
zstyle ':vcs_info:git:unstagedstr:*' U               # ステージされてない変更点があることを示す文字列
zstyle ':vcs_info:*' formats '%{'${fg[magenta]}'%}[%s %b] %{'${fg_bold[red]}'%}%c%u%{'${reset_color}'%}' # $vcs_info_msg_N_ に格納される文字列

PROMPT_USERHOST='%{'${fg[blue]}'%}%n@%M%{'${reset_color}'%}'
PROMPT_TIME='%U%D{%T}%u'
PROMPT_STATUS='%(?|%{'${fg[green]}'%}|%{'${fg[red]}'%})%# %{'${reset_color}'%}'  # プロンプト
RPROMPT="[%~]"

# コマンド入力の度に呼び出す関数
update_vcs_info () {
    vcs_info 
    PROMPT="$PROMPT_USERHOST $PROMPT_TIME $vcs_info_msg_0_ $PROMPT_STATUS"
}
add-zsh-hook precmd update_vcs_info  # precmd フックへの登録