如何在vim中自动折叠文件中的所有函数?

75

一开始,我使用了 set foldmethod=marker 命令,并将光标移动到一个函数的 { 上,再使用 zf% 命令折叠当前函数。但是在此文件中有很多函数,如何折叠所有函数?而且我不想折叠函数内部的 {}。


4
FYI,通常vim发行版都带有内置的帮助文档。如果您键入“:help fold”,您可以查看所有与折叠相关的内容。 - R. Martinho Fernandes
2
你需要说明你感兴趣的编程语言(并非所有语言都有{}作为开始!);在Vim中折叠是一个独立的主题。 - Rook
6个回答

142
如果你运行:set foldmethod=syntax,则折叠将根据语法定义来指定。如果你更喜欢根据缩进定义折叠,则可以运行:set foldmethod=indent
你可以使用zM关闭所有折叠。如果你有嵌套的折叠,并且想逐级折叠,请使用zm。要展开折叠,请使用zR(全部)和zr(逐级)。

1
我觉得你误解了我的意思。首先,我需要为每个函数设置折叠。我只想知道如何在第一次设置中为所有函数设置折叠。 - Yongwei Xing
@Yongwei:好的,我现在明白了。这是你想要的吗? - R. Martinho Fernandes
5
它的意思是“未找到折痕”。 - Kevin
8
对于那些想知道如何记住zmzr的人,官方文档称其为“更多”和“减少”。(虽然仍不是很直观,但在vim世界中,大多数事情都是它本来就是的样子。) - RayLuo
4
仅供参考,他们的文件中提到所有折叠命令都以字母“z”开头。如果从侧面看,它看起来像是折叠的纸张。 - hunch
显示剩余3条评论

11

如果每个函数的左大括号都在第一列,你可以这样做:

:%g/^{/normal! zf%

或许这样更清晰明了:

:%g /^{/ normal! zf%

g 命令根据以下模式选择行,并执行 ex 命令(在这里使用 normal! 执行正常模式的按键)。

请参阅:help :g:help :normal


我使用这个 - 谢谢。 然而,你如何避免它在函数之间折叠?似乎不仅限于函数。 - serup

10

我也试着做了同样的事情,最终只是简单地执行了以下操作:

setlocal foldmethod=marker
setlocal foldmarker={,}

它使用标记折叠方法,并将标记更改为单个花括号(默认情况下,标记为{{{)。

我很喜欢这个,非常方便!但是我应该分割一下代码行,以便于区分一个括号的结束和另一个括号的开始(例如 "} else {")。 - Serhat Cevikel

9

我在寻找类似东西时发现了这个问题。你肯定已经弄清楚了,但为了其他人的好处,我还是回答一下。

您需要在 .vimrc 文件中添加以下行:

set foldmethod=syntax
set foldnestmax=1

8
set foldlevel=0

将一切从头开始折叠,应该被折叠的东西。根据语言和您的折叠功能,fold的内容会有所不同。


7
"zM" 做同样的事情。 - MOHRE

4

尝试使用以下命令::%g/\(function\_.\{-}\)\@<={/ normal! f{zf%

逐步解释:

:%g - 在整个文件中进行全局搜索

/\(function\_.\{-}\)\@<={/ - 查找任何“function”后的第一个“{”,并将光标放在该“{”所在字符串的开头

normal! f{zf% - 执行向前移动到“{” f{ 并用移动命令“%” zf% 将其折叠


1
无法使您的命令工作 - 可能需要展示示例函数。 - serup
我该如何在函数后面包含下一行(空行)? - loxosceles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接