git-gutter.elが重く感じられたときの対処

git-gutter.elがもっさりするという意見をいただいたので、調べてみました。


問題点

window-configuration-change-hookによる更新関数の呼び出し回数が多いためと
推測されます。この関数は、windowの分割・削除、表示するバッファを変更した
ときに呼ばれるのですが、windowの数だけ呼ばれてしまいます。たくさん分割
しているとそれだけ更新関数が呼ばれます。この挙動については linum-modeでも
問題とされており、未だに修正に至っていません。本体にバンドルされる linum-modeで
うまくいっていないので、現状この問題を容易に解決する方法はないと思われます。


一応いろいろ実装してみたのですが、window-configuration-change-hook
から関数が呼ばれるとき buffer local変数がうまく扱えないことがあり、
内部状態を保持し、不要な呼び出しの削除等の実現がうまくいかず難儀
している状況です。


非同期実行については、いくらか待たされるのは改善されるかもしれないですが、
根本的な問題を解決していないので、今回はその対応を見送りとしました。

対応方法

いい解決方法が思い浮かばなかったので、更新関数を呼ぶ関数を hookを
ユーザで制御できるようにしました。


デフォルトでは以下の 3つの hookに更新関数が登録されます

  • after-save-hook
  • after-revert-hook
  • window-configuration-change-hook


window-configuration-change-hookを除去する場合は以下のように
します。(今まで更新されていたけど、更新されないって場合は
ファイルを保存した上で手動で M-x git-gutterを実行してください)

(setq git-gutter:update-hooks '(after-save-hook after-revert-hook))


自由に hookが変更できるようになったので、自分で別の hookを登録する
ことも可能となっています。file操作系、リポジトリ操作系の hookが
候補として考えられるでしょうか。


また window-configuration-change-hookを除去し、run-with-idle-timer等を
組み合わせて、定期的に更新するということも考えられます。


根本的に解決はできていませんが、その辺の自由度は上げられたのではないかと
思います。

おわりに

有効手段をご存知の方がいましたら、教えてください。
pull requestであればなお喜ばしいです。


その他問題点、不満等こざいましたら、こちらまでお願いします。