比较符

我们已经讲完了条件语句,但是如果不能比较什么东西,那么 if 就没什么用了。 当然,Vim 能让我们比较值,但是可能并没有那么直观。

运行以下命令:

:if 10 > 1
:    echom "foo"
:endif

当然,Vim 会显示 foo。现在运行命令:

:if 10 > 2001
:    echom "bar"
:endif

Vim 没有显示任何东西,因为 10 不比 2001 大。目前一切都按期望运行。 运行命令:

:if 10 == 11
:    echom "first"
:elseif 10 == 10
:    echom "second"
:endif

Vim 显示 second。这没什么奇怪的。让我们试着来比较字符串。运行命令:

:if "foo" == "bar"
:    echom "one"
:elseif "foo" == "foo"
:    echom "two"
:endif

Vim 回显 two。这仍然没什么奇怪的,那么在本章的开始我一直在唠叨什么呢?

大小写敏感

运行以下命令:

:set noignorecase
:if "foo" == "FOO"
:    echom "vim is case insensitive"
:elseif "foo" == "foo"
:    echom "vim is case sensitive"
:endif

Vim 执行了 elseif,那么 Vimscript 显然就是大小写敏感的。 知道了挺好,但也没啥了不起的。现在运行命令:

:set ignorecase
:if "foo" == "FOO"
:    echom "no, it couldn't be"
:elseif "foo" == "foo"
:    echom "this must be the one"
:endif

慢着。就这停停。没错,正如你所见。

== 的行为依赖于用户的环境设置。

我发誓并不是在糊弄你。再试一次看看。我没有开玩笑,也不是瞎编。

防御性编程

这是什么意思呢?它意味着你在写一个给其他人用的插件时,可以完全不相信 == 的比较结果。 单独的 == 绝对不能出现在你插件的代码中。

这个想法就和“nmap 对比 nnoremap”一样。绝对不要相信你的用户的环境设置。 Vim 古老、广泛使用、并且复杂。在写插件的时候,你必须假设用户会有各种环境设置的各种变化。

那么能如何回避这个诡异的问题?事实上,Vim 有两个比较操作符的额外设置来处理。

运行以下命令:

:set noignorecase
:if "foo" ==? "FOO"
:    echom "first"
:elseif "foo" ==? "foo"
:    echom "second"
:endif

Vim 显示 first,因为 ==? 是“无论用户设置什么都大小写不敏感的”比较操作符。 现在运行以下命令:

:set ignorecase
:if "foo" ==# "FOO"
:    echom "one"
:elseif "foo" ==# "foo"
:    echom "two"
:endif

Vim 显示 two, 因为 ==# 是“无论用户设置什么都大小写敏感的”比较操作符。

这件事教导我们总是应该使用明确大小写敏感或不敏感比较。 使用普通形式是错误的,而且将会在某个时刻出问题。 为了减少麻烦,还是多键入个额外的字符吧。

当你比较整数时,这个区别显然是不要紧的。 然而,我还是觉得任何地方都使用大小写敏感(即使有些地方并不需要) 会比在真正需要的地方忘记了更好。

使用 ==#==? 比较整数会运行的好好的,并且如果你以后把他们换成了字符串也会正常工作。 如果你宁愿用 == 比较整数,那也可以,只要记住如果以后要把它们换成字符串的话,你需要更改比较符。

练习

用用 :set ignorecase:set noignorecase,看看各种比较符是如何表现的。

阅读 :help ignorecase 看看为什么有些人会设置这个选项。

阅读 :help expr4 看看所有可用的比较操作符。

原文地址:http://learnvimscriptthehardway.stevelosh.com/chapters/22.html