短い日本語でタイトルをうまく表現できなかったのですが、以下の理由で、foldexpr
を評価するだけの関数(もしくはコマンド)を作り、手動でfoldexpr
を評価させたかったのです。
- ずっと
foldmethod
がexpr
のままだと、行数の多いファイルを編集時にものすごく重い! autocmd
で動的にうまくfoldmethod
を切り替えられたらよいのですが、ちょうど良い設定が実現できない。:setlocal foldmethod=expr
を一々タイプするのもめんどい。
で、以下が実現できるコードです。わかってしまえば簡単だったのですが、redraw
を行うとfoldexpr
が評価され、redraw
を行わないとfoldexpr
が評価されませんでした。
function!s:eval_foldexpr()let saved_foldmethod =&foldmethodlet saved_foldexpr =&foldexprtrysetlocalfoldmethod=expr
setlocalfoldexpr=getline(v:lnum)[0]==\"\\t\"redrawfinallylet&l:foldmethod= saved_foldmethod
let&l:foldexpr= saved_foldexpr
endtryendfunction" 適当にキーマッピングする。nnoremap<leader>f :<C-u>call<sid>eval_foldexpr()<cr>