Vimscript编程指南

黑暗时代里插件的布局

我们要讨论的第一件事情是怎么样来结构化我们的插件。在过去,这是一个很繁琐的事情,但是现在有一个工具可以让插件的安装便得更加方便了。

首先我们要讨论一些基本的布局,然后再来看看怎么样使用方便的方法。

基本布局

一般情况下,Vim支持把插件拆分成多个文件。~/.vim目录下有多个文件夹来分别存放不同功能的文件。

不要紧张,我们只是讨论最重要的一些目录。在我们后面创建插件的时候,我们会一次讨论这些文件的。

在我们继续之前,我们需要先讨论一些词汇。

我一直把“插件”定义为“一大片做一连串相关事情的Vimscript代码”。Vim有对“插件”有一个更加明确的定义,即使~/.vim/plugins/目录下的一个文件。

大部分的时间我们会用第一个定义,如果有时候你觉得这个定义不清晰的话,那就请告诉我,我会试着来改写它。

~/.vim/colors

~/.vim/colors 目录下的文件都会被当作颜色方案。例如:如果你运行:color:mycolors命令,Vim会查找一个~/.vim/colors/mycolors.vim文件,并且执行它。这个文件需要包含所有的生成你的颜色方案的Vimscript命令。

我们这本书里不讨论颜色方案的设计。如果你想要设计自己的颜色方案的话,那么你应该拷贝一份现成的方案,并且修改它。记住:help是你的好朋友。

~/.vim/plugin

~/.vim/plugin目录下的文件会在每次vim启动的时候被运行的。这里的文件包含了那些你想要Vim在启动的时候加载的代码。

~/.vim/ftdetect

这个目录下的所有文件也都会在vim启动的时间加载运行。

“ftdetect”代表“filetype detect”。这个文件夹里的文件只需要设置自动命令来探测和设置文件的filetype。这也就表示它不能超过一行或者两行的长度。

~/.vim/ftplugin

~/.vim/ftplugin 目录下的文件都不同。

文件的名称很关键。当Vim把一个缓冲的filetype设置成一个值的时候,它会在~/.vim/ftplugin/目录下找到对应的文件。例如:如果你运行set filetype=derp,vim会查找~/.vim/ftplugin文件。如果这个文件存在的话,vim就会执行它。

Vim也支持~/.vim/ftplugin下存放目录文件。我们继续上面的例子:set filetype=derp,会让vim运行~/.vim/ftplugin/derp/目录下的所有*.vim文件。这样就可以让你把你的插件的ftplugin文件放在一个分组里。

因为这些文件在每次缓冲区的filetype改变时都会被执行,所以你只能设置缓存相关的本地变量。如果设置全局变量的话,会覆盖所有缓冲区的设置。

~/.vim/indent/

~/.vim/indent/下的文件和ftplugin文件很相似——它们都是根据文件名来加载的。

indent文件应该设置对应类型的文件的缩进选项,并且这些选项都是本地缓存相关的。

当然,你也可以把它放在ftplugin目录下,但是最好还是放在indent目录下,因为这样别的Vim用户就会很方便地理解你所做的事情。这个只是一个方便的用法,但是请做一个考虑周到的插件作者,并且遵循这个用法。

~/.vim/compiler/

~/.vim/compiler/目录下的文件和indent下的文件的工作方式完全一样。它们会根据自己的文件名来设置当前缓存的编译器相关的本地选项。

现在不必要考虑什么是编译器相关的选项,我们后面会讨论它的。

~/.vim/after

~/.vim/after/的作用有点黑。这个目录里的文件会在vim每次启动的时候进行加载,但是都是在~/.vim/plugin/下的文件加载完之后。

这样就允许你覆盖vim的内部文件的配置。实际上,你很少会用到它,不用担心这个文件夹,除非你想要改变vim的一些默认值。

~/.vim/autoload/

~/.vim/autoload/文件夹是一个非常有用的文件夹。它实际上的功能比它的名字听起来更加复杂。

简而言之:autoload是一个可以延迟加载你的插件的代码知道真正需要加载的一种方式。我们会在我们需要重构我们的插件的时候,再详细讨论这个,并且使用它。

~/.vim/doc/

最后,~/.vim/doc文件夹是你放插件的文档的地方。Vim在文档上花了很大的功夫(通过我们每次运行的:help命令可以证明它),所以给你的插件写好文档也是很重要的。

练习

  • 重新阅读这个章节。我不是开玩笑。确保,你能够大致了解每个文件夹的下所包含的文件的作用。