为vim语法折叠添加标记



我通常在C中编码,我在我的。vimrc set foldmethod=syntax中工作得很好,因为它可以折叠大括号和注释以及所有内容。

但有时我需要折叠大块的代码,这样他们就不会妨碍我(例如一组相关的函数),我通常用set foldmethod=marker和标记>>><<<来做这件事。

我一直在尝试添加一个新的同步区域,我所得到的最近的东西是:

syn region cFoldMarkers start='>>>' end='<<<' containedin=cComment transparent fold

但是这会造成混乱,因为它在某种程度上与注释匹配。

是否有办法同时实现这两个目标?或者我应该放弃用语法做这些,只是为大括号,注释和我的自定义标记设置标记?

Thanks in advance

好的,在…我花了5个小时尝试用语法折叠,我放弃了,改成了表达式折叠。

我已经创建了一个折叠函数,它或多或少地做了我想要的:
function! CFold()
    let this_line = getline(v:lnum)
    " Matching of braces
    if match(this_line, '}') >= 0
        return 's1'
    elseif match(this_line, '{$') >= 0
        return 'a1'
    " Matching of comments
    elseif match(this_line, '/*') >= 0
        if match(this_line, '*/$') == -1
            return 'a1'
        " Matching custom folding
        elseif match(this_line, '>>>') >= 0
            return 'a1'
        elseif match(this_line, '<<<') >= 0
            return 's1'
        endif
    elseif match(this_line, '*/$') >= 0
        return 's1'
    endif
    return '='
endfunction
setlocal foldmethod=expr
setlocal foldexpr=CFold()

Plugin syntaxMarkerFold添加了此功能。


containedin=cComment表示整个区域(整个折叠)包含在单个注释中;我们只希望标记出现在注释中(两个单独的注释)。
令人惊讶的是,它也匹配不属于任何语法组的标记;这也是我们不希望看到的行为

只留下

syn region cFoldMarkers start='>>>' end='<<<' transparent fold

找到区域的起点并折叠它。但是它在末尾没有那么幸运,所以Vim只是折叠到文件的末尾。

所以我们需要为区域(s*//.{-})的RegExp添加匹配注释,并且由于某些特殊原因,定义matchgroup=Comment

syn region cFoldMarkers matchgroup=Comment start='s*//.{-}>>>' end='s*//.{-}<<<' transparent fold

现在它应该在我们想要的地方折叠了。


当然,还有更多的边缘情况,需要更多的处理。
我们还希望能够使用任何标记和不同的有效注释,而不仅仅是//
更不用说水平标记折叠(例如{{{1)。

看看我的syntaxMarkerFold插件的代码,看看我是如何解决这些问题的

最新更新