如何在Vim中折叠C++风格的注释?

4
在Vim中,语法折叠使得为区域创建折叠变得很容易,其开始和结束可以通过正则表达式来定义:

syn region myRegion start="#region" end="#endregion" transparent keepend extend fold

然而,我不确定如何使用语法折叠来定义C++风格注释的折叠,即以 "//" 开头的一组行。


为什么需要折叠以“//”开头的注释?这些是单行注释,应该简洁明了,不需要折叠。你只需要折叠以“/*”开头,“*/”结尾的注释块,这应该很容易实现。根据你的帖子,以下内容应该有效:syn region CommentBlock start="/" end="/" transparent keepend extend fold - schmrz
许多编码标准使用“//”进行块注释。MSDN全面使用它们。此外,还有其他一些相似的语法,例如“#include”和“using”声明,也可以折叠起来。 - Don Reba
2个回答

8

我想我找到了一个解决方案:

:syn match comment "\v(^\s*//.*\n)+" fold

这是一个多行匹配,它可以折叠以空格和双斜杠开头的连续行。开头的"\v"标签将模式标记为“非常魔法”以简化代码。看起来是有效的。


0

要折叠多行注释块,使用foldmethod=indent,你必须使用表达式和重新编码缩进折叠。在你的vimrc中尝试一下这个。

set foldmethod=expr
set foldexpr=FoldMethod(v:lnum)

function! FoldMethod(lnum)
  "get string of current line
  let crLine=getline(a:lnum)

  " check if empty line 
  if empty(crLine) "Empty line or end comment 
    return -1 " so same indent level as line before 
  endif 

  " check if comment 
  let a:data=join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )
  if a:data =~ ".*omment.*"
    return '='
  endif

  "Otherwise return foldlevel equal to indent /shiftwidth (like if
  "foldmethod=indent)
  else  "return indent base fold
    return indent(a:lnum)/&shiftwidth
endfunction

最后一个区块:
indent(a:lnum)/&shiftwidth

根据缩进返回一个折叠级别。

还有另外一个:

join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )

检查行首字符是否被认为是使用该语法的注释。因此,将缩进和语法折叠与表达式合并是一种很好的方法,这是最先进的折叠方式。

请注意,您还可以根据所需的结果设置“set foldtext”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接