• Home
  • About
    • Road to Coding photo

      Road to Coding

      只要那一抹笑容尚存, 我便心无旁骛

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags

VimScript的学习(五)

24 Oct 2017

程序是用来操控数据的

现在开始,我们来介绍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'}

移除项

进行字典项的移除时,有两种方法

  1. 使用remove函数

  2. 使用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



VimScript Share Tweet +1