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 有六种不同的折叠方法:
- 手动折叠
- 缩进折叠
- 表达式折叠
- 语法折叠
- 差异折叠
- 标志折叠
缩进折叠
: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)版权协议,转载请附上原文出处链接和本声明。
分享到: