Vimscript编程指南

响应式编程

现在为止我们已经讨论了很多可以用来提高vim效率的命令。除了自动命令分组意外,其他的命令都是单行的,并且是可以直接添加到vimrc文件里的。

在这本书的后面内容里,我们将会从一门真正的编程语言的角度来讲解vim脚本,但是在开始编写vim脚本之前,我们先来讨论一下怎么在写大段代码的时候保持思路清晰。

注释

vim脚本的功能非常强大,但是经过这么多年,已经发展的成一个很容易让人迷乱的语言。

选项和命令往往都很简洁,也导致它们的可读性变得很差,同时为了保持兼容性,有大大增加了代码的复杂度。写一个用来帮助用户自定义vim的插件有带来了另一层的复杂性。

当你写的vim脚本行数比较多的时候就得要细心了,最好能加个注释表明具体的功能,如果有相关的材料最好说出来。

这不仅仅是为了能够让你在几个月甚至是几年后能够来维护它,如果你把在GitHub上分享你的vimrc文件的时候,它也能够帮助别人理解你的代码。

分组

我们对于编辑和加载vimrc文件的映射能够让我们很快的来往vimrc文件里添加新的配置。但是这样也会导致配置项比较杂乱,并且无法控制和管理。

一个比较好的方式来防止上的问题就是用vim的代码折叠功能把代码行分成不同的组。如果你之前没有用过vim的代码折叠功能,现在看看下面这个很不错的的教程。

首先我们要设置vim的代码折叠功能。把下面的脚本加入到你的vimrc文件里:


augroup filetype_vim
  au!
  au FileType vim setlocal foldmethod=marker
augroup END

这个会告诉vim对所有的vim脚本文件用marker方法来折叠代码。在你的vimrc文件的窗口里运行:setlocal foldmethod=marker。直接重新加载vimrc文件是没有作用的,因为vim已经设置了这个文件的类型,所以文件类型的事件是不会触发的,因此自动命令也就不会执行了。不过以后你就不需要手动来设置这个选项了。

现在在自动命令的前面和后面加上一些文本,使得它看起来和下面差不多:

     
" Vimscript file settings ---------------------- {{{
augroup filetype_vim
    au!
    au FileType vim setlocal foldmethod=marker
augroup END
" }}}

返回到normal模式下,把你的光标放在任意一行,然后输入za。Vim会把从包含“{{{”和“}}}”的文本行进行折叠。再次输入za会打开代码行。

开始你可能会认为显示地加注释来表示代码折叠显得比较丑陋。我开始也是这么认为的。对于大多数文件我都认为是不对的。因为并不是每个人都用相同的编辑器,所以对于那些用非Vim编辑器来查看代码的人而言这就是增加了干扰。

vimrc文件是个特例,因为很少有不用vim的人会来读你的vimrc文件,尤其重要的一点是,当你在编写vim脚本时,你要显式地进行分组。

试着这样做一段时间,慢慢加深这个想法。

缩写名称

Vim允许你用大部分命令和选项的缩写词。例如,下面的两个命令的功能是一样的:


:setlocal wrap
:setl wrap

不过我不建议你在你的vimrc文件和插件的代码里用他们,因为vim脚本本身就足够简洁,而且还比较晦涩——运用缩写词只会让它变得更加难以阅读。即是你知道一个命令的缩写的意义,但是别人也会许不知道。

不过说回来,对于在编码时手动输入的命令,缩写词是很有用的,因为它们可以提高输入效率。因为一旦你输入了换行符,别人是不会再看到的,所以能不多按键盘就尽量不多按。

练习

  • 浏览你的整个vimrc文件,把命令行按照 相关性进行分组。例如“基本设置”,“特殊文件设置”,“映射”已经状态栏。为每个区域添加折叠标志。
  • 试着找出怎么才能够在每次打开文件时让vim自动对文件文件进行折叠动作。你可以先看看:help foldlevelstart。
  • 浏览你的vimrc文件,把所有的缩写词都改成命令的全名。
  • 浏览你的vimrc文件,确保没有任何隐私信息,然后把创建一个git或者Mercurial仓库,把vimrc文件放进去,然后添加一个到这个文件的链接。
  • 把你刚刚创建的仓库提交到BitBuck或者GitHub上去,让别人能够看见它并且能够参考它。记得要频繁提交当你修改的时候,这样可以记录你修改的地方。
  • 如果你在多个机器上用到vim,可以把仓库里的vimrc文件下载下来,然后建立一个符号链接。这样就可以很方便地让你的vim用同一份配置文件了。