既然VimScript可以作为一门编程语言,那么别人都有的变量、条件判断、循环,它也应该有。本文介绍这些内容。
变量
使用let为变量赋值。
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的值需要在前面加一个&符号。
1 2 |
:set textwidth=80 :echo &textwidth " Vim will display 80 |
布尔类型有些特殊,是通过在前面加no
或者不加来区分。
1 2 3 4 |
:set nowrap :echo &wrap " Vim displays 0 :set wrap :echo &wrap " This time Vim displays 1 |
由此也可以看出,Vim将0
作为假,1
(非零)作为真。
使用let
加&符号
也可以为选项赋值。
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:
前缀。同时打开两个文件,分别执行下面的代码。发现一个显示了行号,另一个没显示。
1 2 |
:let &l:number = 1 :let &l:number = 0 |
除了将选项作为变量,你还可以将寄存器作为变量。
1 |
:let @a = "hello!" |
输入下面的命令,然后移到切换到Normal Mode,键入"ap
。你会发现Vim粘贴了寄存器a
保存的内容。
寄存器的变量也可以被读出来:
1 |
:echo @a |
其实,其他有很多地方都是用到了寄存器。例如使用yy复制一行,可以通过:echo @"
查看,"
就是一个匿名的寄存器。使用/someword
搜索功能,可以使用:echo @/
查看搜索的单词。
Vim中的变量有“名字空间”的概念,下面这个方式,会只设置当前窗口的hello
变量。
1 2 |
:let b:hello = "world" :echo b:hello |
通过:help internal-variables
命令,可以查看Vim支持的所有的名字空间。
Numbers
VimScript支持两种数字类型,Numbers和Floats。
Number是32位的有符号整数。Float是单浮点数字类型。
Number类型支持不同的进制表示方法。0x
或0X
开头的是16进制,0
开头的是八进制。尝试以下代码。
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
类型支持科学表示方法。
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 " 但是,小数点和小数不是可选的,如果省略,会报错 |
如果涉及到Number
和Float
的运算,Vim会将Number
转换成Float
,然后返回一个Float
(类型提升)。
如果两个Number
做除法,Vim会丢掉余数。(这几点和高级语言,如Python,的表现是一致的)
String
需要注意的是,+
是Number
的运算符,而.才是用来连接字符串的。如果对字符串使用+
,Vim会把字符串转换成数字。关于转换规则,我们在VimScript学习笔记(7):条件判断和比较这里讨论过了。
参考下面的运算。
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
进行处理。
特殊字符,使用\
转义。
单引号包裹的,是纯字符串。不会进行转义。特殊的,连续两个单引号,被转义为一个单引号。
1 2 3 4 5 |
:echom '\n\\' " \n\\ :echom 'That''s enough.' " That's enough. |
对一个编辑器的脚本语言来说,最重要的就是处理字符串了。在Vim中,内置了一些处理字符串的方法。例如,获取字符串的长度,分割,连接,处理大小写等等。具体的用法,参考下面的代码。
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 |