编程语言必须要有条件判断功能。Vim中的语法是if...endif。
基本的条件判断
下面的代码中,Vim会输出ONE而不会输出ZERO。
|
1 2 3 4 5 6 7 |
:if 1 : echom "ONE" :endif :if 0 : echom "ZERO" :endif |
没什么难的,前文中我们已经提到Vim的真值是1,假是0.
再尝试下面的代码。
|
1 2 3 4 5 6 7 |
:if "something" : echom "INDEED" :endif :if "9024" : echom "WHAT?!" :endif |
Vim不会输出“INDEED”,但是会输出“WHAT”。这是为什么呢?请再测试下面的代码。
|
1 2 3 |
:echom "hello" + 10 :echom "10hello" + 10 :echom "hello10" + 10 |
结果分别是10,20,10. 这是因为,Vim会在必要的时候进行类型转换,string转换成int,想必规则可以从上面的代码猜出来了。我就不说了:)
Vim也支持elseif(注意没有空格)和else,像Python一样/不过不要忘记最后的endif。
|
1 2 3 4 5 6 7 |
:if 0 : echom "if" :elseif "nope!" : echom "elseif" :else : echom "finally!" :endif |
结果是"finally"。
比较
比较很简单,和Python没有什么不同。
|
1 2 3 |
:if 10 > 2001 : echom "bar" :endif |
对string的比较要格外注意。==是依赖于用户设置的。
|
1 2 3 4 5 6 |
:set noignorecase :if "foo" == "FOO" : echom "vim is case insensitive" :elseif "foo" == "foo" : echom "vim is case sensitive" :endif |
这里走的是elseif,因为不忽略大小写。
因此,我们永远不能依赖用户设置。这里推荐的做法和npremap vs map一样,建议不用使用==,而使用==?(忽略大小写)和==#代替(大小写敏感)。
循环
循环在VimScript中并不常用,因为使用normal!几乎可以满足我们所有的需求。为了万一在以后会用到,这里也提一下。
VimScript支持for循环和while循环。
for循环是for-each风格的循环。
|
1 2 3 4 5 6 7 |
:let c = 0 :for i in [1, 2, 3, 4] : let c += i :endfor :echom c |
While循环和别的编程语言几乎是一样的。
|
1 2 3 4 5 6 7 8 9 |
:let c = 1 :let total = 0 :while c <= 4 : let total += c : let c += 1 :endwhile :echom total |