短い日本語でタイトルをうまく表現できなかったのですが、以下の理由で、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>