vim 中的多种折叠方法

vim 中的多种折叠方法

我使用折叠选项vim相当多,并且通常设置折叠法语法。最近我发现可以添加自定义折叠,这样我就可以把整个块放进去/*{{{*//*}}}*/这对于将源文件的大部分内容分组在一起非常有用。但是要使用该功能,我需要将 foldmethod 设置为 marker,这样我就失去了语法折叠。

在 vim 中可以同时有两种活动的折叠方法吗? set foldmethod=syntax,marker不起作用。

答案1

不,严格来说,Vim 中不可能同时激活多个折叠方法。

如果您愿意学习如何编写语法高亮规则并针对要添加标记折叠模拟的语言破解高亮文件,则可以模拟基于标记的折叠。 这样做有几个缺点:

  1. 当折叠方法设置为“语法”时,使用标记和手动折叠方法创建/删除折叠的命令(“zf”、“zd”等等)将不起作用。

  2. 模拟“强制”折叠级别的标记(例如“ {{{1“/” }}}1“)而不是将折叠级别增加/减少一级(例如“ {{{“/” }}}“)是有问题的;要么您必须完全忽略折叠级别数字,要么冒险干扰(甚至可能破坏)其余基于语法的折叠规则。

我建议,当你发现需要基于标记的折叠时,就完全使用该方法。这可能需要一些额外的时间和精力,但如果你真的需要灵活性,那么这可能是值得的,尤其是考虑到尝试将两者结合起来的困难。

答案2

我也在寻找同样的东西。因为我不想破解语法文件,所以我有一个映射来在折叠方法之间切换。现在我只在语法和标记之间切换:

nmap <Leader>ff :call <SID>ToggleFold()<CR>
function! s:ToggleFold()
    if &foldmethod == 'marker'
        let &l:foldmethod = 'syntax'
    else
        let &l:foldmethod = 'marker'
    endif
    echo 'foldmethod is now ' . &l:foldmethod
endfunction

相关内容