Как написать foldexpr для Vim, который будет использовать структуру комментариев?

#vim #folding

#vim #сворачивание

Вопрос:

Возможно ли создать a foldexpr , который обнаружил бы следующие совпадения nn"s[A-Z][A-Z].*n как начало для сгибов первого уровня, а эти совпадения n"s[A-Z][a-z].*n — как начало для сгибов второго уровня? Естественно, ближайшее возможное nnn обозначило бы конец сгиба первого уровня, а затем nn закрыло бы сгиб второго уровня.

Или я что-то упускаю?

(Я, конечно, знаю о {{{ маркерах, мне просто кажется неправильным добавлять дополнительные маркеры в файл …)

Комментарии:

1. Короткий ответ: да. Что вы пробовали? Что вызывает у вас трудности?

2. Ну … это просто все те set foldexpr=getline(v:lnum)=~'^"s[A-Z][A-Z].*#' и подобные попытки, которые, похоже, не работают. И, таким образом, я немного потерялся :).

Ответ №1:

Вы не сможете сделать это (по крайней мере, нелегко или понятно) в однострочном. Вы захотите написать функцию.

Ваша функция не сможет использовать один getline() плюс сравнение регулярных выражений, потому что getline() возвращает только одну строку, а вы хотите включить несколько строк в свои начальные / конечные строки. Однако вы можете использовать несколько вызовов getline() и сравнивать каждую строку отдельно.

Чтобы включить запуск новых складок на том же уровне, что и существующая в настоящее время складка, вам нужно будет возвращать строки «> 1» или «> 2». Для завершения сворачивания, вероятно, проще всего просто установить явный уровень (использование строк «<2» и т. Д. Иногда Действует неожиданно для меня). Смотрите :help fold-expr возможные возвращаемые значения. Может быть полезно знать уровень складывания последней строки в вашей функции. Для этого используйте функцию foldlevel() .

Вот пример, который, я думаю, делает то, что вы просите, хотя вам может потребоваться очистить его, если на самом деле это не то, что вы хотите. Загрузите скрипт, создайте его, и он сможет использовать себя в качестве тестовых данных:

 fun! FoldSomething(lnum)
  let line1=getline(a:lnum)
  let line2=getline(a:lnum 1)
  if line1=~'^


Комментарии:

1. Еще один вопрос: есть ли какое-нибудь место, куда я мог бы поместить его в $VIMHOME? Может быть что-то вроде ~/.vim/after/ftplugin ? Что бы вы предложили?

2. Это зависит от того, когда вы хотите запустить это сворачивание. ~/.vim/after/ftplugin было бы уместно, если вы хотите, чтобы это было для всех файлов данного типа (я предполагаю, что это Vim-код, поэтому он будет храниться в файле с именем vim.vim). Если вам это нужно только для определенных файлов, вы можете либо создать этот файл как скрипт в autocmd для определенных файлов, либо определить функцию в вашем .vimrc и установить foldexpr и метод в autocmds для определенных файлов.

if line2=~#'^"s[A-Z][A-Z]'
return ">1"
elseif line2=~'^

Комментарии:

1. Еще один вопрос: есть ли какое-нибудь место, куда я мог бы поместить его в $VIMHOME? Может быть что-то вроде ~/.vim/after/ftplugin ? Что бы вы предложили?

2. Это зависит от того, когда вы хотите запустить это сворачивание. ~/.vim/after/ftplugin было бы уместно, если вы хотите, чтобы это было для всех файлов данного типа (я предполагаю, что это Vim-код, поэтому он будет храниться в файле с именем vim.vim). Если вам это нужно только для определенных файлов, вы можете либо создать этот файл как скрипт в autocmd для определенных файлов, либо определить функцию в вашем .vimrc и установить foldexpr и метод в autocmds для определенных файлов.

return 0
elseif foldlevel(a:lnum-1)==2
return 1
endif
elseif line1=~#'^"s[A-Z][a-z]'
return ">2"
endif
return "="
endfun
set foldexpr=FoldSomething(v:lnum)
set foldmethod=expr
set foldcolumn=3
finish

" AA level 1 fold
" This is a level 2 fold
Here is some stuff under the fold.
It should be part of the level 2.

This isn't in the level 2.
I guess that makes it just part of the level 1.

" This is another
" level 2 fold.
" Watch out!
" This is 2 level 2 folds.

" BB another level 1 fold
" starts here.
"

This line shouldn't be folded at all.

That's because there were so many empty lines before.

Комментарии:

1. Еще один вопрос: есть ли какое-нибудь место, куда я мог бы поместить его в $VIMHOME? Может быть что-то вроде ~/.vim/after/ftplugin ? Что бы вы предложили?

2. Это зависит от того, когда вы хотите запустить это сворачивание. ~/.vim/after/ftplugin было бы уместно, если вы хотите, чтобы это было для всех файлов данного типа (я предполагаю, что это Vim-код, поэтому он будет храниться в файле с именем vim.vim). Если вам это нужно только для определенных файлов, вы можете либо создать этот файл как скрипт в autocmd для определенных файлов, либо определить функцию в вашем .vimrc и установить foldexpr и метод в autocmds для определенных файлов.