git-gutter.elがもっさりするという意見をいただいたので、調べてみました。
いいんですけど全体的にモッサリしちゃうんですよねぇ。。 RT @naoya_ito: 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等を
組み合わせて、定期的に更新するということも考えられます。
根本的に解決はできていませんが、その辺の自由度は上げられたのではないかと
思います。