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

foldmethod=expr が重い場合の対処法

vim

この前vim_fold.vim 作ったんだけど、これが結構重い。
foldmethod=expr ではその性質上折り畳みレベルを計算するために該当関数が全行に対して呼ばれる。行数が多ければ当然重くなる。呼び出されるタイミングについては help に明記されていないのだけれど、どうやらテキストが変更されるたびに呼ばれているっぽい。つまり1文字入力する度にバッファの行数分関数が呼ばれる。まままじか!? こりゃたまらんぞ
プラグイン側である程度は最適化できるかもしれないけれどたかが知れてるし、何よりこの程度で重いのでは他の同タイプのプラグインでも同じ問題が起きるだろう。
と言うわけで、対処法の一例を紹介することにする。

この設定で Insert mode に入った際に一時的に foldmethod=manual に変更し、Normal mode に戻った際に再び foldmethod=expr に戻している。これで入力中に重くなるのは回避できるはずだ。
ちなみに foldmethod=manual に戻しても foldmethod=expr の時に生成された折り畳みは残っているようなので、必要な時だけ foldmethod=expr にして計算させるって設定も可能だと思う。どうしても重い場合はそれもアリかも。