既然VimScript可以作为一门编程语言,那么别人都有的变量、条件判断、循环,它也应该有。本文介绍这些内容。

变量

使用let为变量赋值。

变量

Vim

1

2

3

4

5

:let foo = "bar"

:echo foo " Vim will display bar

:let foo = 42

:echo foo " : Vim will display 42

从上面的代码也可以看出,VimScript是一个动态类型的编程语言。

如果使用set,那么就会作为一个选项(Option)赋值。取得Option的值需要在前面加一个&符号。

Option

Vim

1

2

:set textwidth=80

:echo &textwidth " Vim will display 80

布尔类型有些特殊,是通过在前面no或者不加来区分。

布尔类型

Vim

1

2

3

4

:set nowrap

:echo &wrap " Vim displays 0

:set wrap

:echo &wrap " This time Vim displays 1

由此也可以看出,Vim将0作为假,1零)作为真。

使用let&符号也可以为选项赋值。

使用let赋值

Vim

1

2

3

4

5

:let &textwidth = 100

:set textwidth? "Vim will display <code>textwidth=100</code>

:let &textwidth = &textwidth + 10

:set textwidth? " This time Vim displays textwidth=110

区别在于,set只能赋一个单一的值,而let可以将它们作为变量来计算

如果要使用let设置Buffer-Local(只在当前窗口有效)的选项,要加l:前缀。同时打开两个文件,分别执行下面的代码。发现一个显示了行号,另一个没显示。

Buffer-Local let

Vim

1

2

:let &l:number = 1

:let &l:number = 0

除了将选项作为变量,你还可以将寄存器作为变量。

register

Vim

1

:let @a = "hello!"

输入下面的命令,然后移到切换到Normal Mode,键入"ap。你会发现Vim粘贴了寄存器a保存的内容。

寄存器的变量也可以被读出来:

read from register

Vim

1

:echo @a

其实,其他有很多地方都是用到了寄存器。例如使用yy复制一行,可以通过:echo @"查看,"就是一个匿名的寄存器。使用/someword搜索功能,可以使用:echo @/查看搜索的单词。

Vim中的变量有“名字空间”的概念,下面这个方式,会只设置当前窗口的hello变量。

name space

Vim

1

2

:let b:hello = "world"

:echo b:hello

通过:help internal-variables命令,可以查看Vim支持的所有的名字空间。

Numbers

VimScript支持两种数字类型,Numbers和Floats。

Number是32位的有符号整数。Float是单浮点数字类型。

Number类型支持不同的进制表示方法。0x0X开头的是16进制,0开头的是八进制。尝试以下代码。

Numbers

Vim

1

2

3

4

5

6

7

8

:echom 100 " 100

:echom 0xff " 255

:echom 010 " 8

:echom 017 " 15

:echom 019 " 19

因为019不是一个合法的八进制数,所以Vim会静默地将它当做10进制。这样并不安全,应该尽量不使用八进制。

Float类型支持科学表示方法。

Vim

1

2

3

4

5

6

7

8

9

10

:echo 100.1 " 100.1

:echo 5.45e+3 " 5450.0

:echo 15.45e-2 " 0.1545

:echo 15.3e9 " :echo 5e10

" 符号是可选的,如果省略,默认为正

:echo 5e10

" 但是,小数点和小数不是可选的,如果省略,会报错

如果涉及到NumberFloat的运算,Vim会将Number转换成Float,然后返回一个Float(类型提升)。

如果两个Number做除法,Vim会丢掉余数。(这几点和高级语言,如Python,的表现是一致的)

String

需要注意的是,+Number的运算符,而.才是用来连接字符串的。如果对字符串使用+,Vim会把字符串转换成数字。关于转换规则,我们在VimScript学习笔记(7):条件判断和比较这里讨论过了。

参考下面的运算。

Vim字符串操作

Vim

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

:echom "Hello, " + "world"  

" 0

:echom "3 mice" + "2 cats"

" 5

:echom 10 + "10.10"

" 20, 注意这里将会把10.10转换成Number,而不是Float

:echom "Hello, " . "world"

" Hello, world

:echom 10 . "foo"

" 10foo

:echom 10.1 . "foo"

" 报错,不能处理Float和String

要记住,String不能和Float一起处理,只能和Number进行处理。

特殊字符,使用\转义。

单引号包裹的,是纯字符串。不会进行转义。特殊的,连续两个单引号,被转义为一个单引号。

纯字符串

Vim

1

2

3

4

5

:echom '\n\\'

" \n\\

:echom 'That''s enough.'

" That's enough.

对一个编辑器的脚本语言来说,最重要的就是处理字符串了。在Vim中,内置了一些处理字符串的方法。例如,获取字符串的长度,分割,连接,处理大小写等等。具体的用法,参考下面的代码。

String Functions

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

:echom strlen("foo") " 结果是3

:echom len("foo") " 同样是3

:echo split("one two three")

" ['one', 'two', 'three']

:echo split("one,two,three", ",")

" ['one', 'two', 'three']

:echo join(["foo", "bar"], "...")

" foo...bar

:echo join(split("foo bar"), ";")

" foo;bar

:echom tolower("Foo")

" foo

:echom toupper("Foo")

" FOO