コメントの折り方


16

構文foldmethodは優れていますが、ソースファイルのコメントを折りたたむだけの場合もあります。

また、コメントの構文の折りたたみは、次のようなCスタイルのコメントに対してのみ機能します。

/*
 ...
 */

ただし、次のようなコメントの定型文ではありません。

//
//
// ...
//

または、次のような非Cライクな言語のコメントブロックでも:

#
#
# ...
#

vimでこれを設定するにはどうすればよいですか?


構文の折りたたみコメントの折りたたみを使用しますか?またはコメントの折りたたみのみですか?
マーティントゥルノイ

@Carpetsmoker、構文の折りたたみ+コメントの折りたたみは、「コメント以外のすべての折りたたみを開く」と言えば問題ありません。それ以外の場合は、構文の折りたたみなしのコメントの折りたたみも問題ありません。
maxschlepzig

回答:


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キーワードは1行のコメントに対してのみ機能します。したがって、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

インデントに基づいてfoldlevelベースを返します。

そしてもう一つ:

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

行の最初の文字が構文のコメントと見なされるかどうかを確認します。そのため、インデントと構文の折り畳みを式、最も高度な折り畳みとマージするのに適した方法です。

結果をどのように表示するかに応じて、「foldtextを設定」することもできます。


0

でコメント付きブロックを視覚的に選択してvacから、手動の折りたたみを作成できますzf

コメントテキストオブジェクトは、標準のvimテキストオブジェクトのセットに対する言語拡張である場合があります。Go構文でテストしました。


1
実際、ac組み込みではありません。しかし、tpopeの解説でgcはテキストオブジェクトです。だから、より良いソリューションがあるzfaczfgcあるいはzfip最悪で
D.ベンKnoble
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.