Learn Vim 第十七章:折叠

2026-05-09

Eric Wong

本文翻译自 iggredible/Learn-Vim,部分内容有增改。

在阅读文件时,经常会有一些不相关的文本会妨碍您理解。使用 Vim 折叠可以隐藏这些不必要的信息。

本章中,您将学习如何使用不同的折叠方法。

手动折叠

想象您正在折叠一张纸来覆盖一些文本,实际的文本不会消失,它仍在那儿。Vim 折叠的工作方式与此相同,它折叠一段文本,在显示时会隐藏起来,但实际上并不会真的删除它。

折叠操作符是z。

假设有如下文本:

Fold me
Hold me

把光标放在第一行,输入 zfj。Vim 将这两行折叠成一行。

上面的命令分解如下:

  • zf 是折叠操作符。
  • j 是用于折叠操作符的动作。

您可以使用 zo 打开/展开已折叠文本,使用 zc 关闭/收缩文本。

折叠是一个操作符,所以它遵循语法规则(动词+名词)。例如,使用 zfip 可以折叠内部段落;使用 zfG 可以折叠至文件末尾。

最有用的一些命令是:

  • zR 展开所有折叠。
  • zM 收缩所有折叠。
  • za 切换折叠状态。

不同的折叠方法

Vim 有六种不同的折叠方法:

  1. 手动折叠
  2. 缩进折叠
  3. 表达式折叠
  4. 语法折叠
  5. 差异折叠
  6. 标志折叠

缩进折叠

:set foldmethod=indent

Vim 将会查看每行的开头有多少空格,并将它与 'shiftwidth' 选项进行比较,以此来决定该行可折叠性。

表达式折叠

:set foldmethod=expr
:set foldexpr=getline(v:lnum)[0]==\\"p\\"

Vim 会计算每行的 'foldexpr' 值。如果返回 0,则不折叠行。如果返回 1,则该行的折叠级别为 1。

语法折叠

:set foldmethod=syntax

语法折叠是由Vim的语法高亮决定的。如果您使用了语法高亮插件,装上插件就可以直接使用语法折叠。

差异折叠

运行 vimdiff file1.txt file2.txt 时,Vim 会自动使用 foldmethod=diff。

标志折叠

:set foldmethod=marker

Vim 会寻找由 'foldmarker' 选项定义的特殊标志(默认 }),并标记折叠区域。

持久化折叠

要在关闭文件后保留折叠信息:

:mkview

重新打开后加载:

:loadview

自动保存和加载:

autocmd BufWinLeave *.txt mkview
autocmd BufWinEnter *.txt silent loadview

聪明地学习折叠

当您学习折叠时,请从手动折叠开始,然后逐渐学习不同的技巧来使用缩进和标志折叠。最后,学习如何使用语法和表达式折叠。

版权声明:本文为原创文章,遵循 署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)版权协议,转载请附上原文出处链接和本声明。

分享到:

评论