这几天想知道如何写一个vim脚本,查看vim的帮助文档,全是英语,本人英语不怎么好,于是去网上找中文资料,又找不到,没办法,只好硬着头皮翻译一下了,也顺便服务一下大众,说不定哪天你也想写了,百度一下,就找到这篇了呢。
这是其中的一部分,我会陆续把剩下的翻译完并传上来的。不墨迹了,开始:
-----------------------------------------------------------------------------------------------------------------------------------------
当你觉得人们会用(你的脚本)的话,那么你就可以自己编写一个Vim脚本,这个脚本就叫Vim插件。Vim用户可以将你的脚本放到他们的插件目录中来使用它。
实际上有两种类型的插件:
全局插件:适合各种类型的文件。
文件类型插件:只适合某种特定类型的文件。
这一节将说明第一种类型脚本的写法,其中很多部分对于文件类型插件来说同样重要并适用,文件类型插件将在下一章节中讲述。
名字:
首先,你必须为你的插件选择一个合适的名字。一个名字必须清晰的阐明了它的功能,并且不可能与某些插件重名,这些插件使用同样的名字但是完成功能完全不同。还有,请将名字限定在8个字符以内,这样可以避免在老版Windows系统中使用时带来的麻烦。
一个能够更正输入的插件(corrects typing),可以起名为“typecorr.vim”。这里,我们将用它作为示例。
因为插件是为每一个人服务的,因此,需要遵循一些指导方针。这些将被一步步的说明。完整的示例在最后面。
BODY
让我们从插件的Body部分开始,这些行实现了一些有用的功能:
14 iabbrev teh the
15 iabbrev otehr other
16 iabbrev wnat want
17 iabbrev synchronisation
18 \ synchronization
19 let s:count = 4
当然,真正的代码行数要比这些多得多!!
前面的行号只是为了说明一些事情,千万不要在你的插件文件中输入这些行号!!
HEADER
你可能会在以后对你的插件进行一些更正从而产生出许多版本。还有,当你创建了这个脚本,用户就会想知道是谁写了这么一个极好的插件和去哪里对这个插件发表评论。因此,在你的插件顶部放置一个header吧:
1 " Vim global plugin for correcting typing mistakes
2 " Last Change: 2000 Oct 15
3 " Maintainer: Bram Moolenaar <Bram@vim.org>
关于版权和许可:一旦你的插件变得相当实用,以至于需要限制它们的创建时,请指明你的插件是否是公有还是需要使用Vim许可。将一个简短的标注放在插件的顶部就足够了。例如:
4 " License: This file is placed in the public domain.
LINE CONTINUATION, AVOIDING SIDE EFFECTS *use-cpo-save*
在上面的第18行,使用了行延续符。
在这里,用户如果设定了compatible【1】就将会遇到麻烦,他们将会获得一个出错信息。我们不能重新设置compatible,因为那样会有很多负面影响。为了避免这些,我们需要将cpoptions 选项设定为Vim的默认值并在稍后恢复设置。做起来像这样:
11 let s:save_cpo = &cpo
12 set cpo&vim
..
42 let &cpo = s:save_cpo
我们首先将原cpoptions的值存储在变量s:save_cpo中。在插件的最后,这个值的设定被重新恢复了。
注意,这里用到了脚本的局部变量|s:var|。一个全局变量有可能已经在别的地方被使用了,因此,如果只在你的插件中使用,请一直使用局部变量。
NOT LOADING
有一种可能是用户不想总是加载此插件,或者系统管理员已经将其拖入系统级的插件目录中了,但是某个用户又只想用他自己的插件,下面这样能实现这个要求:
6 if exists("g:loaded_typecorr")
7 finish
8 endif
9 let g:loaded_typecorr = 1
这样同时还可以避免当这个插件被重复加载时引起的函数重复定义错误以及自动命令(autocommands)被使用两次带来的麻烦。
推荐使用名字以"loaded_"开头,后面直接跟着插件的名字。前面加"g:"是为了避免在函数中使用变量时带来的错误(没有"g:"的话有可能会被当成此函数的局部变量)。
使用finish可以让Vim停止读取插件的剩余部分,这样用比在整个文件中使用if-endif要快的多。
MAPPING
现在让我们把此插件变得更有趣:我们将要增加一个映射(mapping)来增加一个功能,实现对光标下的单词(word)进行更正。本来只需要为此映射选择一些按键序列就行了,但是用户有可能将此按键序列用于其它功能了。为了允许用户能够自己定义一个插件使用时的按键映射,可以使用选项<Leader>:
22 map <unique> <Leader>a <Plug>TypecorrAdd
"<Plug>TypecorrAdd"部分能够实现真正的功能,后面将会对此扩展讲解(more about that further on)。
如果用户想让他的映射键以“_”开头,他可以设定变量"mapleader"来实现,因此,如果用户按如下方法做了:
let mapleader = "_"
那么他的映射键就定义成了"_a"。如果用户不这么做,那么默认值将会被使用,那就是反斜杠,于是映射键就被会定义成"\a"。
使用<unique>标签将会在映射键碰巧已经存在的情况下引起错误。
但如果用户想要定义他自己的键映射怎么办呢?我们可以按下面的方法做:
21 if !hasmapto('<Plug>TypecorrAdd')
22 map <unique> <Leader>a <Plug>TypecorrAdd
23 endif
这将会检测"<Plug>TypecorrAdd"的键映射是否已经存在,并在其不存在的情况下将键映射定义为"<Leader>a"。这样,用户就可以将这样的设定写入vimrc文件(来定义自己的键映射):
map ,c <Plug>TypecorrAdd
于是,映射键就变成了",c"而不是"_a"或"\a"了。
-------------------------------------------------------------------------------
【1】关于compatible 选项,你可以在vim中help一下,我这里就不翻译了。
-------------------------------------------------------------------------------
好了,先写这些,未完待续…