我们已经学习过了条件语句,如果我们不进行比较的话,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"
:else if "foo" == "foo"
: echom "vim is case sensitive"
:endif
vim会执行elseif里的语句,所以很显然,vimscript是大小写敏感的。知道这个也不错,不过也没什么大不了的。现在运行下面的命令:
:set ignorecase
:if "foo" == "FOO"
: echom "no, it couldn't be"
:else if "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”,因为==#是“无论当前用户的设置是怎样,比较都是大小写敏感的”。
这个例子告诉我们在比较的时候都要显式的用==?或者==#来进行比较。用==来比较是部队的,甚至在某些地方会失效。所以为了减少麻烦,多输入一个字符吧。
当你在比较证书的时候,现在是没必要这样做的。虽然这样我还是觉得最好对所有的比较都用大小写敏感的比较符,即使是在不需要的地方,这样总比在需要的时候忘记去用要好多了。
用==#和==?来对整数进行比较也是没有问题的,如果你以后把整数改成字符串也是能够正常工作的。如果你对整数比较喜欢用==号的话,那么你就要记住,当你把整数改成字符串的时候也要把==改成大小写敏感的比较符。