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