大きなマークダウン ファイル用のシンプルで高速な折りたたみ方法を作成しようとしています。私はfold-expr
vimでメソッドを使用しています。たとえば、folds onH1
とH2
markdown エントリを開始したい場合、vimscript コードは次のようになります。
function! MarkdownLevel()
if getline(v:lnum) =~ '^# '
" begin a fold of level one here
return ">1"
elseif getline(v:lnum) =~ '^## '
" begin a fold of level two
return ">2"
else
return "="
endif
endfunction
これは完全に機能し、ネストされた折り目を取得します。ただし、大きなマークダウン ファイルがあると、vim の速度が大幅に低下します。これは当然のことであり、実際、vim の fold-expr ヘルプに示されています。これは、明示的に定義されたfoldlevel を持つ最初の行が見つかる=
まで、記号が vim にファイル内を逆方向にスキャンするように指示するためです。これは数千行離れている可能性があります。
最後の行を次のように置き換えようとしました
else
" set foldlevel to foldlevel of previous line
return foldlevel(v:lnum-1)
endif
しかし、これは期待どおりには機能しません。これを修正する方法を知っている人はいますか?foldlevel 関数がどのように機能するか、または vim の折りたたみアルゴリズムがどのように実装されるかを理解していないことは明らかです。