Vim foldexpr包含多行函数签名

时间:2011-11-29 19:47:03

标签: c++ vim folding

我想折叠源代码,使得跨越多行的函数签名包含在函数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的函数来有效地迭代周围的行,寻找{}

有更简洁的方法吗?

2 个答案:

答案 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级折叠,功能完全折叠或完全展开。