Vim 实用技术,第 3 部分 定制 Vim(1)
- UID
- 1066743
|
Vim 实用技术,第 3 部分 定制 Vim(1)
3.1. Vim 脚本基础在 .vimrc 文件中,和在第二章提到的插件和语法文件中,使用的语言就是 Vim 脚本语言。这种脚本语言语法有点像 BASIC,表达式有点像 C,还是比较容易理解的。本章中并不打算对其作很系统的介绍(要完整了解的话,请参见“:help usr_41.txt”),而只是介绍一些基本知识,特别是,了解定制 .vimrc 所需要的基本知识。
Vim 脚本相当于可直接在命令模式下执行的命令,只是不需要输入前面的冒号(如果用了冒号也不会出错)。因此,像设置选项、创建键盘映射这样的命令是直接可用的。当然,作为一种脚本语言,除了普通键盘上会输入的命令外,我们还需要一些更复杂的功能,特别是:变量,表达式,条件和循环语句,函数。
3.1.1. 变量Vim 中使用如下的语法对变量进行赋值(创建变量):
变量类型有两种,整数和字符串,在第一次赋值之前都不能使用。变量名除了可使用常规的字母、下划线和数字外,还可以使用几种特殊的前缀:
- “b:”——只对当前缓冲区(buffer)有效的变量;
- “w:”——只对当前编辑窗口(window)有效的变量。
- “g:”——全局变量(在函数中访问全局变量必须使用该前缀,不加前缀的话则认为是函数内的局部变量);
- “s:”——变量名只在当前脚本中有效;
- “a:”——函数的参数;
- “v:”——Vim 内部预定义的特殊变量(参见“:help vim-variable”)。
下面三个前缀用来访问特殊的数值,由于行为和变量较为相似(可以读取和修改),也放在这儿一起讲:
- “$”——访问环境变量;
- “&”——访问 Vim 选项;
- “@”——访问寄存器。
当变量不再使用时,可以使用“unlet 变量名”删除变量。
3.1.2. 表达式和 C 非常类似,可以使用变量和常量,可以使用括号,可以调用函数(“函数名(...)”),支持加法(“+”)、减法(“-”)、乘法(“*”)、除法(“/”)和取模(“%”),支持逻辑操作(“&&”、“||”和“!”),支持三元条件表达式(“a ? b : c”)。字符串操作方面当然比 C 要强,可以使用“.”进行字符串拼接;可使用“==”、“<=”等进行字符串大小比较,可使用“=~”和“!~”进行正则表达式匹配,而且可以在比较操作符后面添加“#”或“?”来强制进行大小写敏感或不敏感的比较(缺省受 Vim 选项 ignorecase 影响)。显示一个表达式的结果,可以使用“:echo 表达式”显示到状态栏上,或者在插入模式下使用“Ctrl-R=表达式”插入到缓冲区的文本中。
和其它很多在 Unix 下成长起来的语言一样,Vim 的字符串常量有双引号和单引号两种方式。使用单引号的话,单引号间的任何字符都是字符串的一部分,其中不能再包含单引号。使用双引号的话,则可以使用“\”产生换码序列(具体可参考“:help expr-quote”),如“\n”代表换行符,“\"”代表双引号,“\\”代表反斜杠本身,等等。
需要注意的话,双引号除了可以表示字符串常量外,还可以表示注释。行首的“"”,以及表达式中出现的成单的“"”,都表示“"”后面的部分全部是注释。
3.1.3. 条件和循环语句条件语句形式如下:
或
1
2
3
4
5
| if 表达式
语句
else
语句
endif
|
或
1
2
3
4
5
| if 表达式
语句
elseif 表达式
语句
endif
|
循环语句形式如下:
1
2
3
| while 表达式
语句
endwhile
|
条件和循环语句都可以嵌套。这些比较简单,就不多加说明了。
3.1.4. 函数在表达式中使用函数时,就跟 C 里面的方式类似,直接使用函数名加括号,括号里写上参数(可选)。在不需要返回值的情况下调用函数时,稍稍有些不同,要使用“call”命令,后面跟函数名和括号(括号里面写上可能有的参数)。
定义函数使用下面的语法:
1
2
3
| function 函数名称(参数列表)
语句
endfunction
|
如果已有同名函数存在,Vim 会报错,除非在“function”后面加上一个“!”。
如果参数中不包含“...”,那么参数的数量是固定的,函数的调用者必须提供跟定义同样多的参数(在函数定义中使用参数名之前加上“a:”进行访问)。如果参数中包含“...”,那么参数的数量不固定,除了可以使用参数名称访问传递过来的参数外,还可以使用“a:0”知道额外传递的参数数量,使用“a:1”、“a:2”等访问这些额外传递的参数。
要在函数的中间返回,或者要返回数值的话,可以使用“return”语句。
Vim 内部定义了一百多个函数,详细列表请参见“:help function-list”。 |
|
|
|
|
|