2009-08-14 27 views
4

構文のVimで折りたたみが地域のために折り目を作成することが容易になり、正規表現を定義できるの開始と終了:VimでC++スタイルのコメントを折りたたむには?

シン領域は=「#領域」終了=「#1 endregion」透明を開始でmyRegion keepend extend fold

しかし、「//」で始まる行のセットであるC++スタイルのコメントの折りたたみを定義するために構文フォールディングをどのように使用できるかわかりません。

:シン・マッチ・コメントは "\ V(^ \が* // * \ nのよ。)+" これは、複数行の試合で

を折る

+0

なぜ「//」で始まるコメントを折り畳む必要がありますか?それらは1行のコメントであり、最小限に抑えて短くして、折り畳む必要はありません。 "/ \ *"で始まり "* /"で終わるコメントブロックのみを折りたたんで実装するのは簡単です。あなたの投稿によると、これは有効でなければなりません:syn region CommentBlock start = "/ *" end = "*/*"透過的なキープエンド延長倍数 – schmrz

+0

多くのコーディング標準では、ブロックコメントに "//"を使用しています。 MSDNはこれらを一貫して使用します。さらに、 "#include"や "using"ステートメントのように、そのパターンを同じパターンに折り畳むことができる他のものがあります。 –

答えて

8

は、私は解決策を見つけたと思います空白と二重スラッシュで始まる連続する行を折り返します。冒頭の "\ v"は、パターンを簡潔にするために "非常に魔法"にします。仕事をしているようだ。

+0

これはうまくいくようです。ニース。 –

0

foldmethod = indentを使用して複数の行コメントブロックを折り畳むには、expresionとrecode indent foldingを使用する必要があります。あなたの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 

がインデントに折り畳みレベルベースを返します。

そして、他の1:行の最初の文字は、構文とコメントとして考えるの場合

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

チェックします。したがって、インデントとシンタックスフォールディングを、最も進んだフォールディングである式でマージすると良い方法です。

結果をどのように表示するかによって、「折り畳みを設定する」こともできます。

関連する問題