Vimscript编程指南

基本代码折叠

如果你从来都没有用过Vim的代码折叠功能的话,你就不会知道你错过了什么。阅读:help usr_28,然后在你的日常工作中花些时间来使用一下vim的代码折叠功能。如果你已经熟悉了它的使用的话,再回到本章的内容上来。

不同类型的代码折叠

Vim有6种不同的方式用来定义代码折叠

手动方式

你手动创建折叠,这些折叠会被保存在内存里,不过你每次关闭vim,在你下次继续编辑这个文件的这些折叠就会丢失。

这个方法适用于你需要用映射来方便地创建折叠的情景。不过我们这本书里不讨论这个内容,不过你需要记住这个,以免你碰到类似的需要使用这个方法的场景。

Marker

Vim可以根据你的文本里的特殊字符串来进行代码折叠。

大多数情况下,这些特殊字符串都是放在注释里的,例如(//{{{),但是在有些编程语言里,你可以利用语言自身的语法来实现,例如Javascript里的{和}。

不过在你的代码里加上纯粹只是为了然文本编辑器进行折叠的注释会让你的代码显得非常的难看,但是这个功能的有点在于你可以手动添加任意的代码折叠。这个功能在你想要把你一个比较大的文件按照一种特别的方式来进行折叠的时候会显得非常的有用。

Diff

这个特殊的代码折叠模式就在比较文件的时候使用的。这个我们不会花时间讨论的,因为这种折叠是由Vim自己进行处理的。

Expr

这种方式让你用Vimscript代码来定义折叠的文职。这个是最强大的一种方法,但是需要做的工作也是最多的,我们后面会讲解这种方法的。

Indent

Vim也可以使用你代码自身的缩进来觉得折叠的位置。相同缩进的文本行都会一起折叠,空行以及空格行都会简单的跟着附近的文本进行折叠。

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)
               total *= i
          total.

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

在你的Potion插件的目录里新建一个ftplugin目录,然后在里面新建一个potion文件夹。最后,在potion文件夹里再建一个folding.vim文件。

记住,当一个缓冲区的filetype被设置成potion的时候,vim就会运行上面的folding.vim文件(因为这个文件在potion文件夹里)。

把所有代码折叠相关的代码都放在一个对应的文件里,这样的话可以很好的组织插件的不同功能的代码。

把下面的内容加入到这个文件里:


     setlocal foldmethod=indent

关闭Vim,然后再打开factorial.pn文件。用zR,zM和za来试试代码折叠的功能。

一行代码就给我们带来了很好的代码折叠效果!这个确实很酷。

不过,你应该注意到了,factorial函数的代码块被折叠了,但是里面的内部循环部分的代码没有被折叠。究竟是怎么一回事呢?

事实上是因为当你是用indent来进行代码折叠的时候,Vim会忽略以#开始的文本行。这个在编辑C语言的时候很有效(在这里#是一个预编译符),但是在编辑其他的语言的时候就没有用了。

我们在ftplugin/potion/folding.vim里添加一个新的命令来修复这个问题:


     setlocal foldmethod=indent
     setlocal foldignore=

关闭然后再打开factorial.vim,现在这个内容的代码块也能够被正确的进行折叠了。

练习

  • 阅读:help foldmethod;
  • 阅读:help fold-manual;
  • 阅读:help fold-marker和:help foldmarker;
  • 阅读:hlep fold-indent;
  • 阅读:help fdl和:help foldlevelstart;
  • 阅读:help foldminlines;
  • 阅读:help foldingnore。