我通常在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插件的代码,看看我是如何解决这些问题的