Neovim 使用折叠
2024 年 7 月刚入坑 Vim 时,在 Vim 中曾经短暂尝试过「折叠」功能。因为比较少场景使用 Markdown 处理大文件、长文件,很多关于「折叠」的功能不用就忘记了。
最近看到一个 YouTube 博主在介绍 Neovim 中的折叠功能,发现折叠已经内置于 Vim 和 Neovim,新菜上手无需额外插件或配置。但还是需要快速地学习一下相关命令,才能正常使用「折叠」。
- 官方文档:https://neovim.io/doc/user/fold.html#fold-commands
- Vim 和 Neovim 均已经默认
foldmethod
为manual
,运行:set foldmethod?
可以得到foldmethod=manual
- 在 Markdown 文档中,可以先简单尝试默认的
manual
方式 - 在
~/.vimrc
中,可以手动set foldmethod=marker
切换折叠方式 - 后续在代码文件中,可以再尝试
indent
方式,需要在配置文件options.lua
内显式更改配置 - 关于折叠的命令大都由
z
引导,Neovim 配置了which-key
插件后,按下引导键z
之后,会显示全部可用命令的提示菜单
创建折叠
并非必须在一个定义域符号内(比如括号),完全无关的两行也能折叠。
zf{motion}
/{Visual}zf
{count}zF
:{range}fo[ld]
比如,zf7j
就可将“当前行 + 往下 7 行”这个区域一下折叠起来。折叠区域在甫一创建,即呈「关闭」状态。
打开折叠
zo
: 打开光标处的折叠zO
: 递归地打开光标处的所有折叠zv
: 一直打开折叠直到光标处能显示:{range}foldo[pen][!]
:- 打开
{range}
范围内一个等级的折叠 - 如果使用
!
,则打开范围内的所有折叠
- 打开
zn
: 重置foldenable
,打开所有折叠zN
: 设置foldenable
,所有折叠恢复到原来的状态zi
: 倒置foldenable
关闭折叠
处于「打开」状态的折叠区域,可以通过 zc
或 zC
进行关闭。
zc
:- 关闭光标处的折
- 有嵌套时,仅关闭光标所在处最内层的折叠
zC
: 递归地关闭光标处的所有折叠:{range}foldc[lose][!]
:- 关闭
{range}
范围内一个等级的折叠 - 如果使用
!
,则关闭范围内的所有折叠
- 关闭
开关折叠
切换折叠区域的「打开」和「关闭」状态。
- 小于
foldminlines
所设置的行(默认值是 1)将始终显示 - 关闭折叠将设置
foldenable
foldenable
fen
: 当值为off
时,所有折叠将被打开,默认值为on
za
: 开关光标处的折叠zA
: 递归地开关光标处的所有折叠
删除折叠
zd
:- 删除光标处的折叠
- 有嵌套时,删除外层折叠,内层折叠将上浮一个等级
- 光标在内层折叠处执行删除,则不影响外层
- 有删除比预期更多的折叠的风险
zD
: 递归地删除光标处的所有折叠zE
: 删除当前窗口中的所有折叠
不熟练
zx
: 撤销手动打开或关闭的折叠zX
: 递归地撤销手动打开或关闭的折叠zm
: 从foldlevel
减去v:count1
zM
: 关闭所有折叠,并将foldlevel
设为0
zr
: 将v:count1
加入foldlevel
zR
: 打开所有折叠,设置foldlevel
为最高等级
在折叠处移动
[z
: 移动到折叠的开始处]z
: 移动到折叠的结束处zj
: 移动到下一个折叠的开始处zk
: 移动到上一个折叠的关闭处