字符串

我们将看到的下一个变量类型是字符串。由于 Vim 所有的都是关于处理文本的,所以你会大量的用到字符串。

运行以下命令:

:echom "Hello"

Vim 会回显 Hello。到目前为止,一切顺利。

连接

你使用字符串最常做的事情就是把它们合并在一起。运行命令:

:echom "Hello, " + "world"

发生了什么?Vim 由于某些原因会显示 0

这个问题是因为:Vim 的+作用于数字。当你传入一个字符串给+,Vim 会尝试把它强转为数字,然后再运行加法。 运行以下命令:

:echom "3 mice" + "2 cats"

这回 Vim 显示5,因为这些字符串被分别强转为了数字32

当我提到“数字”时,我是实际指的是整数。Vim 不会把字符串强转为浮点数! 试试以下命令以证实这点:

:echom 10 + "10.10"

Vim 显示20,因为它在把10.10强转为数字时舍弃了小数点后面的所有东西。

你应该用链接操作符来合并字符串。运行以下命令:

:echom "Hello, " . "world"

这回 Vim 显示Hello, world.是 Vim 中的“链接字符串”操作符,可以合并字符串。 它不会在中间添加空格或其他任何东西。

强转某些情况下可以双向转换。试试命令:

:echom 10 . "foo"

Vim 会显示10foo。首先,它把10强转为字符串,然后连接右侧的字符串。 不过,当我们换成浮点数的话,情况就变的有些棘手了。运行命令:

:echom 10.1 . "foo"

这回 Vim 抛出一个错误,抱怨说我们把浮点说当做字符串使用。 Vim 会很高兴让你在运行加法时,把字符串作为浮点数使用,但是不会让你在连接字符串时, 把浮点数作为字符串使用。

这个故事的寓意是 Vim 很像 Javascript:它有时候允许你快速、轻松的处理类型, 但是这实际上是个很糟糕的想法,因为它随时有可能反咬你一口。

在写 Vimscript 的时候,确保你知道每个变量是什么类型。如果你需要改变类型, 应该使用一个方法来明确的改变它,即使目前并不是严格必须的。 不要依赖 Vim 的强转,因为在某个时候,你后悔的。

特殊字符

就像大多数的编程语言一样,Vimscript 允许你在字符串中使用转义序列来表示难以键入的字符。 运行以下命令:

:echom "foo \"bar\""

字符串中的\"被一个双引号替代了,正如你期望的那样。转义序列大部分都能按照你期望的那样工作。 运行以下命令:

:echom "foo\\bar"

Vim 显示foo\bar,就像大部分编程语言一样,因为\\是反斜杠的转义序列。 现在运行以下命令(注意这里是echo而不是echom):

:echo "foo\nbar"

这回 Vim 会显示两行,foobar,因为\n会被换行所替代。现在试试运行命令:

:echom "foo\nbar"

Vim 会显示类似foo^@bar这样的。当你使用echom而不是echo时,Vim 会回显确切的字符, 这就意味着有时候它会展示和echo不同的东西。^@在 Vim 中就是表示“换行字符”。

原义字符串

Vim 也允许你使用“原义字符串”来避免过多的使用转义序列。运行以下命令:

:echom '\n\\'

Vim 显示\n\\。使用单引号会告诉 Vim 精确地保持字符串原样,而不进行转义。 有个例外就是一行中的两个单引号会只产生一个单引号。运行命令:

:echom 'That''s enough.'

Vim 会显示That's enough.。两个单引号是唯一的在原义字符串中有特殊意义的序列。

在本书的后面的内容中(学习正则表达式的时候),原义字符串会变的更加有用,那时我们会再次研究它。

似真而非真

你也许会想 Vim 是如何处理if语句中的字符串。运行以下命令:

:if "foo"
:  echo "yes"
:else
:  echo "no"
:endif

Vim 会显示no。如果你想知道为什么会这样,你应该重新阅读条件语句那章,因为我们在那已经讲过了。

练习

阅读 :help expr-quote。查看在 Vim 字符串中可以使用的转义序列的列表。找出如何插入一个制表符。

试试找出一个不用转义序列就能在字符串中插入一个制表符的方法。参考 :help i_CTRL-V

阅读 :help Literal-string

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