条件语句

每种编程语言都有产生分支流程的方法,在Vimscript中,这是用if语句实现的。 if语句是Vimscript中产生分支的基本方法。这里没有类似Ruby中的unless语句, 所以代码中所有的判断都需要用if实现。

在谈论Vim的if语句之前,我们需要花费额外的时间讲讲语法,这样可以在同一页里讲完它。

多行语句

有时你在一行里写不下所需的Vimscript。在讲到自动命令组时,我们已经遇到过这样的例子了。 这里是我们之前写过的代码:

:augroup testgroup
:    autocmd BufWrite * :echom "Baz"
:augroup END

在理想的情况下,你可以分开成三行来写。但在手工执行命令的时候,这样写就太冗长了。 其实,你可以用管道符(|)来隔开每一行。执行下面的命令:

:echom "foo" | echom "bar"

Vim会把它当作两个独立的命令。如果你看不到两行输出,执行:messages查看消息日志。

在本书的剩余部分,当你想手工执行一个命令,却对输入新行和冒号感到心烦时,试试用管道隔开, 在一行里写完。

If的基本用法

现在让我们回到正题上来,执行下面的命令:

:if 1
:    echom "ONE"
:endif

Vim将显示ONE,因为整数1是"truthy"。现在执行下面命令:

:if 0
:    echom "ZERO"
:endif

Vim将显示ZERO,因为整数0是"falsy"。让我们看看对字符串是怎么处理的。执行下面命令:

:if "something"
:    echom "INDEED"
:endif

结果可能让你吃惊。Vim不会把非空字符串当作"truthy",所以什么也没有显示。

让我们打破沙锅问到底。执行下面的命令:

:if "9024"
:    echom "WHAT?!"
:endif

这次Vim显示了!为什么会这样?

为了搞懂发生了什么,执行下面三个命令:

:echom "hello" + 10
:echom "10hello" + 10
:echom "hello10" + 10

第一个命令使得Vim输出10,第二个命令输出20,第三个则又一次输出10

在探究了所有的命令后,对于Vimscript我们可以得出结论:

  • 如有必要,Vim将强制转换变量(和字面量)的类型。在解析10 + "20foo"时,Vim将把 "20foo"转换成一个整数(20)然后加到10上去。
  • 以一个数字开头的字符串会被强制转换成数字,否则会转换成0
  • 在所有的强制转换完成,当if的判断条件等于非零整数时,Vim会执行if语句体。

Else 和 Elseif

Vim,像Python一样,支持"else"和"else if"分句。执行下面的命令:

:if 0
:    echom "if"
:elseif "nope!"
:    echom "elseif"
:else
:    echom "finally!"
:endif

Vim输出finally!,因为前面的判断条件都等于0,而0代表falsy。

练习

来一杯啤酒,安抚自己因Vim中的字符串强制转换而受伤的心。