シェルのプロンプトにリポジトリ情報を表示するようにしてみたよ

第27回 長岡開発者勉強会に行ってきたよ - 四角革命前夜での@neko_gata_sさんのGitリポジトリのブランチ名が表示されるプロンプトがカッコイイものだったので、自分も真似してみることに。
zshだと最初からそういう機能があるみたいだけど、bashはそうではないのでいろいろ調べてみることに。
環境:MacOS 10.7.4

お手軽にスクリプト

最初に見つけたのがこちら。bashにgitとmercurialのブランチ名を表示する - アジャイルSEを目指すブログ
これを真似て書いたスクリプトが以下。

hg_branch() {
  echo -n '' "(hg:`hg branch 2>/dev/null`)"
}

git_branch() {
  git branch 2>/dev/null | awk '/^\*/ {print " " "(git:" $2 ")"}'
}

# /current/dir (hg/git:branchname)
# username@hostname$ _
PS1=''
PS1=$PS1'\[\033[01;32m\]\w\[\033[00m\]'
PS1=$PS1'\[\033[01;36m\]$(hg_branch)$(git_branch)\[\033[00m\]\n'
PS1=$PS1'\u@\h\$ '
export PS1

どのディレクトリに行っても若干もたつきがあって遅い……
多分Mercurialの遅さなんだと思う。

hg_branch() {
  [ -d '.hg' ] && echo -n '' "(hg:`hg branch 2>/dev/null`)"
}

git_branch() {
  [ -d '.git' ] && git branch 2>/dev/null | awk '/^\*/ {print " " "(git:" $2 ")"}'
}

苦し紛れにこんなことしてみたら、リポジトリ以外のディレクトリでは早くなったけど、リポジトリのルートでないとリポジトリ情報が表示されないという悲しいことに。
まあディレクトリ見てるんだから当たり前なんだけど、それに気がつかないくらい眠かったみたい。

vcpromptを教えてもらう

とのことでvcpromptを探してみることに。
これ、同じ名前の別実装のものがいくつか有るみたいで、

などがあるみたい。他にもフォークしたやつがあったりとか。


お手軽Python版にしようかと思ったけど、Mercurialの引っかかりが気になって代替を探してたんだし、

とのことなのでC言語版を使ってみることに。

コンパイル・インストール

Mercurialリポジトリからクローン・コンパイル・インストール!

$ mkdir -p $HOME/Binary/vcprompt
$ hg clone https://bitbucket.org/gward/vcprompt
$ cd vcprompt
$ make clean && make && make install PREFIX=$HOME/Binary/vcprompt

で、後は以下を.bashrcに書きます。

# vcprompt {{{
vcprompt=$HOME/Binary/vcprompt
if [ -d "$vcprompt" ]
then
  export PATH=$vcprompt/bin:$PATH
fi # }}}

# prompt {{{
vcprompt_branch() {
  which vcprompt >/dev/null 2>&1 && vcprompt -f ' (%n:%b)'
}

# /current/dir (hg/git/svn:branchname)
# username@hostname$ _
PS1=''
PS1=$PS1'\[\033[01;32m\]\w\[\033[00m\]'
PS1=$PS1'\[\033[01;36m\]$(vcprompt_branch)\[\033[00m\]\n'
PS1=$PS1'\u@\h\$ '
export PS1 # }}}

ここで大事なのは

vcprompt_branch() {
  which vcprompt >/dev/null 2>&1 && vcprompt -f ' (%n:%b)'
}

PS1=$PS1'\[\033[01;36m\]$(vcprompt_branch)\[\033[00m\]\n'

で、vcpromptが入ってるときだけ使うようにして、$(vcprompt_branch)で関数を呼んでます。
あとプロンプトの色をlight-cyanに。ちょっとだけ目を引く感じに。


で、見た目はこんな感じ。


応答速度も早いし、SVNリポジトリにも対応してるので良いかも。