Vimscript编程指南

字符串

接下来我们要看的一种变量类型是字符串。由于在vim里进行的工作都是进行字符串操作,所以对于字符串变量你会用比较多的。

运行下面的命令:


     :echom "Hello"

字符串连接

对于字符串比较常用的一个功能就是把字符串拼接在一起。运行下面的命令:


     :echom "Hello, "+"world"

会出现什么呢?Vim很奇怪地输出了“0”。

问题的关键在于:Vim里的+只是用于数字的。当你把字符串作为+的一个操作数时,Vim会把先把它转换成数值然后再进行加法运算。运行下面的命令:


     :echom "3 mice" + "2 cats"

这次Vim会输出“5”,因为上面的两个字符串分别被转换成数字“2”和“3”。

我这里说所的数字都是整数,vim是不会把字符串转换成浮点数的!运行下面的命令来证明这个结论:


     :echom 10 + "10.10"

Vim会输出“20”,因为当把“10.01”转换成数字的时候,会吧小数点以及小数点后面的字符都忽略掉了。

如果要进行字符串的拼接,那么就要用字符串的拼接命令。运行下面的命令:


     :echom "Hello, " .  "world"

这次Vim会输出“Hello, world”。“.”是vim里的字符串拼接操作符,它可以用来进行字符串的拼接操作。它不会在两个字符串之间加上空格或者其他的字符。

数字也可以转换成字符串。运行下面的命令:


     :echom 10 . "foo"

Vim会输出“10foo”。首先,10会被转化成一个字符串,然后会和后面的字符串进行拼接。不过,当你对浮点数进行操作时,结果就不会一样了。运行下面的命令:


     :echom 10.0 . "foo"

这次vim会抛出一个错误,说是不能把浮点数当作字符串来使用。Vim允许你在进行加法操作时,把一个字符串当作浮点数来操作,但是在进行字符串拼接时却不允许把浮点数当作字符串来使用。

这个问题的原因在于vimscript和Javascript有点相似:它让你很方便的进行操作,并且对于类型的限制是非常松的,但是这是一个很不好的方式,因为在后面它会让你很烦恼的。

当你在写vimscript的时候,最好能够弄清楚你的每一个变量的类型。如果你需要改变一个变量的类型,最好用一个函数显式地来实现,即使当时不是严格要求的。不要依赖vim的强制转换,因为有时候它会让你失望的。

特殊字符

和其他许多编程语言一样,vim运行你用转义符来表示一些很难用键盘来输入的字符。运行下面的命令:


     :echom "foo \"bar\""

上面字符串里的\"会被一个双引号来代替的,这个也许是你已经预料到的。

转义字符串基本上都会按照你的意愿来显示的。运行下面的命令:


     :echom "foo\\bar"

Vim输出“foo\bar”,和大多数编程语言一样\是\的转义字符串。现在运行下面的命令:(注意这里用的是echo而不是echom)


     :echo "foo\nbar"
 这次vim会输出两行文本,“foo”和“bar”,因为\n代表换行符。

 现在运行下面的命令:

     :echom "foo\nbar"

Vim会输出类似于“foo^@bar”的文本。当你用echom来输出字符串而不是用echo时,vim会输出所有的字符,而不是它转义后的文本,也就是说它会输出和echo不一样的文笔。^@是vim用来表示换行符的字符。

不转义的字符串

Vim也允许你使用不转义的字符串来避免转义字符串的作用。运行下面的命令:


     :echom '\n\\'

Vim会输出“\n\”。用单引号表示不对字符串进行转移,除了两个单引号会表示一个单引号这个例外。运行下面的命令:


     :echom 'That''s enough.'

Vim会输出“That's enough”,在不转义字符串里,单引号是惟一一个例外的字符。

在本书的后面(当我们深入讨论正则表达式的时候),我们后面会再次讨论不转移字符串的。

布尔值

你可能会考虑在if语句里的字符串的代表什么布尔值。运行下面的命令:


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

Vim会输出“no”。如果你很奇怪为什么会这样,你可能就需要再次阅读前面的条件语句章节,我们在那里讨论了这个问题。

练习

  • 阅读:help expr-quote。看看你在vim可以使用哪些转义字符串。试着找出怎么插入一个制表符。
  • 找出一种在一个字符串里插入制表符,但是不用转义字符串的方式。参考:help i_CTRL_V。
  • 阅读:help literal-string。