如何折叠评论?


16

语法foldmethod很棒,但有时我只想将注释折叠到源文件中。

同样,注释的语法折叠仅适用于C样式注释,例如:

/*
 ...
 */

但不用于注释样板:

//
//
// ...
//

甚至对于非C类语言的注释块,例如:

#
#
# ...
#

如何用vim配置它?


您是否要使用语法折叠注释折叠?还是注释折叠?
马丁·图尔诺伊

@Carpetsmoker,如果可以说“打开所有折叠(注释除外)”,语法折叠+注释折叠就可以了。否则,没有语法折叠的注释折叠也是可以的。
maxschlepzig

Answers:


14

使用foldmethod=expr以下命令仅折叠注释是相当容易的:

set foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*'.&commentstring[0]

这将仅检查行是否以任意数量的空格+注释字符开头。请注意,这是非常幼稚的,并且可能不适用于所有语言。因此,您可能需要使用autocmd来更具体:

autocmd FileType c setlocal foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*//'
autocmd FileType python setlocal foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*#'

有关fold-expr的更多信息,请参见:


使用语法折叠注释折叠更加复杂。这将需要在中修改语法文件/usr/share/vim/vim74/syntax/*.vim,并且将特定于您使用的语言。

请注意,某些文件类型已经做到了!例如来自ruby.vim

if !exists("ruby_no_comment_fold")
  syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@<!\%(^\s*#.*\n\)\)\%(\(^\s*#.*\n\)\{1,}\)\@=" end="\%(^\s*#.*\n\)\@<=\%(^\s*#.*\n\)\%(^\s*#\)\@!" contains=rubyC
  syn region rubyDocumentation    start="^=begin\ze\%(\s.*\)\=$" end="^=end\%(\s.*\)\=$" contains=rubySpaceError,rubyTodo,@Spell fold
else
  syn region rubyDocumentation    start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
endif

2

我喜欢使用缩进折叠,但要在折叠中包含注释(我的意思是每个注释的折叠程度与上一行相同)。

不幸的是,foldignore关键字仅适用于一行注释。所以我在vimrc中用expr折叠:

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")') )

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

请注意,您还可以根据所需的结果来“设置折叠文本”。


0

您可以使用直观地选择注释的块,vac然后创建手动折页zf

注释文本对象可以是标准vim文本对象集的语言扩展。使用Go语法对其进行了测试。


1
确实,ac不是内置的。但是用tpope的注释gc是一个文本对象。因此,最好的解决方案是zfaczfgczfip最糟糕的解决方案
D. Ben Knoble
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.