Hatak::Techlog

Verba volant, scripta manent.

Vcs_info でプロンプトにリポジトリ名を表示

最近特にターミナルでコードを書くことが増えてきたため、プロンプトでブランチ名であったりそのほかの情報も適宜だせるようにしたいなと設定を調べたり試したりしてみました。

以前までは、bash_completion を利用して表示するということをしていました。.bashrc の例ですが、こんな感じです。

1
2
3
4
# custom prompt for .bashrc
if [ -r "/etc/bash_completion.d/git" ];
    then PS1="[u@h w]$(__git_ps1 "(e[0;32m%se[0m)")$ "
fi

これはこれで良いのですが、git でしか利用できません。メインで利用する VCS は git なので問題ありませんが、それ以外の VCS で管理されたコードを読んだりする機会も多々あります。 調べてみたところ、zsh に vcs_info という関数があることを知りました。そこで、これを使ってプロンプトを少し派手にしてみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# colors
autoload colors;
colors

# vcs_info
autoload -Uz vcs_info zstyle ':vcs_info:*'
formats '%f(%F{cyan}%s%f:%F{green}%b%f)'
zstyle ':vcs_info:*'
actionformats '%f(%F{cyan}%s%f:%F{green}%b%f|%F{red}%a%f)'
zstyle ':vcs_info:(svn|bzr):*'
branchformat '%F{green}%b%f:%F{yellow}r%r%f'
zstyle ":vcs_info:git:*"
check-for-changes true zstyle ":vcs_info:git:*"
stagedstr '+'
zstyle ":vcs_info:git:*"
unstagedstr '-'
zstyle ':vcs_info:git:*'
formats '%f(%F{green}%b%f%F{green}%c%F{red}%u%f)'
zstyle ':vcs_info:git:*'
actionformats '%f(%F{green}%b%f|%F{red}%a%f%F{green}%c%F{red}%u%f)'

function _precmd_vcs_info () {
    psvar=()
    LANG=en_US.UTF-8
    vcs_info
    psvar[1]="$vcs_info_msg_0_"
}

# add-zsh-hook autoload -Uz add-zsh-hook add-zsh-hook precmd _precmd_vcs_info
# prompt setopt prompt_subst local PROMCOL=$'%F{$[1+RANDOM%6]}'
PROMPT='%(?.%F{green}^-^%f.%F{red}@_@%f) '$PROMCOL'%l${WINDOW:+":$WINDOW"}:%h%F{green}$psvar[1]%f%(!.#.$)'
  • 2行目 : 色指定を簡単に行えるようにするため、colors をロードします
  • 5行目 : 今回のテーマである vcs_info をロードします
  • 6-7行目 : 対応する VCS 共通の表示フォーマットを定義します : formats: 通常表示されるフォーマット : actionformats: コンフリクト時などに表示されるフォーマット
  • 8行目 : svn と bzr の時にはリビジョン番号表示をしたいので、フォーマットを定義します
  • 9-13行目 : git の場合の各種設定や専用フォーマットの定義を行っています : check-for-changes: ローカルでの変更があるかチェックをします : staged: "git status" 実行時の "Changes to be committed" があるときには "+" を表示します : unstaged: "git status" 実行時の "Changes not staged for commit" があるときには "-" を表示します
  • 27行目 : プロンプトの表示色をランダムでカラーにします
  • 28行目 : 顔文字はコマンド成否で変化します(ネタ元

はじめは %1v として $psvar[1] の値をとっていたのですが、カラースキーマがうまくいかないため配列の要素を直指定する形にしています。vcs 管理下にないディレクトリでは $psvar[1] の値は何も入らないため、デザインも崩れません。

ターミナルの例

参考