变量

到目前为止我们已经讲完了单独的命令。在本书的后面三部分内容,我们会把 Vimscript 作为一种编程语言来学习。 这并不会像已学习过的那样让你立马有满足感,但是会给以后的学习打下基础, 并且会贯穿从头开始创建一个成熟的 Vim 插件的整个过程。

让我们开始吧。我们要讨论的第一个就是变量。运行以下命令:

:let foo = "bar"
:echo foo

Vim 会显示 barfoo 现在就是一个变量,并且我们把它赋值为字符串 bar。 现在运行这些命令:

:let foo = 42
:echo foo

Vim 会显示 42,因为我们已经把 foo 重新赋值为了整数 42

从这些简短的例子中,也许会觉得 Vimscript 是动态类型的。 但实际并非如此,我们会在以后在进一步讨论。

选项变量

你可以使用一种特殊的语法来把选项作为变量来读写。运行以下命令:

:set textwidth=80
:echo &textwidth

Vim 会显示 80。在一个变量名之前用 & 符号来告诉 Vim 去关联到选项, 而不是一个刚好拥有相同名字的变量。

让我们看看 Vim 是如何处理布尔选项的。运行以下命令:

:set nowrap
:echo &wrap

Vim 显示 0。现在试试这些命令:

:set wrap
:echo &wrap

这次 Vim 显示 1。Vim 把整数 0 当做 “false”、1 当做 “true”,这是个很有用的暗示。 那我们有理由假设 Vim 把任何非零整数当做,而这确实就是这样。

我们也可以把选项作为一个变量,并用 let 命令来设置。运行以下命令:

:let &textwidth = 100
:set textwidth?

Vim 会显示 textwidth=100

我们明明可以只用 set 就解决问题,而为什么还要用这种形式呢?运行以下命令:

:let &textwidth = &textwidth + 10
:set textwidth?

这次 Vim 显示 textwidth=110。当你用 set 来设置选项,那你只能设置一个单一字面的值。 当用 let 把它当做一个变量来设置,你可以用 Vimscript 的强大能力来决定它的值。

本地选项

如果你想给一个本地选项设置值,而非全局的值,那么你得给变量名加个前缀。

在不同的分割窗口打开两个文件。运行以下命令:

: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 文件,把一些 setsetlocal 命令更改为 let 的形式。 记住,布尔值选项仍然需要被设置为某些值。

试试设置一个布尔值选项,比如 wrap,为不是 0 和 1 的值。 把它设置为一个不同的数字会发生什么? 把它设置为一个字符串又会发生什么?

回到 ~/.vimrc 文件,撤销这些修改。如果 set 能满足需求,那就不要用 let —— 这更难于理解。

阅读 :help registers,浏览可以用来读写的寄存器列表。

原文地址:http://learnvimscriptthehardway.stevelosh.com/chapters/19.html