×

vi 命令手册

vi/vim 命令大全

vim 命令手册

Vim 关于Vim 安装Vim 用法Vim 配置vim 配置.vimrc方案vim 配置.vimrc方案1vim 配置.vimrc方案2Vim 文件合并Vim 技巧和建议Vim 插件Vim 参阅

Vimscript 编程参考

Vimscript 前言Vimscript 鸣谢Vimscript 预备知识Vimscript 打印信息Vimscript 设置选项Vimscript 基本映射Vimscript 模式映射Vimscript 精确映射Vimscript LeadersVimscript 编辑你的Vimrc文件Vimscript AbbreviationsVimscript 更多的MappingsVimscript 锻炼你的手指本地缓冲区的设置和映射Vimscript 自动命令Vimscript 本地缓冲区缩写Vimscript 自动命令组Operator-Pending 映射Operator-Pending 更多映射Vimscript 状态条Vimscript 负责任的编码Vimscript 变量Vimscript 变量作用域Vimscript 条件语句Vimscript 比较Vimscript 函数Vimscript 函数参数Vimscript 数字Vimscript 字符串Vimscript 字符串函数Vimscript Execute命令Vimscript Normal命令Vimscript 执行normal!Vimscript 基本的正则表达式Grep 运算符Operator 第1部分Grep 运算符Operator 第2部分Grep 运算符Operator 第3部分Vimscript 列表Vimscript 循环Vimscript 字典Vimscript 切换Vimscript 函数式编程Vimscript 路径Vimscript 创建一个完整的插件Vimscript 基本插件配置方式用Pathogen配置插件Vimscript 检测文件类型Vimscript 基本语法高亮Vimscript 高级语法高亮Vimscript 基本折叠Vimscript 高级折叠Vimscript 段移动原理Vimscript Potion段移动Vimscript 外部命令Vimscript 自动加载Vimscript 文档Vimscript 发布Vimscript 还剩下什么?

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。还是没什么好惊讶的,所以我开头说的(译注:Vim的比较不像看上去那么直白)到底是指什么呢?

大小写敏感

执行下面的命令:

: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 VS 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看看所有允许的比较操作符。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)