如何在Vim中自动折叠长C代码?

我经常遇到没有折叠的C代码。 如果没有折叠,特别是对于长文件,阅读它们会很烦人。 我怎么折叠它们?

根据语法折叠

:set foldmethod=syntax 

如果您想手动对要折叠的位进行操作

 :set foldmethod=manual 

然后通过选择/移动并按下zf来创建新的折叠,例如

 shift-v jj zf 

(忽略空格)

编辑:另请参阅此答案的注释,用于缩进和标记foldmethods。

我想你可能混淆了术语。 你需要“包装”还是“折叠”。 包装是由于它们的长度而通常不适合在屏幕上的线被包裹,即在屏幕上的几个连续线上显示(实际上,它是一行,在几行中 – 很难解释,最好看到实践)。

在vim包装中设置

 :set wrap 

把它打开,然后

 :set textwidth=80 

确定vim应该在哪里包装文本(80个字符通常是一个很好的衡量标准)。

另一方面,折叠是完全不同的事情。 它是vim将几行代码(例如,一个函数)折叠成一行代码的那个。 它有助于提高代码的可读性。 Vim有几种折叠方法,你可以看到所有这些方法

 :help folding 

你想要的是,我认为,语法折叠,但我可能是错的。 我建议阅读帮助页面,它不长,而且非常有用。

我已经推出了C和C ++的折叠插件 。 它超越了语法折叠所做的(可能是它可以改进,我不知道),并且与压痕和基于标记的折叠相比,留下更少的噪音并且没有真正有用的东西展开。

需要注意的是:为了获得不错的反应时间,我不得不进行一些简化,有时候结果非常混乱(我们必须输入zx来修复它)。

这是一个小小的截屏video,看看该插件如何折叠正确平衡的C ++源代码,目前尚未被修改:(

在此处输入图像描述

在vi(而不是vim)中,答案是:

 :set wm=1 

这会将换行边距设置为行尾之前的一个字符。 这不是具有可变尺寸窗户的世界上最好的规格(当难以改变尺寸时,绿色屏幕是有意义的)。

这意味着在vim中还有另一种方法可以做到这一点:

 :set textwidth=30 

请参阅: VimDoc用户手册第25.1节

你可能想要这个设置

 :set foldmethod=syntax 

但是不要手动把它! 多数人错过了其中一个Vims最大的function,即已经内置了数百种文件类型的自定义设置。 为此,将其添加到〜/ .vimrc中

 filetype plugin on filetype indent on 

文件类型检测主要基于扩展名,在本例中为* .c文件。 有关详细信息,请参阅:help:filetype。 您还可以自定义这些基于文件类型的设置。

实际上,还有另一种非常直接有效的方法,即使用foldmethod = marker并将foldmarker设置为{,} 。 然后折叠结果如下:

  1. 折叠的所有function。 基本上,它看起来像IDE中的大纲。 (如果您不想在开头折叠所有内容,也可以set foldlevel=1或更多)

在此处输入图像描述

  1. 当你用zo -1打开它时,这就是普通函数的样子。

在此处输入图像描述

另外,要通过语法进行折叠需要一些额外的工作,这里有一个很好的教程 。 但我认为用marker={,}折叠是足够的,最重要的是,它简单而整洁。