エンジニアをリングする

プログラをミングしたり。

my web site twitter

zshのプロンプトにgitのステータスをシンプル可愛く表示

ついにシェルをzshにしました。

シェルならzshで決まり!みたいなことを聞きつつもbashで満足してたのでそのままだったのですが、
補完あたりに物足りなさを感じてきたので移行。

まずはプロンプトですよね。
ってことでカスタムしてみました。

こんな感じ

f:id:yoshiko_pg:20140402225525p:plain

  • カレントディレクトリ
  • gitのリポジトリ名と現在のブランチ
  • 変更あり、追加済み(staged)= 黄色
  • 変更あり、未追加(unstaged)= 赤
  • 変更なし、未追跡ファイルあり(untracked)= 水色
  • 変更なし、未追跡ファイルなし(clean)= 緑

こんな感じにしてみました。
いろんな記事参考にしながらも、ぴったりくる設定がなかったので大半書き換わった感じです。

.zshrcの該当コード

# プロンプト
autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git svn
zstyle ':vcs_info:*' max-exports 6 # formatに入る変数の最大数
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' formats '%b@%r' '%c' '%u'
zstyle ':vcs_info:git:*' actionformats '%b@%r|%a' '%c' '%u'
setopt prompt_subst
function vcs_echo {
    local st branch color
    STY= LANG=en_US.UTF-8 vcs_info
    st=`git status 2> /dev/null`
    if [[ -z "$st" ]]; then return; fi
    branch="$vcs_info_msg_0_"
    if   [[ -n "$vcs_info_msg_1_" ]]; then color=${fg[green]} #staged
    elif [[ -n "$vcs_info_msg_2_" ]]; then color=${fg[red]} #unstaged
    elif [[ -n `echo "$st" | grep "^Untracked"` ]]; then color=${fg[blue]} # untracked
    else color=${fg[cyan]}
    fi
    echo "%{$color%}(%{$branch%})%{$reset_color%}" | sed -e s/@/"%F{yellow}@%f%{$color%}"/
}
PROMPT='
%F{yellow}[%~]%f `vcs_echo`
%(?.$.%F{red}$%f) '

設定ファイルなるべく短くしたいのでコンパクトになるようにしました。

ついでに

コマンド打ってエラーが返ったときは$が赤くなります。

f:id:yoshiko_pg:20140402231120p:plain

感想

zshかわいい