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方式 - 使用 Vim 的话,在
~/.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 foldenablefen: 当值为off时,所有折叠将被打开,默认值为on
za: 开关光标处的折叠zA: 递归地开关光标处的所有折叠
删除折叠
zd:- 删除光标处的折叠
- 有嵌套时,删除外层折叠,内层折叠将上浮一个等级
- 光标在内层折叠处执行删除,则不影响外层
- 有删除比预期更多的折叠的风险
zD: 递归地删除光标处的所有折叠zE: 删除当前窗口中的所有折叠
不熟练
zx: 撤销手动打开或关闭的折叠zX: 递归地撤销手动打开或关闭的折叠zm: 从foldlevel减去v:count1zM: 关闭所有折叠,并将foldlevel设为0zr: 将v:count1加入foldlevelzR: 打开所有折叠,设置foldlevel为最高等级
在折叠处移动
[z: 移动到折叠的开始处]z: 移动到折叠的结束处zj: 移动到下一个折叠的开始处zk: 移动到上一个折叠的关闭处