プロンプトにブランチ名を表示させよう
今のbashプロンプト
僕はzshを使おうと思いつつzshのdotファイルがどれに何を書けばいいのかわかりません状態が続いてずっとbashを使っています。いまのプロンプトはどこでも同じ色で表示されるように次のようなものを使っています。
PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \[\033[0;32m\]\w\[\033[0;37m\ ]]\n\$ "
gitのブランチ名の取得
MacPortsでgitをインストールしていて、bash_completionを入れてなかった人は入れ直します。
$ sudo port install git-core +bash_completion
すると/opt/local/etc/bash-completion.d/gitが出来て、ここに補完用の設定が書かれています。Linuxなどで設定する場合には、$git_root/contrib/completion/git-completion.bashが同様のものです。
これを.bashrcで読み込むように設定しておきます。
export BASH_COMPLETION_DIR=/opt/local/etc/bash_completion.d . $BASH_COMPLETION_DIR/git
こうしておくと $(__git_ps1 %s) でブランチ名を取得することが出来ます。
$ echo $(__git_ps1 %s) master
mercurialのブランチ名の取得
mercurialの場合は自分でちゃちゃっと書いてしまいます。(ほんとはgitでもできるんだけど)hg branchでブランチ名を取得できるので、次のようにしてブランチ名を取得することにします。
hg_branch() { hg branch 2> /dev/null | awk '{print "(hg:" $1 ")"}' }
これを書いておくと次のようになります。
$ hg_branch (hg:default)
プロンプトの変更
最終的にはこのようになりました。
# prompt command hg_branch() { hg branch 2> /dev/null | awk '{print "(hg:" $1 ")"}' } git_branch() { __git_ps1 '(git:%s)' } # setting for prompt if [ -f $BASH_COMPLETION_DIR/git ]; then source $BASH_COMPLETION_DIR/git echo "git-completion enabled..." PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \$(git_branch)\$(hg_branch) \[\033[0;32m\]\w\[\033[0;37m\]]\n\$ " else PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \[\033[0;32m\]\w\[\033[0;37m\]]\n\$ " fi export PS1
bash補完を使う
さきほどgitに関してはbash_completion入れましたが、mercurialでも入れてしまいます。
$ sudo port install mercurial +bash_completion
.bashrcで、gitの時と同様に読み込んでおきます。
. $BASH_COMPLETION_DIR/mercurial
これで快適補完生活。
追記(2012/10/06)
@shibukawa から「gitのバージョンが上がって補完用のスクリプトのPATHが変わったよ」と教えてもらいました。
git-core 1.7.12だとこうすればよいようです。
hg_branch() { hg branch 2> /dev/null | awk '{print "(hg:" $1 ")"}' } git_branch() { __git_ps1 '(git:%s)' } # setting for prompt if [ -f /opt/local/share/git-core/git-prompt.sh ]; then . /opt/local/share/git-core/git-prompt.sh echo "git-completion enabled..." PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \$(git_branch)\$(hg_branch) \[\033[0;32m\]\w\[\033[0;37m\]]\n\$ " else PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \[\033[0;32m\]\w\[\033[0;37m\]]\n\$ " fi
git-prompt.shを呼ぶように変更しています。