2009-08-14 116 views
4

在Vim的語法摺疊可以很容易地創建用於區域的褶皺,其中可以使用正則表達式來定義的開始和結束:如何在Vim中摺疊C++風格的註釋?

順區域myRegion開始=「#區」結束=「#endregion」透明keepend extend fold

但是,我不確定如何使用語法摺疊來定義C++風格註釋的摺疊,這些註釋是以「//」開頭的行集合。

+0

爲什麼需要摺疊以「//」開頭的評論?這些是單行評論,它們應該是簡約和短小的,因此它們不需要摺疊。您應該僅摺疊以「/ \ *」開頭並以「* /」結尾的註釋塊,這應該很容易實現。根據你的帖子,這應該是有效的:syn區CommentBlock開始=「/ *」結束=「* /」透明keepend延長摺疊 – schmrz 2009-08-16 15:09:41

+0

許多編碼標準使用「//」塊註釋。 MSDN始終使用這些。此外,還有其他一些東西可能要摺疊成相同的模式,比如「#include」和「using」語句。 – 2009-08-16 15:44:31

回答

8

我想我找到了解決辦法:

:SYN比賽評論 「\ V(^ \ S * // * \ n)+」 折

這是一個多匹配摺疊連續行以空格和雙斜槓開始。爲了簡潔起見,開頭的「\ v」標出了「非常神奇」的模式。似乎工作。

+0

這似乎工作。尼斯。 – 2009-08-16 20:16:43

0

要摺疊多行註釋塊,使用foldmethod = indent,必須使用expresion和recode縮進摺疊。在你的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」,具體取決於您希望結果如何。