Usr_28
Nvim :help
页面,生成 自 源代码 使用 tree-sitter-vimdoc 解析器。
VIM 用户手册 - 由 Bram Moolenaar 编写
折叠
结构化文本可以分成不同的部分。而部分也可以再分成子部分。折叠允许您将一个部分显示为一行,从而提供概览。本章解释了实现此功能的不同方式。
什么是折叠?
折叠用于将缓冲区中的某一范围行显示为屏幕上的单行。就像折叠一张纸以使其更短一样
+------------------------+ | 第 1 行 | | 第 2 行 | | 第 3 行 | _______________________ | \ \ \________________________\ / 折叠的行 / /________________________/ | 第 12 行 | | 第 13 行 | | 第 14 行 | +------------------------+
文本仍保留在缓冲区中,未改变。仅显示行的方式受折叠影响。
折叠的优点是,您可以通过折叠一个部分的行并将它们替换为指示存在一个部分的行,从而更好地了解文本的结构。
试试看:将光标放置在一个段落中并键入
zfap
您会看到该段落被替换为一条突出显示的行。您已创建一个折叠。
zf 是一个操作符,而
ap 是一个文本对象选择。您可以将
zf 操作符与任何移动命令一起使用,为它所移动过的文本创建折叠。
zf 在可视模式下也起作用。
要再次查看文本,请打开折叠,键入
zo
您可以通过以下操作再次关闭折叠
zc
所有折叠命令都以 "z" 开头。联想一下,这看起来像是一张从侧面看到的折叠纸。 "z" 后的字母具有助记意义,便于记住这些命令
zf F-old 创建 zo O-pen 一个折叠 zc C-lose 一个折叠
折叠可以嵌套:包含折叠的文本区域可以再次折叠。例如,您可以折叠本节中的每个段落,然后折叠本章中的所有部分。试试看。您会注意到,打开整个章节的折叠将恢复嵌套的折叠,某些可能已打开,而某些可能已关闭。
假设您已创建了多个折叠,现在要查看所有文本。您可以转到每个折叠并键入 "zo"。要更快地执行此操作,请使用以下命令
zr
这将 R-educe 折叠。相反的命令是
zm
这将折叠 M-ore。您可以重复 "zr" 和 "zm" 来打开和关闭多个级别的嵌套折叠。
如果您嵌套了多个级别,可以使用以下命令打开所有嵌套折叠
zR
这将 R-educe 折叠,直到不再存在折叠。您可以通过以下命令关闭所有折叠
zM
这将折叠 M-ore 和 M-ore。
您可以使用
zn 命令快速禁用折叠。然后
zN 会恢复折叠到原来的状态。
zi 会在两者之间切换。这是很有用的工作方式
创建折叠以概览您的文件
移动到您要进行工作的区域
当某些折叠关闭时,"j" 和 "k" 等移动命令会像对待单行空行一样越过折叠。这样您可以快速在折叠的文本中移动。
您可以像对待单行一样剪切、删除和粘贴折叠。如果您想重新排列程序中的函数,这非常有用。首先,通过选择正确的
'foldmethod' 来确保每个折叠都包含一个完整的函数(或少一些)。然后使用 "dd" 删除该函数,移动光标并使用 "p" 粘贴它。如果函数的某些行位于折叠的上面或下面,您可以使用可视选择
将光标放在要移动的第一行上
按 "V" 进入可视模式
将光标放在要移动的最后一行上
按 "d" 删除所选行。
将光标移动到新位置并将行 "p" 粘贴到那里。
有时很难看到或记住折叠的位置,因此很难确定
zo 命令实际上在哪里起作用。要查看已定义的折叠,请执行以下操作
:set foldcolumn=4
这将在窗口的左侧显示一个小的列,指示折叠。"+" 表示关闭的折叠。"-" 表示每个打开的折叠的开始,"|" 表示折叠的后续行。
您可以通过单击折叠列中的 "+" 使用鼠标打开折叠。单击下面的 "-" 或 "|" 将关闭打开的折叠。
要在光标所在行打开所有折叠,请使用
zO。要在光标所在行关闭所有折叠,请使用
zC。要在光标所在行删除折叠,请使用
zd。要在光标所在行删除所有折叠,请使用
zD.
在插入模式下,光标所在行的折叠永远不会关闭。这样您就可以看到您键入的内容!
在跳转或将光标向左或向右移动时,折叠会自动打开。例如,"0" 命令会打开光标下的折叠(如果
'foldopen' 包含 "hor",这是默认值)。
'foldopen' 选项可以更改,以在特定命令下打开折叠。如果您希望光标下的行始终保持打开状态,请执行以下操作
:set foldopen=all
警告:然后您将无法移动到关闭的折叠上。您可能希望仅临时使用此选项,然后将其恢复为默认值
:set foldopen&
您可以使折叠在您移出时自动关闭
:set foldclose=all
这将重新应用
'foldlevel' 到不包含光标的所有折叠。您需要尝试一下,看看您是否喜欢这种感觉。使用
zm 折叠更多,使用
zr 折叠更少(减少折叠)。
折叠是窗口本地的。这样您就可以在同一个缓冲区上打开两个窗口,一个有折叠,另一个没有折叠。或者一个所有折叠都关闭,另一个所有折叠都打开。
当您放弃一个文件(开始编辑另一个文件)时,折叠的状态会丢失。如果您稍后返回到同一个文件,所有手动打开和关闭的折叠都会恢复到默认状态。当手动创建折叠时,所有折叠都会消失!要保存折叠,请使用
:mkview 命令
:mkview
这将存储设置和其他影响文件视图的事项。您可以使用
'viewoptions' 选项更改要存储的内容。当您稍后返回到同一个文件时,您可以再次加载视图
:loadview
您可以在一个文件上存储多达十个视图。例如,要将当前设置保存为第三个视图并加载第二个视图,请执行以下操作
:mkview 3
:loadview 2
请注意,当您插入或删除行时,视图可能会失效。此外,请查看
'viewdir' 选项,该选项指定视图的存储位置。您可能希望不时删除旧视图。
使用
zf 定义折叠需要大量工作。如果您的文本是通过对较低级别的项目进行更大的缩进来构建的,则可以使用缩进折叠方法。这将为每组具有相同缩进的线创建一个折叠。缩进较大的行将成为嵌套折叠。这在许多编程语言中都非常有效。
尝试通过设置
'foldmethod' 选项来执行此操作
:set foldmethod=indent
然后,您可以使用
zm 和
zr 命令来折叠更多和减少折叠。在该示例文本上很容易看出
此行未缩进 此行缩进一次 此行缩进两次 此行缩进两次 此行缩进一次 此行未缩进 此行缩进一次 此行缩进一次
因此,有两种方法可以打开和关闭折叠:(A)通过设置折叠级别。这提供了一种非常快速的方式来 "缩小" 以查看文本结构、移动光标,然后 "放大" 文本。
(B) 通过使用
zo 和
zc 命令打开或关闭特定的折叠。这允许您仅打开您希望打开的折叠,而其他折叠保持关闭状态。
这两种方法可以结合使用:您首先可以使用
zm 几次关闭大多数折叠,然后使用
zo 打开特定折叠。或者使用
zR 打开所有折叠,然后使用
zc 关闭特定折叠。
但是,当
'foldmethod' 为 "indent" 时,您无法手动定义折叠,因为这会与缩进和折叠级别之间的关系冲突。
文本中的标记用于指定折叠区域的开始和结束。这样可以精确控制哪些行包含在一个折叠中。缺点是需要修改文本。
试试看
:set foldmethod=marker
示例文本,可能出现在 C 程序中
/* foobar () {{{ */
int foobar()
{
/* return a value {{{ */
return 42;
/* }}} */
}
/* }}} */
请注意,折叠行将显示标记之前的文本。这对于了解折叠包含的内容非常有用。
当标记在移动某些行后无法正确匹配时,非常令人讨厌。可以通过使用编号标记来避免这种情况。例如
/* global variables {{{1 */
int varA, varB;
/* functions {{{1 */
/* funcA() {{{2 */
void funcA() {}
/* funcB() {{{2 */
void funcB() {}
/* }}}1 */
在每个编号标记处,指定级别的折叠开始。这将使任何更高级别的折叠在此处停止。您可以只使用编号的开始标记来定义所有折叠。只有当您想在另一个开始标记之前显式停止折叠时,才需要添加结束标记。
对于每种语言,Vim 使用不同的语法文件。这定义了文件中各种项目的颜色。如果您在支持颜色的终端中使用 Vim 阅读本文档,您所看到的颜色是由 "help" 语法文件生成的。在语法文件中,可以添加具有 "fold" 参数的语法项。这些定义了折叠区域。这需要编写语法文件并在其中添加这些项。这并不容易。但是,一旦完成,所有折叠都会自动发生。这里,我们假设您使用的是现有的语法文件。那么就没有更多需要解释的内容了。您可以像上面解释的那样打开和关闭折叠。当您编辑文件时,折叠将自动创建和删除。
这类似于通过缩进折叠,但它不使用行的缩进,而是调用用户函数来计算行的折叠级别。您可以将其用于文本,其中文本中的某些内容指示哪些行属于一起。例如,电子邮件消息,其中引用文本由行之前的 ">" 表示。要折叠这些引用,请使用以下方法
:set foldmethod=expr
:set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^>].*','',''))
您可以在此文本上试用它
> he wrote 的引用文本 > he wrote 的引用文本 > > 我写的双重引用文本 > > 我写的双重引用文本
示例中使用
'foldexpr' 的解释(从内到外):getline(v:lnum) 获取当前行 substitute(...,'\\s','','g') 从行中删除所有空格 substitute(...,'[^>].*','','') 删除所有前导 ">" 之后的任何内容 strlen(...) 计算字符串的长度,即找到的 ">" 的数量
请注意,在 ":set" 命令中,每个空格、双引号和反斜杠之前都必须插入一个反斜杠。如果您对此感到困惑,请执行以下操作
:set foldexpr
检查实际结果值。要更正复杂的表达式,请使用命令行补全
:set foldexpr=<Tab>
其中
<Tab>
是一个真正的 Tab 键。Vim 将填充前一个值,然后您可以对其进行编辑。
当您在同一窗口中设置
'diff' 选项时,这很有用。
-d 选项为您执行此操作。示例
:setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1
在显示同一文件的不同版本的每个窗口中执行此操作。您将清楚地看到文件之间的差异,而没有更改的文本将被折叠。
所有这些可能性都让您想知道应该选择哪种方法。不幸的是,没有金科玉律。以下是一些提示。
如果有包含您正在编辑的语言的折叠的语法文件,那么这可能是最佳选择。如果没有,您可以尝试编写它。这需要您对搜索模式有很好的了解。这并不容易,但一旦它开始工作,您就不必手动定义折叠。
键入命令手动折叠区域可用于非结构化文本。然后使用
:mkview 命令保存和恢复您的折叠。
标记方法要求您更改文件。如果您与其他人共享文件或必须符合公司标准,则可能不允许您添加它们。标记的主要优点是您可以将它们放置在您想要的确切位置。这样可以避免在剪切和粘贴折叠时遗漏几行。您还可以添加关于折叠中包含内容的注释。
通过缩进折叠是在许多文件中都有效的操作,但并不总是非常有效。当您无法使用其他方法时,请使用它。但是,它对于创建大纲非常有用。然后,您可以为每个嵌套级别专门使用一个
'shiftwidth'。
使用表达式折叠可以在几乎所有结构化文本中创建折叠。它非常易于指定,尤其是在折叠的开始和结束可以轻松识别的情况下。如果您使用 "expr" 方法定义折叠,但它们并不完全符合您的要求,则可以切换到 "manual" 方法。这不会删除已定义的折叠。然后,您可以手动删除或添加折叠。