zfap
将游标所在处的那个段落折叠成一行。
zf7G
自光标所在处至全文第 7 行折叠起来。
:3,9fold
将第 3 行至第 7 行折叠起来。
5zF
将光标所在处起算 5 行的内容折叠起来。
也可以将所要折叠的部份以 Shift+v 标记起来,然H按 zf 就会将标记的内容折叠起来。
zo
将游标所在处的折叠打开。open。
zc
将光标所在处已打开的内容再度折叠起来。close。
zr
将全文的所有折叠依层次通通打开。reduce。
zm
将全文已打开的折叠依层次通通再折叠起来。more。
zR
作用和 zr 同,但会打开含巢状折叠(折叠中又还有折叠)的所有折叠。
zM
作用和 zm 同,但对于巢状折叠亦有作用。
zi
这是个切换,是折叠与不折叠指令间的切换。
zn
打开全文的所有折叠。fold none。
zN
这是 zn 的相对指令,恢复所有的折叠。
那这个 zn 和 zR 不是都一样吗?不是的,zR 的作用于 foldlevel 这个设定项,是控制折叠的层次,而 zn 则是作用于 foldenable 这个设定 项,他是不管层次的,只有全关或全开。当然,所得到的结果有许多情形下是一样的,但里子不一样,这在写 Vim script 时得小心分辨。
通常,光标在折叠处向左或向右移的话,折叠也会自动打开。在进入编辑模式,例如按 i 或 o,这是也会自动打开折叠。
其它的复制、删除及替换等动作还是可以和一般正常文稿一样的操作,例如 dd 就会删掉一整个折叠,yy 会复制一整个折叠,p 会贴上一整个折叠。把整个折叠就当做是一行就行了。
11.1.3 折叠的记忆
手动折叠,在下一次开档时就消失了,但我们可以使用 :mkview 把折叠的情形记忆起来,下一次加载同一个档案时就可以下 :loadview,记忆起以前折叠的情况。当然,使用手动折叠及记忆,在操作上并不是很方便,除非是把他写成 Vim script 来叫用。因此下一节要谈到自动折叠,这可能会比较实用一点。
11.2 自动折叠
这里比较实用的是依文件内的标志来折叠,因此其它的方式就只稍微介绍了。
11.2.1 以缩行为依据
:set foldmethod=indent 就会依缩行来折叠,本来预设是 :set foldmethod=normal。请注意,此时手动折叠的设定会被停止无法使用。
11.2.2 以特殊的表示法为依据
:set foldmethod=expr, 另外还要设定 :set foldexpr=...,可参考在线使用手册 :h fold-expr 的例子。
11.2.3 以语法为依据
这是在定义语法(syntax)文件时同时加入折叠的定义。然后,set foldmethod=syntax 就会依照这个语法定义文件去折叠,请 :h syn-fold。
11.2.4 以是否更改过为依据
这在进入 vimdiff(即 vim -d file1 file2) 时会自动进入 foldmethod=diff 的 模式,因此要 diff 设定项设在同一个屏幕显示才行。以便整体的浏览。当然要自行更 改默认值亦可。预设是:
setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1
这样一来,两个档案相同的部份会折叠起来,没有折叠的部份就是有差异的地方。
11.2.5 以文件上的标志为依据
这是跟据文章中的标志(marker)来做折叠。这些标志,起于 {{{,止于 }}},这中间的部份会折叠起来。通常这些标志是藏在批注栏里头, 例如 C 程序代码的 /* 及 */ 之间,shell script 的 # 之后,Vim script 的 " 之后,得视程序语言的不同而 定,因此一般的文章就不适合使用了。
这些预设的标志也可以由 foldmarker 来更改,但 为了文件的流通性,建议使用默认值就可以了。
当然,一些程序代码加载时再来设定 :set foldmethod=marker 就太麻烦了,这个设定可以设在文件内,例如:
#!/bin/sh
# 这是一个 sh script
# {{{
……
这里是 script 内容,由 vim 打开这
个档时,这个部份会自动折叠起来。
……
# }}}
# vim:fdm=marker:ts=2
评论