zshでmercurialのactive branchesを補完する

この記事は、Mercurial Advent Calendar 2011 - [PARTAKE]の3日目の記事です.

みなさんいかがおすごしですか.
ゲームの中でもチーフに冷たくされてしょんぼりしているyuitowestです.
f:id:yuitowest:20111203183719j:image

Mercurialを使っているとbranchをガンガン作ってガンガン切り替えます.
毎回 hg branches等でbranch名を確認して切り替えるのは面倒です.

そこでzshの補完機能を使って hg update のあとにactive branchを補完してくれるようにします.
まずはzshの補完関数を置くディレクトリを作ります.

$ > mkdir -p $HOME/.zsh/functions

pathを通します.
.zshrcに以下を記述します.

fpath=($HOME/.zsh/functions $fpath) 

zsh補完関数を設置します.

touch $HOME/.zsh/functions/_hg
vi $HOME/.zsh/functions/_hg

補完関数はこちら
Zsh completion script for mercurial — Gist
/path/to/zsh/4.3.11/functions/_hgを少々修正したものです.

--- a/_hg
+++ b/_hg
@@ -173,6 +173,17 @@
   (( $#tags )) && _describe -t tags 'tags' tags
 }
 
+_hg_branches() {
+  typeset -a branches
+  local branch rev
+
+  _hg_cmd branches -a |awk '{print $1}' 2> /dev/null | while read branch
+  do
+    branches+=(${branch/ #    [0-9]#:*})
+  done
+  (( $#branches )) && _describe -t branches 'branches' branches
+}
+
 # likely merge candidates
 _hg_mergerevs() {
   typeset -a heads
@@ -759,7 +770,7 @@
   _arguments -s -w : $_hg_global_opts \
   '(--clean -C)'{-C,--clean}'[overwrite locally modified files]' \
   '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
-  ':revision:_hg_tags'
+  ':revision:_hg_branches'
 }

これでactive branch名が補完されます.
f:id:yuitowest:20111203191330p:image

やりましたね.