编程语言必须要有条件判断功能。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 |