基本折叠

如果你从来没用过 Vim 的代码折叠,那可就错过了一个很棒的功能。 阅读 :help usr_28 并花点时间在平时的工作中尝试着用用。 等你熟悉了之后,再回到本章来。

折叠类型

Vim 支持六种不同的方式来定义文本应该如何折叠。

手动(Manual)

你可以手动创建折叠,Vim 会把它们存储在内存中。 当你关闭 Vim 后,它们就消失了,而下次编辑文件的时候,又得重新创建。

如果结合一些自定义的映射来轻松地创建折叠,那这种方式还算便利。 我们并不会在本书中这样做,但是要有这个概念,如果刚好碰到这种情况,可能会派上用场。

标记(Marker)

Vim 基于实际文本中的字符来折叠代码。

通常,这些字符会放在注释中(例如 // {{{), 但是,在某些语言中,你可以取巧地用些语言本身语法中的东西,比如 Javascript 中的 {}

也许添加一些纯粹为文本编辑器服务的注释会让代码变得杂乱无章,但好处就是让你能为一个指定文件手动创建折叠。 如果你正在处理一个很大的文件,并且想以特殊的方式来组织的话,这将是个非常棒的办法。

差分(Diff)

在处理差分文件时的一种特殊折叠模式。我们不会讨论它,因为 Vim 会自动处理它。

表达式(Expr)

这允许你使用一段自定义的 Vimscript 代码片段来定义在哪里折叠。 这是最强大的方式,但也需要最多的工作。 我们会在下一章节继续讲到它。

缩进(Indent)

Vim 使用代码的缩进来决定折叠位置。 相同缩进的行折叠到一起,只有空白字符的行(以及空行)会并入附近的折叠中。

这实际上可以直接使用,因为代码已经有了缩进;你唯一需要做的就是打开开关。 我们将把它作为 Potion 文件的第一种折叠方式。

Potion 的折叠

我们再重新看看之前的 Potion 样例:

factorial = (n):
    total = 1
    n to 1 (i):
        total *= i.
    total.

10 times (i):
    i string print
    '! is: ' print
    factorial (i) string print
    "\n" print.

函数主体和循环都缩进过了。这意味着我们不用费太大力气就能通过缩进折叠达到基本的折叠效果。

在我们开始之前,先到 total *= i. 上面添加一行注释,这样我们就有了一个很好的多行内部代码块来做测试。 当你在做后面的练习时,会知道为什么需要这样做,但是现在,请相信我。 现在,文件应该看上去如下:

factorial = (n):
    total = 1
    n to 1 (i):
        # Multiply the running total.
        total *= i.
    total.

10 times (i):
    i string print
    '! is: ' print
    factorial (i) string print
    "\n" print.

在 Potion 仓库中,创建一个 ftplugin 目录,并在里面创建一个 potion 目录。 最后,在这个目录里面创建一个 folding.vim 文件。

记住,当 Vim 把一个缓存区的 filetype 设置为 potion 时,它就会运行这个文件中的代码 (因为它在名为 potion 的目录中)。

把所有折叠相关的代码都放在一个单独的文件中是个很好的想法,这会帮助我们有效的组织插件中各种各样的功能。

把以下一行添加到文件中:

setlocal foldmethod=indent

关闭 Vim 并重新打开 factorial.pn 文件。用 zRzM、以及 za 命令来试试新的折叠。

一行 Vimscript 代码就能提供些有用的折叠!这非常的酷!

你也许注意到了,factorial 函数内部的循环并没有折叠,尽管它们缩进了。 发生了什么?

原来,在使用 indent 折叠时, Vim 会忽略以 # 字符起始的行。 在编辑 C 文件时,这没问题(# 会发出预处理指令的信号),但在编辑其他类型的语言时就没什么用了。

让我们在 ftplugin/potion/folding.vim 文件中再添加一行来修复它:

setlocal foldmethod=indent
setlocal foldignore=

关闭并重新打开 factorial.pn ,现在内部代码块也能正确折叠了。

练习

阅读 :help foldmethod

阅读 :help fold-manual

阅读 :help fold-marker:help foldmarker

阅读 :help fold-indent

阅读 :help fdl:help foldlevelstart

阅读 :help foldminlines

阅读 :help foldignore

原文地址:http://learnvimscriptthehardway.stevelosh.com/chapters/48.html