这一节我们来看看 Vim中的 conditionals.
Vim 中的条件式只有 if
, 没有 unless
(Ruby 有 unless
).
先看个简单的例子:
:if 1 |
输出: “ONE”, 符合预期.
这里如果我们不想在command 模式下输入这么多行, 可以用 |
(管道pipe) 来连接每一行:
:if 1 | echom "ONE" | endif |
从这个简单的例子, 我们可以看出对于 非 0 的数字 1, Vim 认为是 truthy.
反之:
:if 0 |
此时什么都不输出. 表达式为 0 时,为 falsy.
再看个字符串的例子:
:if "kitty" |
此时仍然是什么也没有输出, 所以 Vim 是默认将字符串处理成 falsy?
换个例子:
:if "01kitty" |
此时输出: “cute!”. what? (此处适合配个黑人问号脸….)
为了弄懂怎么回事, 我们把 “kitty” 和 “01kitty” 拎出来跑跑:
:echom "kitty" + 0 |
输出:
0 |
从输出的结果可以看出, Vim 把字符串转化成整数时, 如果字符串是以数字开头的,会转化成开头的数字, 否则就是0.
所以上面两个 kitty 例子的运行结果, 也就合理了. “kitty” => 0 => falsy, “01kitty” => 1 => truthy. 破案.
我们再来看看比较表达式:
:if 10 > 1 |
输出: “10 is bigger than 1”, 这结果没啥特别的, 很正常.
再来看个字符串的对比:
:if "cat" == "cat" |
输出: “cat is cat”. 嗯, 没毛病.
来看看大小写的情况:
:if "cat" == "CAT" |
输出: “cat is cat”. 看来 Vim 是 case sensitive ?
NO.
我们先来看看 setting 是不是 case sensitive 的.
:set ignorecase? |
输出: noignorecase, 说明option ignorecase 的值是noignorecase, 不忽略大小写, 也就是case sensitive.
我们修改下:
:set ignorecase |
此时我们将配置修改为了 ignorecase, case insensitive.
(还记得option 的配置吗? 当option 是二元值时, 使用 set {option}
, set no{option}
来enable/disable option)
我们再来跑上面的例子:
:if "cat" == "CAT" |
输出: “cat is CAT”.
上面的例子教会了我们什么呢? 作者说我们应该永远也不要相信 ==
, 至少它不应该出现在你的Plugin 中(永远预设用户的配置多变).
嗯, 那咱得换个比较运算符.
估计你也猜到了, Vim 早已准备好了对应的操作符.
来认识下 ==?
(忽略大小写) && ==#
(不忽略大小写)
:set noignorecase |
输出: “cat is CAT”
虽然我们设置了 noignorecase, 不忽略大小写, 但是if 中 使用了 ==?
, 表示比较时, 忽略大小写, 所以第一个表达式的结果为 true, 输出 “cat is CAT”.
同样:
:set ignorecase |
这时输出: “cat is cat”.
对于比较运算符, 可以查看官方文档了解更多:
:h expr4 |
好, If 这块差不多了, 是不是超简单? 收工收工. 下一节聊 function~.