vim中用marker进行折叠
vim中用marker进行代码折叠
前言
和各种IDE相比,vim默认是没有开启折叠功能的,但在平时代码量较大的文件中,不论是阅读还是调试,频繁的翻页都显得非常繁琐,此时如果能适当进行折叠,效率会高很多,因此在这里简要地介绍一下如何用vim进行代码折叠
简介
首先我们需要知道vim中代码折叠的几种类型,有以下几种:
- manual,默认折叠方法,通过自行设定行区间或者选定代码段进行折叠,关闭vim折叠信息会丢失,若想要保存折叠信息,可以在退出文件之前运行:mkview命令,重启后用:loadview命令进行恢复,该命令生成的缓存文件位于~/.vim/view文件夹中,移动或重命名文件,折叠信息依旧会丢失
- indent,缩进折叠方法,相同的缩进中的代码会被折叠
- syntax,语法高亮折叠,在C/C++中会折叠花括号部分,其它格式代码中有的不能自动进行折叠
- marker,标记折叠方法,和manual操作上是一样的,不同之处在于关闭vim折叠信息不会丢失,而且易用控制和标注
- diff,对没有更改的文本进行折叠
- expr,用表达式来定义折叠
其中,比较常用的是indent和marker两种折叠方式,indent类似于IDE中的折叠方法,而marker明显是一种由于manual的折叠方式,其余四中一般较少使用,此文中主要介绍marker这种方法.
语法
首先我们需要在~/.vimrc中对折叠方式进行配置,涉及到以下几个命令:
设置折叠方法
set foldenable "启用折叠功能
set foldmethod=marker "设置折叠的方法为marker,也可以简写为set fdm=marker,注意等号两边不能有空格
折叠
方法一:
- 2G ,将光标跳转到第二行
- zf100G, 折叠第二行到第100行的代码,vim会在折叠的开始和结束自动添加三个连续的花括号作为标记
注1:折叠完成后按jk进行上下移动折叠部分会被看做一行,而若是用hl进行左右移动会被认为你想要编辑折叠代码段,折叠部分会自动展开
注2:折叠完成后vim会自动添加三个连续的花括号作为折叠的标记,可以在注释符和花括号之间添加介绍,说明折叠代码段的作用
方法二:
- 在normal模式下按v进入visual模式
- 选中要折叠的的代码段部分,按zf进行折叠
常用折叠命令
zf : 创建折叠
zF: 在当前行创建折叠,当一开始就计划要折叠所写代码的时候,可以用该命令创建一堆折叠符号,然后再往里面填写内容
:5,10fo : 折叠5到10行的代码
zd: 删除光标下的折叠
zo: 打开光标下的折叠,但是一般用hl左右移动就可以
zD: 删除光标下的折叠,以及嵌套的折叠
zO: 打开光标下的折叠,以及嵌套的折叠
zc: 关闭光标下已打开的折叠
zC: 关闭光标下已打开的折叠,以及嵌套的折叠
za: 当光标在关闭的折叠上时,打开之,当光标在打开的折叠上时,关闭之
zA: 和za效果一致,不过对其嵌套的折叠也有效
[z : 将光标移动到折叠的开始处
z] : 将光标移动到折叠的结束处
zj: 将光标移动到下一个折叠的开始处
zk: 将光标移动到前一个折叠的结束处
以上加粗的部分代表比较常用的命令.
2022年10月26日更新
使用marker进行手动折叠时,会发现当你在一个文档中做了许多折叠,但是关闭文档,再次打开之后所有的折叠都消失了,需要说明的是自动折叠(比如syntax或者indent方法)是不会丢失折叠的,毕竟本来就是自动生成的.折叠信息凭空消失显然是难以接受的.查阅资料可知在关闭文件之前mkview
,会将折叠信息(实际上内容远比折叠要多)保存在~/.vim/view
目录下的一个文件中,再打开文件时只需要loadview
就可以复原之前的折叠状态,但即使这样还是显得有些繁琐,因此我们可以在.vimrc
文件中做如下配置实现自动的保存和读取:
au BuffWinLeave * silent mkview
au BufWinEnter * silent loadview
参考
- 在vim中运行 :help folding命令,查看折叠的帮助文档
- https://blog.csdn.net/zcube/article/details/42325741
- https://zhuanlan.zhihu.com/p/27473875
- https://www.jianshu.com/p/16e0b822b682
- vim保存代码折叠信息