Vimscript编程指南

比较

我们已经学习过了条件语句,如果我们不进行比较的话,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”,因为==#是“无论当前用户的设置是怎样,比较都是大小写敏感的”。

这个例子告诉我们在比较的时候都要显式的用==?或者==#来进行比较。用==来比较是部队的,甚至在某些地方会失效。所以为了减少麻烦,多输入一个字符吧。

当你在比较证书的时候,现在是没必要这样做的。虽然这样我还是觉得最好对所有的比较都用大小写敏感的比较符,即使是在不需要的地方,这样总比在需要的时候忘记去用要好多了。

用==#和==?来对整数进行比较也是没有问题的,如果你以后把整数改成字符串也是能够正常工作的。如果你对整数比较喜欢用==号的话,那么你就要记住,当你把整数改成字符串的时候也要把==改成大小写敏感的比较符。

练习

  • 试试用:set ignorecase和:set noignorecase来改变设置,然后看看不同的比较符的结果是怎样的。
  • 阅读:help ignorecase去看看为什么需要设置这个选项。
  • 阅读:help expr4来看看所有的比较操作符。