课程表

vim 命令手册

Vimscript 编程参考

工具箱
速查手册

Vimscript 比较

当前位置:免费教程 » 软件/图像 » Vim

我们已经学习了条件语句,但如果我们不能进行比较,if语句并不怎么有用。 当然Vim允许我们比较值的大小,只是不会像看上去那么一目了然。

执行下面的命令:

  1. :if 10 > 1
  2. : echom "foo"
  3. :endif

显然,Vim会显示foo。现在执行下面的命令:

  1. :if 10 > 2001
  2. : echom "bar"
  3. :endif

Vim什么都不显示,因为10不比2001大。目前为止,一切正常。运行下面命令:

  1. :if 10 == 11
  2. : echom "first"
  3. :elseif 10 == 10
  4. : echom "second"
  5. :endif

Vim显示second。没什么好惊讶的。让我们试试比较字符串。执行下面命令:

  1. :if "foo" == "bar"
  2. : echom "one"
  3. :elseif "foo" == "foo"
  4. : echom "two"
  5. :endif

Vim输出two。还是没什么好惊讶的,所以我开头说的(译注:Vim的比较不像看上去那么直白)到底是指什么呢?

大小写敏感

执行下面的命令:

  1. :set noignorecase
  2. :if "foo" == "FOO"
  3. : echom "vim is case insensitive"
  4. :elseif "foo" == "foo"
  5. : echom "vim is case sensitive"
  6. :endif

Vim执行elseif分句,所以显然Vimscript是大小写敏感的。有道理,但没什么好震惊的。 现在执行下面命令:

  1. :set ignorecase
  2. :if "foo" == "FOO"
  3. : echom "no, it couldn't be"
  4. :elseif "foo" == "foo"
  5. : echom "this must be the one"
  6. :endif

啊! 就在这里停下来。是的,你所见属实。

==的行为取决于用户的设置。

我发誓我没忽悠你。你再试试看看。我没开玩笑,这不是我干的。

防御性编程

这意味着什么?意味着在为别人开发插件时,你_不能_信任==。 一个不加包装的==_不能_出现在你的插件代码里。

这个建议就像是"nmap VS nnoremap"一样。_永远不要_猜测你的用户的配置。 Vim既古老,又博大艰深。在写插件时,你_不得不_假定用户们的配置五花八门,千变万化。

所以怎样才能适应这荒谬的现实?好在Vim有额外两种比较操作符来处理这个问题。

执行下面的命令:

  1. :set noignorecase
  2. :if "foo" ==? "FOO"
  3. : echom "first"
  4. :elseif "foo" ==? "foo"
  5. : echom "second"
  6. :endif

Vim显示first因为==?是"无论你怎么设都大小写不敏感"比较操作符。现在执行下面的命令:

  1. :set ignorecase
  2. :if "foo" ==# "FOO"
  3. : echom "one"
  4. :elseif "foo" ==# "foo"
  5. : echom "two"
  6. :endif

Vim显示two因为==#是"无论你怎么设都大小写敏感"比较操作符。

故事的最后告诉我们一个道理:你应该_总是_用显式的大小写敏感或不敏感比较。 使用常规的形式是_错的_并且它_终究_会出错。打多一下就能拯救你自己于焦头烂额中。

当你比较整数时,这点小不同不会有什么影响。 不过,我还是建议每一次都使用大小写敏感的比较(即使不一定需要这么做),好过该用的时候_忘记_用了。

在比较整数时使用==#==?都可以,而且将来一旦你改成字符串间的比较,它还会正确工作。 如果你真想用==比较整数也不是不行,不过要铭记,一旦被改成字符串间的比较,你需要修改比较操作符。

练习

尝试:set ignorecase:set noignorecase,看看在不同状态下比较的表现。

阅读:help ignorecase来看看为什么有的人设置了这个选项。

阅读:help expr4看看所有允许的比较操作符。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号