Oct 30

把 Vim 折迭(Folding)后,然后可以放入口袋?呵呵,当然不是这样啦!这是 Vim 的一个很特殊功能(原始Vi及一般的Vi clone皆无此功能)。简单的说,就是可以将文章内容,依据他的结构,把多行内容集中于其中一个代表行来显示,屏幕上只看得到章节标题那一代表行,这样整个文章结 构就一目了然,真正要阅读其他内容时,再由简单的按键或鼠标来打开。这对于不含目录结构的文件或程序代码很有用处。

11.1 手动折迭
折迭的行为表现是由Foldmethod[fdm] 这个设定项来控制的,这个设定项预设是manual,就是手动设定,这是本节所要叙述的最基本折迭方式。其他折迭方式会在下一节介绍,折迭的方式,其中会有互相冲突的地方,使用上请注意一下。

11.1.1 折迭的产生
手动产生折迭(set fdm=manual) 的指令是 zf、zF、:fo[ld],以下以例子来说明较清楚。
zfap 将游标所在处的那个段落折迭成一行。
zf7G 自光标所在处至全文第 7 行折迭起来。
:3,9fold 将第 3 行至第 7 行折迭起来。
5zF 将光标所在处起算 5 行的内容折迭起来。
也可以将所要折迭的部份以 Shift+v 标记起来,然后按 zf 就会将标记的内容折迭起来。

11.1.2 折迭的操作
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

本文为转载,但是遗憾的是没有找到原始出处,在此仍然表示感谢。

Leave a Reply