zsh の vcs_info で Bazaar を使うときは use-simple を指定すると速くなる

今回のきっかけ

id:tomoya さんが最近 Bazaar(bzr)を使い始めたようだ。(Emacs のリポジトリが Bazaar に移行したので Bazaar をインストールする。)

で、「zshvcs_info を使ってリビジョン情報をプロンプトに表示してるけど、Bazaar の場合死ぬほど重い」って聞いた。

そりゃ困るだろうってことで何とかしてみた。

結論から言うと以下の行を足せば OK。ほぼ一瞬で表示されるようになった。

zstyle ':vcs_info:bzr:*' use-simple true

もうちょっと詳しい解説は以下。

vcs_info の復習

とその前に、zshvcs_info って何なのか軽く復習。

vcs_info ってのは、バージョン管理システムの情報をプロンプトなどに表示するための zsh の関数。いろんなバージョン管理システムに対応していて、もちろん Bazaar(bzr)でも使える。

詳しくは以下を参照。
Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法

なんで遅いか

せっかくなので僕も Bazaar をインストールして、emacsリポジトリをチェックアウトしてみた。

で、試してみると確かに遅い。僕の環境では vcs_info のプロンプト表示にだいたい20秒ぐらいかかった。ls 打つたびにそれぐらい待たされるわけで、はっきり言ってやってられない。

どうやらリビジョン番号なんかを取得するために、内部で bzr version-info を呼び出しているようだ。で、これがネットワークを経由していて非常に遅い。

なんとかしようってことでいろいろ試して、解決方法を2つ見つけた。ちなみに、zsh 4.3.9 で動作確認。

解決方法その1

1つ目の解決策は、Bazaar に対して vcs_info を無効化するという方法。
こんな感じで .zshrc に書いておけば OK。

# bzr に対しては vcs_info を無効にする
zstyle ':vcs_info:*' disable bzr

または、使用するシステムが決まってるなら有効にするものだけを指定することも出来る。

# bzr は遅いので含めない
zstyle ':vcs_info:*' enable git svn hg

非常に消極的な方法。

解決方法その2

こっちがもうちょっとましな解決方法。こんな感じで use-simple ってのを指定する。

zstyle ':vcs_info:bzr:*' use-simple true

use-simple ってのはバージョン情報の取得方法を指定するパラメータで、デフォルトは false。false の方が bzr version-info を使っていて正確なんだけど、その代わり激しく重い。true に設定するとシンプルな方法になって、若干正確性は落ちるけど速くなる。

というわけで use-simple を true にしてみるとほぼ一瞬で表示されるようになった。いい感じ。

ちなみに use-simple の設定は bzr のみで有効。やっぱりみんな bzr に困ってたんだな。

まとめ

結論としては2つめの方法を採用するといいと思う。

僕の zshrc の vcs_info のところはこんな感じに変わった。今回変更、追加した行は末尾に # new ってつけておいたので参考にしてね。

autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git svn hg bzr           # new
zstyle ':vcs_info:*' formats '(%s)-[%b]'
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]'
zstyle ':vcs_info:(svn|bzr):*' branchformat '%b:r%r' # new
zstyle ':vcs_info:bzr:*' use-simple true             # new
precmd () {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
}
RPROMPT="%1(v|%F{green}%1v%f|)"