読者です 読者をやめる 読者になる 読者になる

git-gutter.elの高速化検討

emacs git-gutter

git-gutter.elを導入すると Emacsの動作がもっさりしてしまう問題が
あります。機能を導入するわけなので、何らかのコストがあっても
仕方ないとは思いますが、度を越しています。

重くなる原因

原因は window-configuration-change-hookでの差分情報の更新が
多すぎるためです。この hookは bufferの内容変更や Windowの構成を
変えたときに runされます。その 2つだけでいいところなのですが、
minibufferに移動したときにも runされます。また minibufferから
戻ってきたときも runされます。フォーカスされているバッファだけ
ならまだいいですが、恐ろしいことに frameにある windowに
表示されるバッファすべてについて runされます。なので M-xとする
だけで (Window数 × 2回)の更新関数が呼ばれることになります。


これでは重くなって当然です。

解決策

window-configuration-change-hookからの差分情報更新関数の
呼び出しに最低間隔時間を設けました。デフォルトでは 1秒です。
(マシンが遅くてそれでは効果がないというのであれば、もう少し
遅くすると良いでしょう。)
最低間隔時間以内に再度更新関数が実行された場合はすぐに抜けます。
(window-configuration-change-hookはどういうわけか buffer-local変数が
うまく読み取れないなどの問題があり、内部状態を見つつうまく制御する
という方式が取れませんでした。)

ソース

以下のソースに上記の解決策が実装されています。
利用していただき感想を聞かせていただけると助かります。
(自分でしばらく使ってみて、前と同じように使え、いくらか
軽くなったような気はしますが、気のせいかもしれないので)


https://github.com/syohex/emacs-git-gutter/blob/improve_slow/git-gutter.el


よろしくお願いします。