我目前正在开发一个 Vim 插件,用于管理 list 。
我目前在语法文件中使用“:setlocal Foldmethod=indent”来处理每个 list 文档中的所有折叠。不过,我想创建一个更灵活的折叠函数,并且不会依赖线的缩进来确定是否折叠。
这是一个示例 list :
+ 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
我不知道如何处理循环和折叠。有什么建议吗?
更新
嗯,karategeek6 的解决方案在某种程度上有效,但我没有提到我的插件也可以切换 list 项目。
示例:
+ Parent
× Child - Toggled
* Child - Standard
我可能是错的,但我不认为foldexpr能够处理开头带有*和×的行。
我已经尝试过:
set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^[*|×]].*','',''))
但这似乎也不起作用。
最佳答案
这听起来像是您希望它通过表达式折叠的内容。根据user manual ,在fold by expression中,您使用表达式来设置每行的折叠级别。用户手册给出了一个示例,我认为可以根据您的需求进行调整。
:set foldmethod=expr
:set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^*].*','',''))
您可以在用户手册中阅读有关该示例的更多信息,但简而言之,它将设置折叠级别等于前导“*”的数量,而不管空白。
希望这正是您所寻找的,或者可以为您指明正确的方向。在按表达式折叠时要记住的关键方面是您要决定每行的折叠级别,而不是要折叠哪些行。
关于Vim 脚本 : Count lines that match expression, 并折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6233722/