vimのfoldメソッドがオートコンプリートの効率に影響を与えることに気づきました。たとえばC-N
、低速で、C-X L
比較的高価なfoldexpr
s を含む中サイズのファイルではひどく遅いです。
オートコンプリートの実行中にfoldexprを参照することの価値がわからないので、これを何らかの方法で無効にして、使用可能なオートコンプリートを取得できるようにします。
助言がありますか?
編集:テストケース
テストケース:プラグインなし。これだけで、これは可能な限り最小の foldexpr関数でなければなりません(呼び出しを数えることを除いて、完全に役に立たない).vimrc
:
let g:c = 0
function! Myfoldexpr()
let g:c = 1 + g:c
return '0'
endfunction
空白のドキュメントからvimを起動します。Vim独自のヘルプファイルの最初の100行をコピーし、オートコンプリート行を実行して、10番目の提案を選択し、foldexprが呼び出された回数を確認します。
:help
y100j:q
P:set foldexpr=Myfoldexpr()
:set fdm=expr
O<C-X><C-L><C-L><C-L><C-L><C-L><C-L><C-L><C-L><C-L><C-L><Esc>
:echo g:c
2088
これは、100行のファイルで、比較的短い行であり、foldexprは2088回呼び出されました(ただし、最初にfoldexprを設定するときにこれらの100が実行されます)。効率的なfoldexprは明らかに優れていますが、プログラマーは多くのfoldexprに質問するため、それらは必ずしも自明ではなく、実行時間が数千倍になると、オートコンプリートまたはインデントのどちらかを選択して生産性を高めることができます。貪欲/怠惰であること両方を使用できるようにしたいと思います!かなりよく確立されたいくつかのfoldexprベースの折りたたみプラグインを書き直そうとする以外に(phpの折りたたみを書き直してみましたが、何日か実行可能な状態に最適化しようとしたので、phpのfoldexprをあきらめました)、おそらく使用する方法がありますfdm=manual
オートコンプリートなどの前にマッピングする必要がありますか?
iHello<Esc>
で、g:c
変数もに増加し20
、実行oWorld<Esc>
するとそれが実行されます38
...したがって、評価の数はfoldexpr
補完の使用とは無関係のようです... 最小限のvimrcでVimをロードしてみてくださいファイルを作成し、問題が引き続き発生するかどうかを確認します。別の設定またはプラグインである可能性があります
p
)実行する必要があると思います。これは、挿入候補の文字ごとに行うことだと思います。