每一个编程语言都有实现条件分支的方式,在vim脚本里是通过if语句来实现的,它是vim里来实现分支的主要方式。vim里不会像Ruby里一样有unless分支,所以你代码里的分支都只能用if来实现。
在我们开始讲解vim的if语句之前,我们要花点时间先看看一些语法的东西,以便我们能够达成共识。
有些时候你能不够把vim脚本都写在同一行里,这样的例子我们在自动命令分组里见到过。以下使我们之前写过的一段代码:
:augroup testgroup
: autocmd BufWrite * :echom "Baz"
:augroup END
你也可以把这三行命令卸载vim脚本的同一行里,这样也是可以的,不过当你手动输入命令的时候就显得比较冗长了。不过你可以用一个|来分割命令。运行下面的命令:
:echom "foo" | echom "bar"
vim会把上面的命令看做是两行。用:mesages来看看日志里是否有两行信息。
在本书后面的章节里,如果你想手动输入命令,但是不想输入换行和分号,那么你可以把它们放在同一行里,只需要用|分割就可以了。
现在我们可以开始了,运行下面的命令:
:if 1
: echom "ONE"
:endif
vim会输出“ONE”,因为1代表真值,现在运行下面的命令:
:if 0
: echom "ZERO"
:endif
Vim现在不会输出“ZERO”,因为整数0表示假。现在我们看看如果是字符串,会怎么样呢。运行下面的命令:
:if "something"
: echom "INDEED"
:endif
这个结果可能会出乎你的意料之外。Vim不一定把一个非空的字符串当作真值来处理,所以它不会输出任何东西。
让我们继续往下探究,运行下面的命令:
:if "9024"
: echom "WHAT?!"
:endif
这次vim输出了文本,vim究竟是怎么来处理字符串的呢?
试着去理解一下到底是怎么回事,运行下面的命令:
:echom "hello" + 10
:echom "10hello" +10
:echom "hello10" + 10
第一行输出10,第二行输出20,第三行又输出10
通过上面的命令的输出,我们可以总结出一些关于vim脚本处理字符串的结论:
在必要的时候vim会强制进行类型转换。当执行10+"20foo"的时候,Vim会把“20foo”转换成一个整数(这里是20),然后来和10进行想加
以数字开始的字符串都会转换成开始的数字,其他的都会转换成0.
在所有的转换都结束,并且条件表达式的执行结果为非零整数时,if里面的语句才会执行。
Else 和Elseif
Vim和python一样既支持else子句也支持else if子句。运行下面的命令:
:if 0
: echom "if"
:else if "nope!"
: echom "elseif"
:else
: echom "finally"
:endif
最终vim会输出“finally”,因为之前的条件的值都是0,也就是为false。
练习
- 对于vim把字符串转为整数的行为喝杯酒来安慰自己