[倚天屠龙记] vim 折叠

本文详细介绍了 Vim 编辑器中的折行功能,包括手工创建、语法折叠、按缩进等级和起止标记折叠等多种方式。通过使用相关命令,用户可以灵活地在编辑过程中对文件进行高效管理。同时,文中还提到了如何保存和恢复手工创建的折叠,以及通过表达式创建自定义折叠的方法,进一步丰富了 Vim 的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


        这一节讲述vim的一个非常实用的功能----折行功能,它可以将暂时不关心的连续若干行折叠成一行显示,在需要时再予以展开。下面是本文写作时的情形:


        

        

        折叠的主要创建方式有手工创建、语法折叠、按缩进等级折叠、按起止标记折叠。要查看折叠的帮助请输入:help fold。

        折叠相关的命令大都以字母z打头,这个字母本身给人以一种折叠的印象。
        手工创建折叠的方式是zf[motion],f是fold的简写,motion是任何光标移动指令(必须限于当前文件中),比如zf5j会将从光标所在行起的接下来5行这个范围创建一个折叠,用zo可以展开它,而zc则可以收起来显示成一行,o和c分别对应open和close。将光标放在折叠的起始处按zd可以删除刚才创建的折叠。
        当光标处于某个折叠内部时,用[z可以将光标移动到该折叠的开头,而]z则移动到该折叠的结尾。zj可以移动下一个折叠的起始处,zk则移动到上一个折叠的起始处。
        折叠可以嵌套,形成层次结构,当文件中的折叠层次比较多时,按zr可以展开所有下一级的折叠,而zm则收起当前这一层折叠,多次按zr和zm则可以次第展开和收起,r和m分别代表着reduce和more,要一次性展开和收起全部嵌套的折叠可以使用zR和zM,即r和m进行大写即可。如果仅仅是想递归展开光标处的嵌套折叠,可以使用zO命令,而相应的,用zC命令将光标处的嵌套折叠递归收起来。
        对于嵌套的折叠,foldlevel是一个非常有用的选项,它用于指定折叠的层深,不超过此层深的折叠将被展开,而高于此层深的折叠则仍然保持收起状态。最外层的折叠层次为1,嵌套的折叠依次累加,当用:set foldlevel=3设置了折叠层深时,只有最外面的三层折叠会展开,而嵌套层次大于3的仍保持折叠状态。当你使用zr和zm命令展开和收起折叠时,实际上就是在对foldlevel进行增减操作。
        语法折叠对于书写程序极为有用,程序语言大都有闭合的可嵌套的语法结构,如C/C++语言用一对花括号代表一个程序块,当用:set foldmethod=syntax或者:set fdm=syntax开启语法折叠后,代码文件中将自动按相应的起止标记按层次创建折叠,无需再手工创建折叠。

        很多程序语言不同的代码层次拥有不同层次的缩进,这时可以设置按缩进进行折叠:set foldmethod=indent或者:set fdm=indent,较深的缩进则自动创建嵌套折叠。缩进字符的个数与折叠深度的关系依赖于选项shiftwidth的值,每shiftwidth个缩进字符为一级折叠,对应着折叠层深,通过:set shiftwidth=4可以规定每4个缩进为一个等级,下面是C语言代码使用缩进折叠后的效果(因为花括号并未缩进,所以C语言代码还是用语法折叠更好一些):


        


        如果不是程序代码文件,还可以按指定的起止标志进行折叠,这需要通过:set fdm=marker进行开启,默认的起止标记是{{{和}}},当然也可以用:set foldmarker自行指定,例如:set foldmarker (((,)))则将起止标记分别更改为(((和))) ,在折叠时,起始标记如果不在行首,则其前面的文本将显示在折叠的前面,这正好可以利用来提示折叠的内容,下面是本文折叠起来的效果。


        


        在编辑时,在折叠行上上下移动光标,光标会直接跨过折叠行,就好像这是一行一样,如果对折叠行进行复制粘贴和删除,则操作的对象的将是被折叠起来的多行文本,这非常有利于按文件结构进行编辑操作。
        手工创建的折叠在文件被关闭后会全部丢失,如果想要保存下来请阅读帮助:help mkview。
        最后还有一类创建折叠的方式,就是根据表达式折叠,你需要提供一个表达式,这个表达式的作用是根据一行文本计算折叠深度,然后vim会把相邻并且深度都大于等于某个值的行创建为一个折叠,当然其中大于这个值的这些相邻行会创建嵌套的折叠。要用这种方式,需要:set fdm=expr进行启用,并用:set foldexpr=express这种方式来设置表达式,其中express是一个表达式,例如缩进折叠就可以用表达式来实现,只要计算行首的空白字符个数并除以选项shiftwidth的值即可。

### 配置代码折叠Vim 编辑器中配置代码折叠可以通过设置特定选项来实现。为了使代码折叠功能生效,通常需要启用 `foldmethod` 并选择合适的折叠方式。 对于自动识别文件类型的折叠方法,可以将以下配置加入到 `.vimrc` 文件中: ```vim set foldmethod=syntax " 使用语法高亮来进折叠 ``` 如果希望手动定义折叠区域,则可采用标记符方式进配置: ```vim set foldmethod=marker " 使用标记符进折叠 set foldmarker={{{,}}} " 定义起始和结束标志 ``` 另外一种常见的做法是在初始化脚本里指定基于表达式的折叠逻辑: ```vim set foldmethod=expr " 启用表达式计算折叠 set foldexpr=nvim_treesitter#foldexpr() " 利用树形结构解析库nvim-treesitter作为折叠依据 ``` 除了上述全局设定之外,在某些特殊场景下还可以针对具体编程语言调整其默认为。例如 Markdown 文档支持如下自定义项[^1]: ```vim let g:vim_markdown_folding_disabled = 0 " 开启Markdown文档内部的折叠特性 ``` 通过以上几种途径之一即可完成基本的代码折叠环境搭建工作。值得注意的是,不同的旧策略适用于不同类型的任务需求;因此建议根据实际应用场景灵活选用最恰当的一种方案。 ### 命令操作 一旦完成了必要的前期准备工作之后,就可以利用一系列快捷指令轻松管理已有的折叠区块了。下面列举了一些常用的交互命令及其作用说明[^5]: - **zf**:创建一个新的折叠区段; - **zF**:从当前位置向前方生成一个新折叠; - **zd/zD**:分别用于移除单层或多级嵌套的现有折叠对象; - **zE**:清除整个视窗范围内的全部折叠状态(仅限于manual/marker模式); - **zo/zc**:展开或者收拢选定位置处的一个折叠单元; - **zM/zR**:一次性关闭或打开所有可见级别的子节点。 掌握这些基础的操作可以帮助用户更高效地浏览复杂项目中的源码片段而不至于迷失方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值