#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 для определенных файлов.