Я пытаюсь создать простой и быстрый метод складывания для больших файлов уценки. Я использую метод fold-expr
в vim. Например, если я хочу начать сворачивать записи уценки H1
и H2
, мой код 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 значительно замедляется. Это неудивительно и фактически указано в справке fold-expr в vim. Это связано с тем, что знак =
говорит vim сканировать файл в обратном направлении, пока не будет найдена первая строка с явно определенным уровнем сгиба; это может быть тысячи строк.
Я попытался заменить последнюю строку на
else
" set foldlevel to foldlevel of previous line
return foldlevel(v:lnum-1)
endif
Но это не работает, как ожидалось. Кто-нибудь знает, как это исправить? Понятно, что я не понимаю, как работает функция foldlevel или как реализован алгоритм складывания в vim.
return "="
. Он вызывается очень часто и требует довольно много времени для запуска. Кажется, я не могу найти альтернативу, работающую сreturn foldlevel(v:lnum-1)
. Интересно, есть ли способ обойти это. 10.12.2014