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

时间:2009-08-14 22:31:35

标签: vim

Vim中的语法折叠可以轻松地为区域创建折叠,可以使用正则表达式定义其开头和结尾:

  

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

但是,我不知道如何使用语法折叠来定义C ++样式的折叠 - 样式注释,这些注释是以“//”。

开头的行集。

2 个答案:

答案 0 :(得分:8)

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

  

:syn匹配评论“\ v(^ \ s * //。* \ n)+”fold

这是一个多行匹配,用于折叠以空格和双斜线开头的连续行。为了简洁,开头的“\ v”标记了“非常神奇”的模式。似乎工作。

答案 1 :(得分:0)

要折叠多行注释块,使用foldmethod = indent,您必须使用expresion并重新编码缩进折叠。在你的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")') )

检查该行的第一个字符是否被视为具有语法的注释。所以这是将缩进和语法折叠与表达式(最高级的折叠)合并的好方法。

请注意,您还可以“设置foldtext”,具体取决于您希望结果的样子。

相关问题