Skip to content

Vim - 折叠

代码折叠(Code Folding)是一种允许你选择性地隐藏(折叠,fold)和显示(展开,unfold)文本或代码区域的功能。这对于处理大型文件特别有用,通过折叠函数(functions)、类(classes)或缩进代码块(indented code blocks)等块,可以帮助你专注于相关部分。

本章讨论:

  • 启用和配置折叠 (folding)。
  • 常用的折叠方法 (fold methods)。
  • 打开和关闭折叠 (folds) 的命令 (commands)。

要启用折叠,首先需要设置 foldenable 选项:

:set foldenable

然后,必须选择一个 foldmethod。这告诉 Vim 如何确定哪些行应该成为一个折叠(fold)的一部分。一些常用的方法是:

  • indent: 按相同的缩进级别(indent level)分组行。适用于大多数编程语言(programming languages)。
  • :set foldmethod=indent
  • syntax: 根据语法高亮(syntax highlighting)定义进行折叠。许多语言语法文件(language syntax files)包含折叠信息(例如,用于函数 functions、类 classes)。
  • :set foldmethod=syntax
  • marker: 基于文本中的特定标记字符(marker characters)进行折叠(例如, {{{ 和 }}})。
  • :set foldmethod=marker
  • manual: 你使用 zf 等命令手动创建折叠(folds)。
  • :set foldmethod=manual
  • expr: 使用自定义表达式(custom expression)(foldexpr)定义折叠。这是一种更高级的方法。

要禁用折叠,使用:

:set nofoldenable

你可以将这些 set 命令放在你的 vimrc 文件中,以便自动应用。

折叠操作 (普通模式 Normal Mode 命令 Commands)

Section titled “折叠操作 (普通模式 Normal Mode 命令 Commands)”

启用折叠并设置方法后,你可以使用这些普通模式(Normal mode)命令(通常以 z 开头)来管理折叠(folds)。确保你的光标(cursor)位于潜在折叠区域内或开始位置的行上。

命令 Command描述 Description
zc关闭光标(cursor)下的一个层级折叠(fold)。
zC递归地(recursively)关闭光标下的所有折叠。
zo打开光标下的一个层级折叠。
zO递归地(recursively)打开光标下的所有折叠。
za切换(打开/关闭)光标下的折叠。
zA递归地(recursively)切换(打开/关闭)光标下的折叠。

当折叠(fold)关闭时,它通常显示为一行,并带有折叠内容(folded content)的摘要,例如 +-- 42 lines: function my_function() ------。确切的外观取决于你的设置。

命令 Command描述 Description
zM关闭缓冲区(buffer)中的所有折叠(Fold More)。将 foldlevel 设置为 0。
zR打开缓冲区(buffer)中的所有折叠(Reduce folding)。将 foldlevel 设置为较高的值。
命令 Command描述 Description
zm将 foldlevel 增加一级(关闭更多折叠 folds)。
zr将 foldlevel 减少一级(打开更多折叠 folds)。
命令 Command描述 Description
[z移动到当前打开折叠(open fold)的开始位置。如果不在打开的折叠中,则移动到其之前的折叠的开始位置。
]z移动到当前打开折叠的结束位置。如果不在打开的折叠中,则移动到其之后的折叠的结束位置。
zj向下移动到下一个折叠的开始位置(作用类似于 j,但会跳过关闭的折叠 closed folds)。
zk向上移动到上一个折叠的结束位置(作用类似于 k,但会跳过关闭的折叠 closed folds)。

实际应用:在一个很长的源代码文件(source code file)中,你可以折叠所有函数(functions),只留下你当前正在工作的那个。这减少了视觉混乱(visual clutter),帮助你保持上下文(context),使理解整体结构和专注于代码(code)的特定部分变得更容易。