zsh の vcs_info で Bazaar を使うときは use-simple を指定すると速くなる
今回のきっかけ
id:tomoya さんが最近 Bazaar(bzr)を使い始めたようだ。(Emacs のリポジトリが Bazaar に移行したので Bazaar をインストールする。)
で、「zsh の vcs_info を使ってリビジョン情報をプロンプトに表示してるけど、Bazaar の場合死ぬほど重い」って聞いた。
そりゃ困るだろうってことで何とかしてみた。
結論から言うと以下の行を足せば OK。ほぼ一瞬で表示されるようになった。
zstyle ':vcs_info:bzr:*' use-simple true
もうちょっと詳しい解説は以下。
vcs_info の復習
とその前に、zsh の vcs_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|)"