2

大きなマークダウン ファイル用のシンプルで高速な折りたたみ方法を作成しようとしています。私はfold-exprvimでメソッドを使用しています。たとえば、folds onH1H2markdown エントリを開始したい場合、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 の折りたたみアルゴリズムがどのように実装されるかを理解していないことは明らかです。

4

3 に答える 3

1

Drew Nelstrom のvim-markdown-foldingプラグインの使用を考えたことはありますか?

Vimcast のエピソード: Vimscript のパフォーマンスのプロファイリングも参照してください。このエピソードでは、折り畳みマークダウンについて実際に話しています。

慎重な考え

私はあなたのコードをプロファイリングしていないので (実際にコードをプロファイリングする必要があります)、確実なことは言えませんが、再描画されるたびにすべての行でフォールド式が呼び出されるため、Vim に非常に負担がかかる可能性があります。いくつかの推測:

  • のような相対的な折り畳み式を使用=すると、前の行を計算する必要があるため、これが問題になる可能性があることが想像できます。可能であれば、他の線を計算せずに正確な深さを試してみてください。
  • getline()関数で不必要に2回使用しています
  • 一部のファイルは問題を引き起こし、この事実を受け入れて折り畳みを無効にしますzi
于 2014-12-09T18:06:37.797 に答える
0

Vim は式ごとに多くの式を計算する必要があるため、これは当然のことです。これは、以下のヘルプにも記載されています:h fold-expr

Note: Since the expression has to be evaluated for every line,
this fold method can be very slow!

Try to avoid the "=", "a" and "s" return values, since Vim often
has to search backwards for a line for which the fold level is
defined.  This can be slow.
于 2014-12-09T19:36:41.597 に答える