[倚天屠龙记] vim 折叠


        这一节讲述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的值即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值