zshのプロンプトにSubversionのブランチ情報を表示

こんにちは、熊谷です。

普段Subversionでバージョン管理を行いながら開発をしているのですが、こっちのプロジェクトはtrunkだったり、あっちはほげほげブランチだったり、はたまたtrunkからほげほげブランチにスイッチしたりして開発をすると今どこにいるのか分からなくなってきて、時折svn infoで確認することがあります。

そんなことで、もっと便利に分かりやすくなる方法はないかなと探していたところ、openbooth | ターミナルをちょっと便利にするスクリプトというブログ記事にこれだ!という内容が書かれていました。早速こちらのスクリプトを使用して、普段使用しているzshのプロンプト部分に表示するよう.zshrcを変更しました。


local GRAY=$'%{\e[0;37m%}'
local LIGHT_GRAY=$'%{\e[0;37m%}'
local WHITE=$'%{\e[1;37m%}'
local LIGHT_BLUE=$'%{\e[1;36m%}'
local YELLOW=$'%{\e[1;33m%}'
local PURPLE=$'%{\e[1;35m%}'
local GREEN=$'%{\e[1;32m%}'
local BLUE=$'%{\e[1;34m%}'
source $HOME/.zsh.d/dirctx
PROMPT=$GRAY'['$YELLOW'${WINDOW:+"$WINDOW'$GRAY':'$BLUE'"}${USER}'$GRAY'@'$BLUE'${HOST}'$GRAY'('$PURPLE'$DIRCTX'$GRAY')] %(!.#.$) '$WHITE

な感じにしてzshを使用すると

こんな感じで表示されるようになりました。

で、このスクリプトの処理をみるとSubversionの場合はtrunkやbranches等々の表示はディレクトリ名をそのまま表示しているだけで、私のようにディレクトリ名で分けていない場合、単純にsubversionと文字列が表示されるだけになってしまいます。しかしそれではあまり意味が無くなってしまうので、svn infoから情報を取得するようにdirectxのスクリプトを書き換えてみました。


--- dirctx.orig 2009-06-01 15:43:13.000000000 +0900
+++ dirctx      2009-06-01 16:16:10.000000000 +0900
@@ -43,20 +43,23 @@
 
     __status=`ls .svn 2>/dev/null 1>/dev/null; echo $?`
     if [ "$__status" = "0" ]; then
-        echo -n 'subversion'
-        case "$PWD" in
+        echo -n 'svn'
+        __svn_status=(`LANG=C svn info|awk '/^URL:/{url = $2} /^Last Changed Rev:/{rev = $4; print url " " rev} '`)
+        url=`echo ${__svn_status[1]}`
+        revision=`echo ${__svn_status[2]}`
+        case "$url" in
             *trunk*)
-                echo -n ': trunk'
+                echo -n ":trunk:$revision"
             ;;
             *branches*)
-                echo -n ': branches'
-                branch=`echo -n $PWD | sed -e 's/.*branches\///' | sed -e 's/\/.*//'`
-                test $branch  & & echo -n "/$branch"
+                echo -n ':branches'
+                branch=`echo -n $url | sed -e 's/.*branches\///' | sed -e 's/\/.*//'`
+                test $branch  & & echo -n "/$branch:$revision"
             ;;
             *tags*)
-                echo -n ': tags'
-                tag=`echo -n $PWD | sed -e 's/.*tags\///' | sed -e 's/\/.*//'`
-                test $tag  & & echo -n "/$tag"
+                echo -n ':tags'
+                tag=`echo -n $url | sed -e 's/.*tags\///' | sed -e 's/\/.*//'`
+                test $tag  & & echo -n "/$tag:$revision"
             ;;
         esac
         return
@@ -81,4 +84,4 @@
 
 DIRCTX=`dirctx $PWD`
 
-export DIRCTX
\ No newline at end of file
+export DIRCTX

このように書き換えると

という感じで表示されます。現在いるディレクトリのブランチ名やリビジョンがプロンプト部分に表示されるようになります。

プロンプトにこれらの情報が表示されるだけでターミナルでの作業がものすごく便利になりました。しかし、プロンプトにこれらの情報を表示するよりはscreenのステータスラインの方がいいのかもしれないと思ったりもしないでもありません。

何はともあれ、Subversionの情報が常時表示されるようになったので良しとします!