В настоящее время я разрабатываю плагин для Vim для управления контрольными списками.
В настоящее время я использую ": setlocal foldmethod = indent" в файле синтаксиса для обработки всего свертывания в каждом документе контрольного списка. Однако я хотел бы создать более гибкую функцию свертывания, которая не будет полагаться на отступ строки для определения того, будет ли она сложена.
Вот пример контрольного списка:
+ Parent
* Child
* Child
* Child
Когда пользователь нажимает <leader>
vv на строке «+ Parent», он складывает линии под ним, потому что они имеют отступ на один уровень. Проблема в том, что метод сгиба остаётся вокруг других буферов и складывает линии, которые не нужно складывать.
Вот как я думал об этом до сих пор:
function! FoldLines()
let l:line = getline(line(".") + 1)
" If next line is a child
if match(l:line, '^\s*\*') >= 0
" Loop until blank line is found, and store line numbers in a list
endif
" Select lines from list and fold
endfunction
Я не знаю, как обращаться с петлей и складыванием. Есть предложения?
UPDATE
Что ж, решение karategeek6 работает в некоторой степени, но я не упомянул, что мой плагин также переключает элементы контрольного списка.
* * Пример тысяча двадцать-один: * * 1 022
+ Parent
× Child - Toggled
* Child - Standard
Я могу ошибаться, но я не думаю, что foldexpr сможет обрабатывать строки как *, так и × в начале.
Я пробовал:
set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^[*|×]].*','',''))
но это тоже не работает.