Vimscript编程指南

变量

到了这里我们已经讲解完了单行命令。在接下来的本书的第三部分里,我们我们将会把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会输出你刚刚输入的搜索表达式。这个寄存器可以让你用程序来读取和改变当前的搜索表达式,这个功能有时候会非常有用的。

练习

  • 浏览你的vimrc文件,把部分set和setlocal命令改用let形式来实现。记住布尔值的选项也是需要被设置的。
  • 把类似于wrap的布尔值选项的值设置成不是0和1的值,看看不同的数值会有什么效果呢?如果设置成字符串又会是什么效果呢?
  • 把上面的改动都改回去,因为如果set就能够满足需求的话,尽量不要用let,因为那样会变得比较难读。
  • 阅读:help registers,看看有哪些寄存器可以使用。