我想折叠源代码,使得跨越多行的函数签名包含在函数fold中。例如,在C ++中,我想要
void ClassName::FunctionName(LongType1 LongArgument1,
LongType2 LongArgument2,
LongType3 LongArgument3) {
...
}
折叠到
+-- 5 lines: void ClassName::FunctionName [...]
而不是
void ClassName::FunctionName(LongType1 LongArgument1,
LongType2 LongArgument2,
+-- 3 lines: LongType3 LongArgument3) [...]
其中+
表示封闭的折叠。
我能想到的唯一解决方案是使用foldexpr
的函数来有效地迭代周围的行,寻找{
或}
。
有更简洁的方法吗?
答案 0 :(得分:1)
我的VimFold4C插件会显示更接近您所寻找的内容(3年前......)
+void ClassName::FunctionName(LongType1 LongArgument1, LongType2 LongArgument2, LongType3 LongArgument3) ----------
目前,foldtext并不完美,但未来可能会对此主题进行改进。无论如何,这次你只能获得一行。
答案 1 :(得分:0)
有两个问题。第二个问题可能是FoldText,你正处于正确的轨道上。添加代码来解析文本的后续行和关闭大括号是最好的方法。如果你担心它会减慢速度,那就不要了。我有远程的折叠文字功能,远不止于此,并且它不会明显影响事物。 (折叠文本函数可能不像您想象的那样频繁调用;它仅针对可查看的行进行维护。)
编辑:折叠文本部分比这更容易。如果你将光标定位在第一个签名大括号normal! va{y
,则会将sig的大括号放在@“中。然后只需获得预支撑部分并将join(split((@","\n"))
附加到其中。
另一个问题,主要问题是折叠规则。您似乎希望功能折叠位于功能签名的第一行,即使对于多行签名也是如此。您可以尝试使用foldexpression方法来更接近您想要的。如果每个函数(并且只有函数)在最左边的列中以'void'开头,那么这个foldexpr就可以工作了:
set foldexpr=getline(v:lnum+1)=~'^void'?'<0':'1'
由于这是不现实的,你可以定义一些模式,将所有你想要的行匹配为可折叠线,即第一行函数defs以及你想要的任何其他折叠块:
function! VimFoldLevel(line)
"check if this is the last line in a fold block
if getline(a:line + 1) =~ '[pattern that matches first fold lines]'
return '<0'
else
return '1'
endif
endfunction
然后确保将foldexpr设置为等于你的foldlevel func:set foldexpr=VimFoldLevel(v:lnum)
并将你的foldmethod设置为expr:set foldmethod=expr
可能还有其他方法可以做到这一点,但这是我想到的。 。 。如果有一些常用的折叠方法(例如语法)用于c ++并且具有不同的折叠级别,那么你需要修改它。示例I给出的仅提供1级折叠,功能完全折叠或完全展开。