Vim 脚本 : Count lines that match expression, 并折叠

标签 vim plugins scripting loops folding

我目前正在开发一个 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/

相关文章:

javascript - WP 插件 - SEO Smart Links 弄乱了我的插件

javascript - jquery-ias 插件不适用于我的网站,加载更多项目不起作用

bash - 选项卡扩展和 "./"bash shell

Ruby 版本语法

javascript - Adobe Illustrator JavaScript - 循环将数据集应用于每个打开的文档

vim - 删除 vim 编辑器中行长度超过 80 个字符的警告

macos - 为什么我在 OS X 上使用 vim 时没有 crontab 条目?

vim、病原体和 ftplugin 文件的加载顺序

java - JoinMessages 类型必须实现继承的抽象方法 CommandExecutor.onCommand(CommandSender, Command, String, String[])

python - vim-flake8 不工作