|
发表于 2004-9-14 22:16:45
|
显示全部楼层
- FOLD
- *fold.txt* For Vim version 6.3. 最后修改: 2004年6月
- VIM REFERENCE MANUAL by Bram Moolenaar
- 翻译:Zimin<cranecai@users.sf.net>
- 折叠 *Folding* *folding*
- 你可以在用户手册的第 28 章找到有关折叠的序论。
- |usr_28.txt|
- 1. 折叠方法 |fold-methods|
- 2. 折叠命令 |fold-commands|
- 3. 折叠选项 |fold-options|
- 4. 折叠表现 |fold-behavior|
- {Vi has no Folding}
- {not available when compiled without the +folding feature}
- 1. 折叠方法 *fold-methods*
- 可用选项 'foldmethod' 来设定折叠方法。
- 当选项 'foldmethod' 的值不是 "manual" 时,所有的折叠都会被删除并且创建新的。
- 如果设置成了 "manual",将不除去已有的折叠。可以利用这一点来先自动定义折叠,
- 然后手工调整。
- 有 6 种方法来选定折叠:
- manual 手工定义折叠
- indent 更多的缩进表示更高级别的折叠
- expr 用表达式来定义折叠
- syntax 用语法加亮来定义折叠
- diff 对没有更改的文本进行折叠
- marker 对文中的标志折叠
- 手 工 *fold-manual*
- 使用命令来手工定义要折叠的范围。分析文本并发现折叠的脚本也可用这种方法。
- 折叠的级别仅由嵌套次数来定义。要对一定行数的折叠增加级别,可以在相同的几行里再
- 定义折叠。
- 当你退出文件编辑时,手工折叠会被遗弃。要保存折叠,使用 |:mkview| 命令。之后要
- 恢复可以使用 |:loadview|。
- 缩 进 *fold-indent*
- 由缩进行自动定义折叠。
- 折叠级别由缩进行计算而得,用 'shiftwidth' (向下取整)划分。连续的、有同样或
- 更高的折叠级别的行,形成一个折叠。在其中,有更高折叠级别的行形成嵌套的折叠。
- 嵌套的级别数受 'foldnestmax' 选项限制。
- 某些行会被忽略并得到上一行或下一行的折叠级别(取较小值)。符合条件的这样的行
- 要么是空行,要么以 'foldignore' 选项里包含的字符开始。在查找 'foldignore' 里
- 包含的字符时,空格会被忽略。对于 C 使用 "#" 来略过要预处理的那些行。
- 当你想用另一种方式来略过行时,使用 'expr' 方法。在 'foldexpr' 中 |indent()|
- 函数被用来取得一行的缩进。
- 表 达 式 *fold-expr*
- 就象用 "indent" 方式一样,表达式方式的折叠也是由折叠级别自动定义的。选项
- 'foldexpr' 的值被计算并作为一行的折叠级别。如:
- 对所有以 Tab 符开始的连续的几行,创建折叠:
- :set foldexpr=getline(v:lnum)[0]=="\\t"
- 调用一函数来计算折叠级别:
- :set foldexpr=MyFoldLevel(v:lnum)
- 折叠用空行分开的段落:
- :set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
- 同上:
- :set foldexpr=getline(v:lnum-1)=~'^\\s*$'&&getline(v:lnum)=~'\\S'?'>1':1
- Note:对 escape 类的字符必须使用反斜杠符。(空格,反斜杠,双引号,等等,参考
- |option-backslash|)
- 这些是表达式的计算条件:
- - 当前缓冲和窗口值依所在行而定
- - 变量 "v:lnum" 被定为该行行号
- - 计算结果将以一下方式解释:
- 值 代表
- 0 这行不折叠
- 1, 2, .. 这行的折叠级别 1,2 等
- -1 折叠级别没有定义,使用这行之前或之后一行的级别值,取
- 其中较小的一个。
- "=" 使用上一行的折叠级别。
- "a1", "a2", .. 上一行的折叠级别加 1,2,..
- "s1", "s2", .. 上一行的折叠级别减 1,2,..
- "<1", "<2", .. 这个折叠级别在该行结束
- ">1", ">2", .. 这个折叠级别在该行开始
- 不需要用 ">1"("<1")标志折叠的开始(结束)。当这行折叠级别高于(低于)上一行
- 的级别时,折叠将开始(结束)。
- 表达式必须没有副作用。在缓冲里的文字,光标位置,查找模式,选项等等,不能被改动。
- 表达式中有错误或者计算结果不能识别时,Vim 不会产生错误消息,而是将折叠级别设为
- 0。所以当需要调试时,可将 'debug' 选项设为 "msg",错误消息就可以被见到了。
- Note:由于每一行关于表达式的值都要被计算,这一折叠方式可能会很慢!
- 最好避免使用 "=" , "a" 和 "s" 作为返回值,因为 Vim 不得不经常向后回溯以得到折叠
- 级别。这会降低执行速度。
- |foldlevel()| can be useful to compute a fold level relative to a previous
- fold level. But note that foldlevel() may return -1 if the level is not known
- yet. And it returns the level at the start of the line, while a fold might
- end in that line.
- 语 法 *fold-syntax*
- 由带有 "fold" 参数的语法项来定义折叠。|:syn-fold|
- 折叠级别由嵌套的折叠数来定义。嵌套数由 'foldnestmax' 限定。
- Be careful to specify proper syntax syncing. If this is not done right, folds
- may differ from the displayed highlighting. This is especially relevant when
- using patterns that match more than one line. In case of doubt, try using
- brute-force syncing:
- :syn sync fromstart
- 比 较 *fold-diff*
- 对没有改动的文本或靠近改动的文本自动定义折叠。
- 这个方法仅适用于当前窗口的 'diff' 选项被设定且不同之处被显示时才有效。不然,整
- 给缓冲就是一个大的折叠。
- 选项 'diffopt' 可以指定上下文。即折叠和没有被折叠包括的一处不同之间的行数。如
- ,设定上下文为 8:
- :set diffopt=filler,context:8
- 默认值是6。
- 当设定了 'scrollbind' 选项时,Vim 会试图在其它比较窗口中显示同一个折叠,这样
- 这些窗口就会显示同一处文本。
- 标 志 *fold-marker*
- 在文本中可以加入标志来指明折叠开始和结束的地方。这可以让你精确的定义折叠。这也
- 让你可以放心地删除和复制折叠而不用担心误包括了某些行。选项 'foldtext' 可以显示
- 折叠标志之前的文本。这样做也可以帮助对折叠起名。
- 标志可以包含级别数,也可以使用匹配对。包含级别数较简单,你无须添加结束标志,并
- 可以避免标志不配对的问题。如:
- /* global variables {{{1 */
- int varA, varB;
- /* functions {{{1 */
- /* funcA() {{{2 */
- void funcA() {}
- /* funcB() {{{2 */
- void funcB() {}
- 折叠开始于 "{{{" 标志。接下去的数字决定了折叠级别。产生的效果依当前折叠级别和
- 该折叠标志给定的级别之差而定:
- 1. 如果遇到级别相同,上一个折叠结束,另一个有同样级别的折叠开始。
- 2. 如果标志的级别高,开始一个嵌套的折叠。
- 3. 如果标志的级别低,所有高于当前级别也包括当前级别的折叠结束,且指定级别的折
- 叠开始。
- 数字指定了折叠级别。不能使用 0。
- 你可以使用 "}}}" 带上一个数字来表示这个级别的折叠结束。此行以下的折叠级别将小
- 于当前指定的级别。Note:Vim 不会回溯匹配的标志(这将耗费太多的时间)。如:
- {{{1
- fold level here is 1
- {{{3
- fold level here is 3
- }}}3
- fold level here is 2
- 你也可以用一对匹配标志 "{{{" 和 "}}}" 来定义折叠。每个 "{{{" 使折叠级别加1,
- "}}}" 使折叠级别减1。注意一定要使标志匹配!如:
- {{{
- fold level here is 1
- {{{
- fold level here is 2
- }}}
- fold level here is 1
- 带数字的标志和没有带数字的标志可以混合使用。对于一个大折叠我们可以使用带数字的
- 标志,在一个函数里我们可以使用不带数字的。如对文件中的 "structure definitions",
- "local variables" 和 "functions" 各区域使用级别1的折叠。对定义和函数使用级别2的
- 标志。而在函数内部使用不带数字的标志。当你在一函数中作更改以分割折叠时,你无须
- 记着标志在那里。
- 选项 'foldmarker' 可设定所用的标志。建议保留默认值 "{{{,}}}"。这样在 Vim 用户间
- 交换文件时就不会出问题。有些时候要编辑的文件必须改变该选项。(如,文件包含了来自
- 另一个编辑器的折叠标志,或对于当前文件的语法折叠标志会产生歧义等)。
- *fold-create-marker*
- "zf" 可通过标志来创建一个折叠。 Vim 将为你插入开始和结束标志。这些标志由
- 'foldmarker' 指定。标志会被添加在行末。'commentstring' 不为空时也会被使用。
- 在以下情况,可能无法正常工作:
- - 此行已有一个带数字的标志了。Vim 无法判断该如何做。
- - 在附近的折叠里使用了带数字的标志,使添加被阻。
- - 这行包含在一注释中,且 'commentstring' 不为空,且嵌套的注释是非法的。如,在 C
- 的注释中加入 /* {{{ */ ,这将使现有的注释中断。你可以在注释之前或之后添加标志,
- 或手工添加。
- 总的来说,当你已有带数字的标志时,再让 Vim 为你创建标志不是个好主意。
- *fold-delete-marker*
- "zd" 可用来删除一个用标志定义的折叠。 Vim 将为你删除标志。Vim 将遵照 'flodmarker'
- 在折叠的开始和结束处查找开始和结束标志。如果在标志周围的文字同 'commentstring' 相
- 匹配,这些文字也会被删除。
- 但在以下情况无法正确地执行:
- - 当一行包含有多于一个的标志且其中一个指定了级别。Vim 不考虑是不是想要的结果,而
- 仅删除第一个标志。
- - 当这个标志包含带有数字且同时被用来开始或结束几个折叠时。
- 2. 折叠命令 *fold-commands* *E490*
- 所有的折叠命令用 "z" 开头。提示:如果你从侧面看 "z" 象一张叠起来的纸。
- 创 建 和 删 除 折 叠
- *zf* *E350*
- zf{motion} 或
- {Visual}zf 创建折叠操作符
- 仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
- 用 "manual" 方式,新建的折叠会被关闭。同时 'foldenable'
- 会被设定。
- 参考 |fold-create-marker|。
- *zF*
- zF 对 N 行创建折叠。如 "zf" 。
- :{range}fo[ld] *:fold* *:fo*
- 对 {range} 内的行创建折叠。如 "zf" 。
- *zd* *E351*
- zd 删除 (delete) 在光标下的折叠。当光标在被折叠的行上,该折叠被删除。
- 嵌套的折叠上移一级。在可视模式下(基本上)所有在所选区域的折叠都
- 被删除。注意:这种一次删除多个折叠的简单方法不可恢复。
- 仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
- 参考 |fold-delete-marker|。
- *zD*
- zD 循环删除 (Delete) 光标下的折叠。在可视模式下(基本上)所有在所选
- 区域的折叠和嵌套的折叠都被删除。
- 仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
- 参考 |fold-delete-marker|。
- *zE* *E352*
- zE 除去 (Eliminate) 所有在窗口里的折叠。
- 仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
- 参考 |fold-delete-marker|。
- 打 开 和 关 闭 折 叠
- 一个小于 'foldminlines' 的折叠的显示就象它被打开时一样。所以,以下的命令对于小
- 折叠所起的作用与描述不同。
- *zo*
- zo 打开 (open) 在光标下的折叠。当给定一个数字时,相应深度的折叠被
- 打开。在可视模式下,所选区域的所有行的一级折叠被打开。
- *zO*
- zO 循环打开 (Open) 光标下的折叠。不在光标下的折叠不改变。
- 在可视模式下,打开所有的在选中区域里的折叠,包括被部分选中的。
- *zc*
- zc 关闭 (close) 在光标下的折叠。当给定一个数字时,相应深度的折叠被
- 关闭。在可视模式下,所选区域里的所有行的一级折叠被关闭。
- 'foldenable' 被设定。
- *zC*
- zC 循环关闭 (Close) 在光标下的所有折叠。不在光标下的折叠不改变。
- 在可视模式下,关闭所有的在选中区域里的折叠,包括被部分选中的。
- 'foldenable' 被设定。
- *za*
- za 当光标位于一关闭的折叠上时,打开之。当折叠嵌套时,你可以使用
- "za" 数次。当给定一个数字时,打开相应数量的被关闭的折叠。
- 当光标位于一打开的折叠上时,关闭之且设定 'foldenable' 。这仅关
- 闭一级折叠,因为再次使用 "za" 将再次打开折叠。当给定一个数字时,
- 关闭相应数量的折叠(这不同于重复 "za" 许多次)。
- *zA*
- zA 当处在一关闭的折叠上时,循环的打开折叠。
- 当处在一打开的折叠上时,循环的关闭折叠且设定 'foldenable' 。
- *zv*
- zv 查看 (view) 光标所在的行:仅打开足够的折叠使光标所在的行不被折叠。
- *zx*
- zx 更新折叠:撤消被手工打开和关闭的折叠:再次使 'foldlevel' 生效。然
- 后使用 "zv" :查看光标所在行。
- *zX*
- zX 手工恢复被打开和关闭的折叠:再次使用 'foldlevel'
- *zm*
- zm 折起更多 (more):'foldlevel' 减 1。如果 'foldlevel' 已经为 0,
- 则不会被减小。
- 'foldenable' 被设定。
- *zM*
- zM 关闭所有折叠:'foldlevel' 设为0。
- 'foldenable' 被设定。
- *zr*
- zr 减少 (reduce) 折叠: 'foldlevel' 加 1。
- *zR*
- zR 打开所有的折叠。'foldlevel' 设为最高级别。
- *:foldo* *:foldopen*
- :{range}foldo[pen][!]
- 在 {range} 内打开折叠。当加上 [!] 时,所有的折叠都被打开。对查
- 看在 {range} 内的所有文本很有用。没有 [!] 时,打开折叠的一级。
- *:foldc* *:foldclose*
- :{range}foldc[lose][!]
- 在 {range} 内关闭折叠。当加上 [!] 时,所有的折叠都被关闭。对隐
- 藏在 {range} 内的所有文本很有用。没有 [!] 时,关闭折叠的一级。
- *zn*
- zn 不折叠 (none):复位 'foldenable'。所有的折叠被打开。
- *zN*
- zN 一般折叠 (normal):设定 'foldenable' 。所有的折叠都展现它们之
- 前的样子。
- *zi*
- zi 翻转 'foldenable' 的值.
- 在 折 叠 间 移 动
- *[z*
- [z 到当前打开的折叠的开始。如果已在开始处,移到包含这个折叠的折叠
- 开始处。如果没有包含它的折叠,命令执行失败。
- 当给定一数字,重复此命令 N 次。
- *]z*
- ]z 到当前打开的折叠的结束。如果已在结束处,移到包含这个折叠的折叠
- 结束处。如果没有包含它的折叠,命令执行失败。
- 当给定一数字,重复此命令 N 次。
- *zj*
- zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
- 当给定一数字,重复此命令 N 次。
- 此命令可在 |operator| 后使用。
- *zk*
- zk 向上移动到前一折叠的结束处。关闭的折叠也被计入。
- 当给定一数字,重复此命令 N 次。
- 此命令可在 |operator| 后使用。
- 对 折 叠 执 行 命令
- :[range]foldd[oopen] {cmd} *:foldd* *:folddoopen*
- 对所有不在关闭的折叠中的行执行 {cmd}。
- 给定 [range] 时,仅对范围内那些行起作用。
- 每次命令被执行时,光标会被定位在要被操作的行上。
- 就如 ":global" 命令:首先标记出所有不在关闭的折叠中的行。然后
- 对所有标记过的行,执行 {cmd}。所以当 {cmd} 改变了文本的折叠时
- ,对命令执行的位置没有影响(当然,删除行例外)。
- 如:
- :folddoopen s/end/loop_end/ge
- 使用标志 "e" 要避免当 "end" 不匹配时得到错误消息。
- :[range]folddoc[losed] {cmd} *:folddoc* *:folddoclosed*
- 对所有在关闭的折叠里的行,执行 {cmd}。
- 其它同 ":folddoopen" 命令。
- 3. 折叠选项 *fold-options*
- 颜 色 *fold-colors*
- 对关闭的折叠的颜色的设定由 |hl-Folded| 决定。对折叠栏的颜色的设定由
- |hl-FoldColumn| 决定。
- 下面是设定颜色的例子:
- :highlight Folded guibg=grey guifg=blue
- :highlight FoldColumn guibg=darkgrey guifg=white
- 折 叠 级 别 *fold-foldlevel*
- 'foldlevel' 是个数字选项:数字越大则打开的折叠更多。
- 当 'foldlevel' 为 0 时,所有的折叠关闭。
- 当 'foldlevel' 为正数时,一些折叠关闭。
- 当 'foldlevel' 很大时,所有的折叠打开。
- 'foldlevel' 的改变生效后,折叠可以被手动地打开和关闭。
- 当其值增大,在新级别之上的折叠被打开。没被手工打开的折叠会被关闭。
- 当其值减小,在新级别之上的折叠被关闭。没被手工关闭的折叠会被打开。
- 折 叠 文 本 *fold-foldtext*
- 'folftext' 是个字符串选项,定义了一个表达式。这个表达式被用来求得对关闭的折叠
- 要显示文字的。如:
- :set foldtext=v:folddashes.substitute(getline(v:foldstart),'/\\*\\\|\\*/\\\|{{{\\d\\=','','g')
- 显示了折叠的第一行,除去其中的 "/*", "*/" 和 "{{{" 。
- Note:使用反斜杠是为了避免一些字符被 ":set" 命令解释。使用一个函数更简单:
- :set foldtext=MyFoldText()
- :function MyFoldText()
- : let line = getline(v:foldstart)
- : let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
- : return v:folddashes . sub
- :endfunction
- 计算 'foldtext' 是在 |sandbox| 里完成的。所要显示的内容在当前窗口出现。错误被
- 忽略。
- 默认值是 |foldtext()|。对于大多数类型的折叠它可以返回适合的文字。如果你不喜欢
- 它,你可以自己指定 'foldtext' 。可以使用以下这些 Vim 变量:
- v:foldstart 在折叠里的第一行
- v:foldend 在折叠里的最后一行
- v:folddashes 一个含有逗号的字符串用来表示折叠级别
- v:foldlevel 折叠级别
- 在结果中,TAB 被替换为空格,且不可打印的字符被替换为可打印的字符。
- 结果行被截短以适合窗口的宽度,而不会使用换行。
- 当在文字后有空余时,用 'fillchars' 来填充。
- Note:对那些 ":set" 命令作特殊处理的字符在其前面需加上反斜杠。如:空格,反斜杠
- 和双引号。 |option-backslash|
- 折 叠 栏 *fold-foldcolumn*
- 'foldcolumn' 是个数字,它设定了在窗口的边上表示折叠的栏的宽度。当为0时,没有折
- 叠栏。一个普通值是 4 或 5。最小可用的值是2,最大是12。
- 一个打开的折叠由一栏来表示,顶端是 '-' 其下方是 '|'。这栏在折叠结束的地方结
- 束。当折叠嵌套时,嵌套的折叠对其被包含的折叠右移一字符而成。
- 一个关闭的折叠由 '+' 表示。
- 当折叠栏太窄而不能显示所有折叠时,显示一数字来表示嵌套的级别。
- 在折叠栏点击鼠标,可以打开和关闭折叠:
- - 点击 '+' 打开在这行关闭的折叠
- - 在任何其他非空字符上点击,来关闭在这行上的折叠
- 其 他 选 项
- 'foldenable' 'fen': 当没有设定时,打开所有折叠。
- 'foldexpr' 'fde': 用于 "expr" 折叠的表达式。
- 'foldignore' 'fdi': 用于 "indent" 折叠的字符。
- 'foldmarker' 'fmr': 用于 "marker" 折叠的标志。
- 'foldmethod' 'fdm': 当前折叠方式。
- 'foldminlines' 'fml': 一个折叠的最小显示行数。
- 'foldnestmax' 'fdn': 用于"indent" 和 "syntax" 折叠的最大嵌套数。
- 'foldopen' 'fdo': 哪一种命令可以打开关闭的折叠。
- 'foldclose' 'fcl': 当光标不在折叠上时关闭折叠。
- 4. 折叠表现 *fold-behavior*
- 当上下移动和滚动时,光标将移至连续折叠的行的第一行。当光标已在被折叠的行上时,
- 它移动到下一个没有被折叠的行上,或下一个关闭的折叠。
- 当光标在被折叠的行上时,光标总是显示在第一栏里。光标本应被在其实际位置被显示,
- 但因为被折叠而无法做到。
- 移动命令处理连续被折叠的行就象处理空行一样。如, "w" 命令在第一栏停一次。
- 在插入模式下,光标所在的行不会被折叠。这让你看得见你键入的内容。
- 当使用操作符时,一个关闭的行被作为整体处理。所以 "dl" 在光标下删除了整个关闭的
- 折叠。
- 对 Ex 命令的执行范围总是从折叠的第一行到折叠的最后一行。所以,命令:
- :s/foo/bar/g
- 当光标在关闭的折叠上时,它将在整个折叠里用 "bar" 替换 "foo" 。
- 对 |:folddoopen| 和 |:folddoclosed| 不会产生这种情况。
- 当在编辑一个已经被编辑过的缓冲时,上次被使用的折叠设置会被再次使用。对手工定义
- 折叠方式,已经被定义的折叠会被恢复。对所有的折叠方式,手工打开和关闭的折叠会被
- 恢复。如果这个缓冲曾经在这个窗口里被编辑,过去用的值被恢复。否则,来自过去编辑
- 窗口的值被使用。
- vim:tw=78:ts=8:ft=help:norl:
复制代码 |
|