【问题标题】:Vim foldexpr for including multiline function signaturesVim foldexpr 用于包含多行函数签名
【发布时间】:2011-11-29 19:47:02
【问题描述】:

我想折叠源代码,以便将跨多行的函数签名包含在函数折叠中。例如,在 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 的函数,该函数有效地遍历周围的行以查找{}

有没有更简洁的方法来做到这一点?

【问题讨论】:

    标签: c++ vim folding


    【解决方案1】:

    我的VimFold4C 插件将显示更接近您正在寻找的内容(3 年前...)

    +void ClassName::FunctionName(LongType1 LongArgument1, LongType2 LongArgument2, LongType3 LongArgument3) ----------
    

    foldtext 目前并不完美,但将来可能会在此主题上进行改进。无论如何,这次你只会得到一条线。

    【讨论】:

      【解决方案2】:

      有两个问题。第二个问题可能是 FoldText,你在正确的轨道上。添加代码来解析文本的后续行和右括号是最好的方法。如果您担心它会减慢速度,请不要这样做。我有 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++ 的常用折叠方法(例如语法)并且具有不同的折叠级别,那么您需要对其进行修改。我给出的示例仅提供 1 级折叠,功能完全折叠或完全展开。

      【讨论】:

      • 我不太关心折叠文本,我只想折叠整个函数签名。您提出的函数VimFoldLevel 的问题是模式选择。很难找到只匹配所需行的表达式。例如,您不能匹配返回类型,因为您可能存在任意类名。这就是为什么我认为有必要在本地环顾四周以更好地了解当前行的上下文。我希望避免这种情况,但这似乎是唯一的选择。
      猜你喜欢
      • 2023-02-11
      • 2014-09-10
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 2011-03-12
      • 2010-10-05
      相关资源
      最近更新 更多