構文foldmethod
は優れていますが、ソースファイルのコメントを折りたたむだけの場合もあります。
また、コメントの構文の折りたたみは、次のようなCスタイルのコメントに対してのみ機能します。
/*
...
*/
ただし、次のようなコメントの定型文ではありません。
//
//
// ...
//
または、次のような非Cライクな言語のコメントブロックでも:
#
#
# ...
#
vimでこれを設定するにはどうすればよいですか?
構文foldmethod
は優れていますが、ソースファイルのコメントを折りたたむだけの場合もあります。
また、コメントの構文の折りたたみは、次のようなCスタイルのコメントに対してのみ機能します。
/*
...
*/
ただし、次のようなコメントの定型文ではありません。
//
//
// ...
//
または、次のような非Cライクな言語のコメントブロックでも:
#
#
# ...
#
vimでこれを設定するにはどうすればよいですか?
回答:
コメントのみを折りたたむことは、次を使用することでかなり簡単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
私はインデントで折りたたむのが好きですが、折り目にコメントを含めます(各コメントは前の行と同じレベルの折りを取得することを意味します)。
残念ながら、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を設定」することもできます。
でコメント付きブロックを視覚的に選択してvac
から、手動の折りたたみを作成できますzf
。
コメントテキストオブジェクトは、標準のvimテキストオブジェクトのセットに対する言語拡張である場合があります。Go構文でテストしました。
ac
組み込みではありません。しかし、tpopeの解説でgc
はテキストオブジェクトです。だから、より良いソリューションがあるzfac
、zfgc
あるいはzfip
最悪で