程序是用来操控数据的
现在开始,我们来介绍VimScript中进行操作的6种变量类型
数字,浮点型,字符串,列表,字典,函数引用(不做讨论)
数值
在程序中操纵数据是再平常不过的事情了
而数值类型则是一种很常见的变量类型,VimScript中有两种数值类型:数字与浮点型
数字
echo 100
echo 0xff
echo 017
echo 019
VimScript中支持使用八进制,十六进制进行数字的设定
上面的示例中,显示了
为什么最后一个是19
因为八进制没有9,按10进制处理,Vim会自动处理掉这个错误,所以建议一般写十进制为好
浮点型
浮点型,可以使用多种形式进行表示
但是,不能使用echom,echom不接受浮点型
echo 100.1 #=> 100.1
echo 5.45e+3 #=> 5450.0
echo 5e10 #=> Error! 并非是浮点型
当使用数值与浮点型混用时,Vim会强制转换类型,将所有的数值转换为浮点型
以Float形式作为结果
字符串
字符串,是一个很大的类型,为什么这么说呢?
因为VimScript就是用来处理文本的,所以字符串是一个很大的类型,Ruby,Perl也是如此
字符串的连接
echo "Hello," + "World"
是不会生效的,因为”+”运算符只适用与数值类型与列表类型,对于字符串是不适用的
强行使用,会将字符串强转为数值类型,(转换规则之前已经提到过了)
对于字符串,使用连接运算符进行字符串的的连接
echo "Hello ," . "World" #=> "Hello,World"
echo 10 . "abc" #=> "10abc"
echo 10.1 . "foo" #=> Error! Float不能转换为字符串
**这就是VimScript不善解人意的地方 : **
可以在进行 “ + “ 运算时,将String转为数值
但是, “ . “ 运算时不能将Float转换为String
所以,建议在VimScript书写时,如果需要即进行变量类型的转换时,请显式的进行类型准换
不要依赖于Vim自身的类型转换,不靠谱,出来混迟早是要还的
转义字符
同其他的编程语言一样,对于不能进行输入的字符,可以使用转义字符来进行处理
echo "foo\"bar\"" #=> foo"bar"
echo "foo\nbar" #=> foo<换行>bar
echom "foo\nbar" #=> foo^@bar echom 会将一些特殊字符进行输出,而不是进行功能性输出
对于这种echom诡异的情况,就要使用字符串字面量,来进行处理
字符串字面量
为了上面的转义字符滥用的情况,所以我们使用字符串字面量来进行处理
字符串字面量:所见即所得,几乎没有转义的情况
echom 'foo\nbar' #=> "foo\nbar"
echo 'that''s' #=> "that's"
** ‘ ‘ 即是唯一的例外,进行转义,其余所有的字符串都是不会进行转义的**
字符串函数
前面提到了这么多的字符串,那么其进行处理的字符串函数也是有很多的
- 长度
类似于C语言,使用strlen(string-length)来进行字符串长度的求解
len函数也是可以使用的,但是len函数也用在列表求解时使用
echo strlrn("foo")
echo len("foo")
- 切割
可以按照指定的字符将字符串切割成列表
echo split("abc")
echo split("a,b,c",",")
- 连接
对于字符串的连接处理,是类似于列表的,好吧,其实就是列表
使用join函数,将字符串使用指定的连接符进行连接
echo join(["abc","def"],"--")
echo join(["abc,"def"])
第三个参数缺省的情况下,使用空格进行字符串符的连接
split函数与join函数合作十分密切
- 大小写的转换
这个可就真的是类似于C了
使用tolower( )以及toupper( )函数进行大小写转换
echo tolower("Foo")
echo toupper("Foo")
列表
列表,也可以叫做有序链表.
对Python,我基本没学过,从Ruby的角度来讲,基本同Array
(不多说了,毕竟什么语言就是什么语言,不能整天在类比)
VimScript的列表是有序的,异质的元素集合
列表中可以嵌套列表
echo [1,2,3] #=> [1,2,3]
echo [[1,2],3] #=> [[1,2],3]
索引(index)
列表,是有序的集合,所以输出列表需要依靠索引
索引,简单地来讲,就是下标
echo [1,2,3][0] #=> 1
echo [1,[2,3]][1] #=> [2,3]
同时,VimScript还可以进行反向索引,反向索引的时候,
-1为最后一个元素,-2为倒数第二个元素,以此类推
echo [1,2,3][-1] #=> 3
echo [[1,2],3][-2] #=> [1,2]
切割
切割即将列表中的元素按照需要的顺序进行切割并显示
举个例子:
echo [1,2,3,4][1:2] #=> [2,3]
echo [1,2,3,4][-2:-1] #=> [3,4]
echo [1,2,3,4][:2] #=> [1,2,3]
echo [1,2,3,4][3:] #=> [4]
有上面的例子可以看出,切割需要注意的点有:
-
切割时的索引也是从0开始
-
切割必须遵守列表顺序,否则为空
-
切割可以反向索引,但是必须遵守第二条
-
切割时,左缺省置为0,右缺省值为最大值
可以使用负数索引列表,但是不能使用负数索引字符串!
这个例子,直观又贴切
echo "abcd"[-1] . "abcd"[-2:-1]
第一个字符串索引值为空,得到一个空的字符串.
第二个字符串进行切割,获得的结果cd, “ . “ 连接运算符的结果是”cd”
连接
想要连接Vim中的列表,直接 “+”就可以了
echo ['a','b'] + ['c'] #=> ['a','b','c']
列表函数
上面这些都是些正常的列表操作,当然列表也是有很多的函数的
- add( )函数
用于进行列表的扩展使用,即给列表后添加内容
let foo = ['a']
call add(foo,'b')
echo foo #=> ['a','b']
- get( )函数
用于进行列表值的获取,基本用法
get(List,index,'default')
获取List列表中,索引为index的元素,若元素不存在,则将’default’作为结果,default缺省值为0
foo = ['a','b']
let a = get(foo,1,'default')
let b = get9foo,2,'default')
echo a #=> 'b'
echo b #=> 'default'
- index( )函数
用于返回List中元素的索引,若元素不存在,则返回-1
echo index([1,2,3],1) #=> 0
echo index([1,2,3],"1") #=> -1
- join( )函数
其实这个函数,之前在字符串的部分已经见过了.
但是,当时只是为了进行字符串的连接使用
实际上,join( )函数,是进行列表元素的连接使用
将列表元素按照给定的连接字符进行连接成为字符串,若非字符串的项,强转为字符串
连接符的缺省值为空格
let foo = [1,2,3]
echo join(foo,",") #=> 1,2,3
echo join(foo) #=> 1 2 3
echo join(foo,"") #=> 123
- reverse( )函数
不需要多说,很简单的就地转置函数,将列表进行转置
字典
最后的一种数据类型了,字典这种数据类型在很多语言中都是存在的
Python中的dict,Ruby中的hash,JavaScript中的Object,都是类似的key-value键值对
字典用花括号创建,值是异质的,但是会被强转为字符串
**因为value只能是字符串啊 ! **
Vim将value强转为字符串,但是保持值不变
同时,VimScript改进了JavaScript中的蠢笨之处,字典末尾是可以保留逗号的
建议在字典末尾保留 , (逗号),便于字典元素换行时,可以保证不会出现添加元素缺少逗号的问题
索引
既然数据类型相似,那么语言之间进行字典的索引基本都是相同的,对没错,使用键进行访问即可
foo = {'a':"1",'b':"2"}
echo foo['a'] #=> 1
echo foo[b] #=> 2
同时,如果,键key仅由字母/下划线组成时,VimScript也支持JavaScript风格的 ‘ . ‘查找
echo foo.a #=> 1
echo foo.b #=> 2
赋值与添加
赋值与添加新项的操作是一样的
let foo = {1:"a",2:"b",}
let foo.1 = "c"
let foo.3 = "d"
echo foo #=> {'1':'c','2':'b','3':'d'}
移除项
进行字典项的移除时,有两种方法
-
使用remove函数
-
使用unlet命令
unlet foo.3
echo foo #=> {'1':'c','2':'b',}
let test = remove(foo,2)
echo foo #=> {'1':'c'}
echo test #=> b
remove函数可以移除项,并且返回被移除的项值,unlet函数能做的,remove都可以
所以,建议使用remove函数,同时,你不能移除不存在的项,会抛出异常
字典函数
同理于列表,字典也是存在许多的字典函数的
存在着类似的get( )函数
- get( )函数
get(Dict,index(key),default)
类似于List的get函数
- has_key( )函数
用于判断Dict是否存在改建值对,返回1/0
可以用此来判断真假
echo has_key({'a':100},'a') #=> 1
echo has_key({'a':100},'a') #=> 0
- items( )函数
可以使用items( )函数查看该Dict中所有的键值对,获取结果为嵌套列表
但是,切记items( )中的键值对是无序的
同时,使用keys,values可以获得,键,值的所有值
至此,所有的VimScript的数据类型已经介绍完毕了
在理接的过程中,我也是觉得,使用help命令十分的重要,可以帮助你学习很多注意不到地方
同时,也请注意进行规范的操作,
Vim会自动的将一些错误进行抹除,严重的影响程序设计
目前关于VimScript的学习暂时到此,下面我会进行一段时间插件开发的学习,之后再进行总结
October 25, 2017 9:41 PM