接下来我们讲字符串类型。鉴于Vim是用来编辑文本的,你将频繁地跟这一类型打交道。
执行下面的代码:
~~~
:echom "Hello"
~~~
Vim将输出`Hello`。目前为止,依然如此。
## 连接(Concatenation)
在日常编程中你经常需要把字符串连接到一起。执行下面的命令:
~~~
:echom "Hello, " + "world"
~~~
发生什么了?不知为何,Vim显示`0`!
这就是问题所在:Vim的`+`运算符_仅仅_适用于数值。当你把一个字符串作为`+`的参数时, Vim会在执行加法前尝试把它强制转换成一个Number。(译注:在21章的练习里你真的喝了啤酒没) 执行下面的命令:
~~~
:echom "3 mice" + "2 cats"
~~~
这次Vim显示`5`,因为字符串被相应地转换成`3`和`2`。
当提到"Number"时,我明确_指的是_Number类型。Vim不会强制转换字符串为Float类型! 为求证我的话,试试下面的命令:
~~~
:echom 10 + "10.10"
~~~
Vim显示`20`,因为在强制转换`10.10`成一个Number时,小数点后的内容都被丢弃了。
你需要使用连结运算符来连接字符串。执行下面命令:
~~~
:echom "Hello, " . "world"
~~~
这次Vim显示`Hello, world`。`.`是Vim中的"连接字符串"运算符,可以用来连接字符串。 它不会在其间插入空格或别的什么东西。
Vim会在`.`两边进行强制转换。试试这个命令:
~~~
:echom 10 . "foo"
~~~
Vim将显示`10foo`。首先它把`10`强制转换成字符串,接着把它跟右边的字符串连接在一起。 不过当涉及到Float类型时,情况有点糟糕。执行这个命令:
~~~
:echom 10.1 . "foo"
~~~
这次Vim抛出一个错误,声称我们把Float当作String了。Vim乐于让你在执行加法时把String当作Float, 却_不爽_你在连接字符串时把Float当作String。
故事的最后告诉我们一个道理:Vim酷似Javascript:它有时允许你逍遥自在地马虎对待类型差异, 但切莫这样做:因为出来混,迟早都要还的。(because it will come back to bite you at some point)
写Vimscript的时候,确信你清楚写下的每一个变量的类型。如果需要改变变量类型,你就得使用一个函数显式改变它, 即使那不是必要的。不要依赖Vim的强制转换,毕竟世上_没有_后悔药。
## 特殊字符
就像大多数编程语言,Vimscript允许你在字符串中使用转义字符串来表示"打不了"的字符。 执行下面命令:
~~~
: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将输出字符串中_额外的_字符,这意味着有时`echom`的输出跟`echo`的会有所不同。 `^@`在Vim里表示"换行符"。
## 字符串字面量
Vim也允许你使用"字符串字面量"(译注:如Python中的r"")来避免转义字符串的滥用。 执行下面命令:
~~~
:echom '\n\\'
~~~
Vim显示`\n\\`。使用单引号将告诉Vim,你希望字符串_所见即所得_,无视转义字符串。 一个例外是一行中连续两个单引号将产生一个单引号。(译注:相当于某种转义)试试这个命令:
~~~
:echom 'That''s enough.'
~~~
Vim将显示`That's enough.`。两个单引号是字符串字面量里_唯一_的特殊序列。
在本书稍后的部分,我们将重新审视字符串字面量的更多内容。(那时我们会深陷于正则表达式)
## 真值(Truthiness)
你可能想知道Vim怎么对待用在`if`语句中的字符串。执行下面的命令:
~~~
:if "foo"
: echo "yes"
:else
: echo "no"
:endif
~~~
Vim将显示`no`。如果你搞不懂为何如此,你应该重读关于条件语句的那一章(译注:第21章), 因为我们在那里已经讨论过了。
## 练习
阅读`:help expr-quote`。查看在一般的Vim字符串中允许的转义字符串列表。找出如何插入一个tab字符。
尝试找出一种方法,_不_使用转义字符串来插入一个tab字符。提示:阅读`:help i_CTRL-V`。
阅读`:help literal-string`。
- 前言
- 鸣谢
- 预备知识
- 打印信息
- 设置选项
- 基本映射
- 模式映射
- 精确映射
- Leaders
- 编辑你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 锻炼你的手指
- 本地缓冲区的选项设置和映射
- 自动命令
- 本地缓冲区缩写
- 自动命令组
- Operator-Pending映射
- 更多Operator-Pending映射
- 状态条
- 负责任的编码
- 变量
- 变量作用域
- 条件语句
- 比较
- 函数
- 函数参数
- 数字
- 字符串
- 字符串函数
- Execute命令
- Normal命令
- 执行normal!
- 基本的正则表达式
- 实例研究:Grep 运算符(Operator),第一部分
- 实例研究:Grep运算符(Operator),第二部分
- 实例研究:Grep运算符(Operator),第三部分
- 列表
- 循环
- 字典
- 切换
- 函数式编程
- 路径
- 创建一个完整的插件
- 旧社会下的插件配置方式
- 新希望:用Pathogen配置插件
- 检测文件类型
- 基本语法高亮
- 高级语法高亮
- 更高级的语法高亮
- 基本折叠
- 高级折叠
- 段移动原理
- Potion段移动
- 外部命令
- 自动加载
- 文档
- 发布
- 还剩下什么?