vim配置文件、语法文件、插件文件中使用的都是vim专用的脚本语言VimScript。这门语言与PHP以及Javacript有些类似,但不相同。它只能运行于vim平台之上。从本文开始,将记录作者本人学习这门语言的一些心得体会。大概的学习思路是:语言定位---数据类型与转换---基本语法---函数---平台API---实用插件编写。
1 VimScript简介
VimScript是用于配置、扩展vim的专用脚本语言。具有动态类型、面向对象(不太完整)、异常处理等现代语言特征。大体上属于PHP语言派别,但没有PHP干净利索。是编写vim插件的基本语言,但不是唯一语言,因为vim也支持通过python,perl等语言编写其插件。
与其他语言入门一样,先来一个HelloWorld示例。脚本语言与编译语言不同,往往都支持在线编程调试,同时也支持把代码写入文件中,然后再执行。我们分两种情况给出例子。
- 交互模式
启动vim后,在Normal模式下输入
:echo 'Hello, VimScript!'
然后回车,命令行窗口会打印出
Hello, VimScript!
- 文件模式
新建一个名为hello.vim的文本文件。写入如下内容:
:source hello.vim
同样会在命令行窗口打印出
Hello, VimScript!
通过这个简单的示例,我们学到了最基本的VimScript知识:
(1)双引号以及后面的文字属于注释内容
(2)输出使用:echo关键字
(3)以行为执行单位
(4)使用:source命令来执行外部VimScript文件
另外VimScript是严格区分大小写的。
2 VimScript的数据类型
数据类型在任何编程语言中都占有机器重要的地位,VimScript也不例外。VimScript支持6种数据类型,分别是:Number-有符号整数、Float-浮点数、String-字节串(字符串)、Funcref-函数引用、List-有序链表、Dictionary-无序关联数组。下面分别详细解释。
(1) Number
32位有符号整数,等同于C或PHP语言的int。如果从引用和值来分类,此种类型属于值类型。
(2)Float
浮点类型,等同于C或PHP语言中的float。值类型。
(3)String
字符串类型,等同于C或PHP语言中的字符串。值类型。
(4)Funcref
函数引用,等同于C或PHP语言中的函数类型。引用类型。
(5)List
有序链表,这个在C语言中没有对应项,因为List中的每个元素的类型可以不同,类似于PHP中的索引数组。引用类型。
(6)Dictionary
字典类型,实质是哈希表,类似于PHP中的关联数组。引用类型。
VimScript提供了内置函数type用于识别一个数据的类型,示例:
3 变量声明与赋值及数据类型转换
3.1 变量命名
变量是任何语言中必备要素,VimScript中的变量与PHP变量类似,但不相同。变量的命名规则与C相同,只能使用数字、字母、下划线,且不能以数字开头。另外,VimScript变量名可以推迟到运行时确定,这点与PHP中可变变量类似。
3.2 变量声明、使用与删除
在 VimScript中,变量无需声明即可使用,不过它使用了一种特殊的赋值语法。例如:
等号=左右可以有空格。
要删除这个变量,需要:
一个变量删除以后不能在被使用。
再给出一个动态变量名的例子:
(1)字符串同时支持单引号和双引号,区别在于双引号字符串能识别转义,这一点与PHP类似;
(2)字符串连接使用专门的点号运算符,这一点也与PHP类似;
3.4 自动类型转换与非自动类型转换
在 VimScript中,Number和String之间是自动转换的,其他的转换都不是自动的。还是看例子吧。
可以看出Number和String是根据语法需要自动转换的,但是Float和String不能自动转换,也就是如下行不通
let s = 'hello'. 2.3
另外,Number和Float参与一起运算时,Number先自动转换为Float再参与运算,这与C相同。
3.5 不完整的动态类型
VimScript可以说是动态类型语言,前面在使用的时候并没有明确指定类型,而是由解释器动态确定的。但是它又不是完全的动态化。看下面的例子:
变量a一开始是Number类型,然后变成了String类型,当变成Float类型时,解释器会报错。这说明在VimScript里,一个变量的类型不会随便动态改变。这显然与动态语言类型有些不太符合。实际上,只有Number和String可以相互改变,其他类型都不可以。这对于习惯了PHP的开发人员来说,可能感到非常奇怪。我想这与VimScript的类型底层实现是由关系的,希望以后能改进。变通的方法是,先删除这个变量,然后重新定义其类型,如下: