编程语言必须要有条件判断功能。Vim中的语法是if...endif

基本的条件判断

下面的代码中,Vim会输出ONE而不会输出ZERO

if

Vim

1

2

3

4

5

6

7

:if 1

:    echom "ONE"

:endif

:if 0

:    echom "ZERO"

:endif

没什么难的,前文中我们已经提到Vim的真值是1,假是0.

再尝试下面的代码。

convert

Vim

1

2

3

4

5

6

7

:if "something"

:    echom "INDEED"

:endif

:if "9024"

:    echom "WHAT?!"

:endif

Vim不会输出“INDEED”,但是会输出“WHAT”。这是为什么呢?请再测试下面的代码。

convert2

Vim

1

2

3

:echom "hello" + 10

:echom "10hello" + 10

:echom "hello10" + 10

结果分别是10,20,10. 这是因为,Vim会在必要的时候进行类型转换,string转换成int,想必规则可以从上面的代码猜出来了。我就不说了:)

Vim也支持elseif(注意没有空格)else,像Python一样/不过不要忘记最后的endif。

else

Vim

1

2

3

4

5

6

7

:if 0

:    echom "if"

:elseif "nope!"

:    echom "elseif"

:else

:    echom "finally!"

:endif

结果是"finally"

比较

比较很简单,和Python没有什么不同。

Comparions

Vim

1

2

3

:if 10 > 2001

:    echom "bar"

:endif

string的比较要格外注意。==是依赖于用户设置的。

string comparions

Vim

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风格的循环。

Vim for loog

Vim

1

2

3

4

5

6

7

:let c = 0

:for i in [1, 2, 3, 4]

:  let c += i

:endfor

:echom c

While循环和别的编程语言几乎是一样的。

Vim while loop

Vim

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