在Vim的語法摺疊可以很容易地創建用於區域的褶皺,其中可以使用正則表達式來定義的開始和結束:如何在Vim中摺疊C++風格的註釋?
順區域myRegion開始=「#區」結束=「#endregion」透明keepend extend fold
但是,我不確定如何使用語法摺疊來定義C++風格註釋的摺疊,這些註釋是以「//」開頭的行集合。
在Vim的語法摺疊可以很容易地創建用於區域的褶皺,其中可以使用正則表達式來定義的開始和結束:如何在Vim中摺疊C++風格的註釋?
順區域myRegion開始=「#區」結束=「#endregion」透明keepend extend fold
但是,我不確定如何使用語法摺疊來定義C++風格註釋的摺疊,這些註釋是以「//」開頭的行集合。
我想我找到了解決辦法:
:SYN比賽評論 「\ V(^ \ S * // * \ n)+」 折
這是一個多匹配摺疊連續行以空格和雙斜槓開始。爲了簡潔起見,開頭的「\ v」標出了「非常神奇」的模式。似乎工作。
這似乎工作。尼斯。 – 2009-08-16 20:16:43
要摺疊多行註釋塊,使用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」,具體取決於您希望結果如何。
爲什麼需要摺疊以「//」開頭的評論?這些是單行評論,它們應該是簡約和短小的,因此它們不需要摺疊。您應該僅摺疊以「/ \ *」開頭並以「* /」結尾的註釋塊,這應該很容易實現。根據你的帖子,這應該是有效的:syn區CommentBlock開始=「/ *」結束=「* /」透明keepend延長摺疊 – schmrz 2009-08-16 15:09:41
許多編碼標準使用「//」塊註釋。 MSDN始終使用這些。此外,還有其他一些東西可能要摺疊成相同的模式,比如「#include」和「using」語句。 – 2009-08-16 15:44:31