到了这里我们已经讲解完了单行命令。在接下来的本书的第三部分里,我们我们将会把vim脚本当做一门编程语言来讲解。这个部分没有之前我们学的那些那么让人兴奋,不过这个会给后面要做的东西打下基础,它贯穿从零创建一个vim插件的整个过程。
首先我们要讨论的是变量。 运行下面的命令:
:let foo = "bar"
:echo foo
vim会输出“bar”。foo现在是一个变量,我们把它赋值为字符串“bar”。现在运行下面的命令:
:let foo = 42
:echo foo
vim会输出“42”,因为我们给vim赋值为整数“42”。从这里看来vim应该是动态类型的。不过事实上并不是这样,我们和面会讨论这个的。
你可以像对待一个变量那样来设置和读取一个选项,通过一个特殊的语法。运行下面的命令:
:set textwidth=80
:echo &textwidth
Vim会输出“80” 。在一个名称的前面加上&表示你要引用一个选项的值,而不是一个恰好有相同名称的变量。
我们再看看vim是怎么处理布尔值的选项的。运行下面的命令:
:set nowrap
:echo &wrap
Vim会输出“0”,现在试试下面的命令:
:set wrap
:echo &wrap
这次vim会输出“1”。很显然,vim把整数“0”当做“false”,整数“1”当做“true”。可以认为vim把任意的非零整数都当做“true”来处理, 并且事实上也是这样的。
我们也可以像设置变量那样来设置选项,运行下面的命令:
:let &textwidth = 100
:set textwidth?
Vim会输出"textwidth=100"
可以直接用set命令来设置选项,为什么还要用let呢?运行下面的命令:
:let &textwidth = &textwidth + 10
:set textwidth?
这次Vim会输出“textwidth=110” 。当你用set来设置选项的时候,你只能把它设置成一个单一的值,但是如果你用let的话,你可以用vim脚本来任意设定选项的值。
如果你想设置本地选项的值,而不是一个全局的,你需要在变量名的前面加上&l:。
在两个窗口里分别打开文件,运行下面的命令:
:let &l:number = 1
切换到另外一个文件,运行下面的命令:
:let &l:number = 0
你会看到第一个窗口里有行号显示,而第二个窗口则没有。
你同样可以把寄存器当做变量来进行读写。运行下面的命令: :let @a = "hello!"
现在把光标放在文本的任意位置上,输入"ap。这个命令告诉vim“在当前位置粘贴寄存器a里的文本”。我们刚刚设置了那个寄存器的文本,因此vim会在你的文本里粘贴上“hello!”。
寄存器也可以被读出来。运行下面的命令:
:echo @a
vim会输出"hello!"
在你的文件里选择一个单词,然后用y命令来复制它,然后运行下面的命令:
:echo @"
Vim会输出你刚刚复制的命令。"寄存器是无名寄存器,这是你没有指定位置进行复制的文本存储的地方。
在你的文件里用/someword进行搜索,然后运行下面的明:
:echo @/
vim会输出你刚刚输入的搜索表达式。这个寄存器可以让你用程序来读取和改变当前的搜索表达式,这个功能有时候会非常有用的。