Conditionals

这一节我们来看看 Vim中的 conditionals.

Vim 中的条件式只有 if, 没有 unless (Ruby 有 unless).

先看个简单的例子:

:if 1
: echom "ONE"
:endif

输出: “ONE”, 符合预期.

这里如果我们不想在command 模式下输入这么多行, 可以用 | (管道pipe) 来连接每一行:

:if 1 | echom "ONE" | endif

从这个简单的例子, 我们可以看出对于 非 0 的数字 1, Vim 认为是 truthy.

反之:

:if 0
: echom "ZERO"
:endif

此时什么都不输出. 表达式为 0 时,为 falsy.

再看个字符串的例子:

:if "kitty"
: echom "cute!"
:endif

此时仍然是什么也没有输出, 所以 Vim 是默认将字符串处理成 falsy?

换个例子:

:if "01kitty"
: echom "cute!"
:endif

此时输出: “cute!”. what? (此处适合配个黑人问号脸….)

为了弄懂怎么回事, 我们把 “kitty” 和 “01kitty” 拎出来跑跑:

:echom "kitty" + 0
:echo "01kitty" + 0
:echo "kitty01" + 0

输出:

0
1
0

从输出的结果可以看出, Vim 把字符串转化成整数时, 如果字符串是以数字开头的,会转化成开头的数字, 否则就是0.

所以上面两个 kitty 例子的运行结果, 也就合理了. “kitty” => 0 => falsy, “01kitty” => 1 => truthy. 破案.

我们再来看看比较表达式:

:if 10 > 1
: echom "10 is bigger than 1"
:endif

输出: “10 is bigger than 1”, 这结果没啥特别的, 很正常.

再来看个字符串的对比:

:if "cat" == "cat"
: echom "cat is cat"
:elseif "cat" == "dog"
: echom "cat is dog"
:endif

输出: “cat is cat”. 嗯, 没毛病.

来看看大小写的情况:

:if "cat" == "CAT"
: echom "cat is CAT"
:elseif "cat" == "cat"
: echom "cat is cat"
:endif

输出: “cat is cat”. 看来 Vim 是 case sensitive ?

NO.

我们先来看看 setting 是不是 case sensitive 的.

:set ignorecase?

输出: noignorecase, 说明option ignorecase 的值是noignorecase, 不忽略大小写, 也就是case sensitive.

我们修改下:

:set ignorecase
:set ignorecase?

此时我们将配置修改为了 ignorecase, case insensitive.

(还记得option 的配置吗? 当option 是二元值时, 使用 set {option}, set no{option} 来enable/disable option)

我们再来跑上面的例子:

:if "cat" == "CAT"
: echom "cat is CAT"
:elseif "cat" == "cat"
: echom "cat is cat"
:endif

输出: “cat is CAT”.

上面的例子教会了我们什么呢? 作者说我们应该永远也不要相信 == , 至少它不应该出现在你的Plugin 中(永远预设用户的配置多变).

嗯, 那咱得换个比较运算符.

估计你也猜到了, Vim 早已准备好了对应的操作符.

来认识下 ==?(忽略大小写) && ==#(不忽略大小写)

:set noignorecase
:if "cat" ==? "CAT"
: echom "cat is CAT"
:elseif "cat" ==? "cat"
: echom "cat is cat"
:endif

输出: “cat is CAT”

虽然我们设置了 noignorecase, 不忽略大小写, 但是if 中 使用了 ==? , 表示比较时, 忽略大小写, 所以第一个表达式的结果为 true, 输出 “cat is CAT”.

同样:

:set ignorecase
:if "cat" ==# "CAT"
: echom "cat is CAT"
:elseif "cat" ==# "cat"
: echom "cat is cat"
:endif

这时输出: “cat is cat”.

对于比较运算符, 可以查看官方文档了解更多:

:h expr4

好, If 这块差不多了, 是不是超简单? 收工收工. 下一节聊 function~.