接下来我们讲字符串类型。鉴于Vim是用来编辑文本的,你将频繁地跟这一类型打交道。
执行下面的代码:
:echom "Hello"
Vim将输出Hello
。目前为止,依然如此。
在日常编程中你经常需要把字符串连接到一起。执行下面的命令:
: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 "foobar"
Vim显示foobar
,因为是表示""的转义字符串,一如大多数编程语言。 现在执行下面的命令(注意那是
echo
而不是echom
):
:echo "foonbar"
这次Vim将显示两行,foo
和bar
,因为n
会被替换为换行。现在试试下面的命令:
:echom "foonbar"
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.
。两个单引号是字符串字面量里_唯一_的特殊序列。
在本书稍后的部分,我们将重新审视字符串字面量的更多内容。(那时我们会深陷于正则表达式)
你可能想知道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
。
我们新鲜出炉的"grep运算符"工作得很好,但是写Vimscript的目的,就是要体贴地改善你的用户的生活。 我们可以额外做两件事,让我...
Group/Order分组与排序Group方法用于查询分组,Order方法用于查询排序。使用示例:// SELECT COUNT(*) total,age FR...
Model对象也可以通过TX事务对象创建,通过事务对象创建的Model对象与通过DB数据库对象创建的Model对象功能...
SVG circle 通过 circle 可以绘制一个圆形,它只有3个属性用来设置圆形。SVG 圆形 - circle circle 标签可用来创建一个圆: 下面...
XSL-FO table-cell 对象XSL-FO 参考手册定义和用法 fo:table-cell 对象是一个包含表格单元格内容的容器。语法fo:table-cell!--Co...
XML Schema element 元素 完整 XML Schema 参考手册定义和用法 element 元素定义一个元素。 元素信息 父元素: schema, choice, ...
XML Schema simpleContent 元素 完整 XML Schema 参考手册定义和用法 simpleContent 元素包含对 complexType 元素(它以字符数据...
XML Schema notation 元素 完整 XML Schema 参考手册 定义和用法 notation 元素描述 XML 文档中非 XML 数据的格式。 元素信息 父...
XSLT xsl:output 元素XSLTxsl:output元素用于定义文档的输出格式,请参考本节中的实例。 完整的 XSLT 元素参考手册定义和用法 xs...