Vimscript编程指南

条件分支

每一个编程语言都有实现条件分支的方式,在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语句

现在我们可以开始了,运行下面的命令:


     :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把字符串转为整数的行为喝杯酒来安慰自己