接下来我们要看的一种变量类型是字符串。由于在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”。如果你很奇怪为什么会这样,你可能就需要再次阅读前面的条件语句章节,我们在那里讨论了这个问题。