0

我想我刚刚发现了一个 Vim 错误,但在打扰 Bram Moolenaar 之前,我想我会在这里检查一下我对 Vim 命令语法的理解是否正确。

在我的.vimrc,我有

cnoreabbrev W w
cnoreabbrev Q q 

:w因为我在输入or时倾向于按住 shift :q,给出:Wor :Q。但是,当我现在尝试使用、等搜索WorQ时,Vim 会找到or的出现。我觉得这很令人惊讶,因为我以为我只有缩写commands,而不是搜索字符串。从 my 中删除这两行给出了所需的行为。/W?Qwq.vimrc

这是一个错误还是一个功能cnoreabbrev?它出现在 Debian 打包的 Vim 7.3.923 和当前的 Mercurial 技巧中。

4

3 回答 3

2

我不会说这是错误,它是一个.....功能。:D

您所做的是ab仅在命令行模式下创建一个 , 。

/(搜索)也会带您进入命令行模式。这就是为什么ab在那里工作的原因。

:h vim-modes

你可以看到:

Command-line mode   In Command-line mode (also called Cmdline mode) you
Cmdline mode        can enter one line of text at the bottom of the
            window.  This is for the Ex commands, ":", the pattern
            search commands, "?" and "/", and the filter command,
            "!". 

所以

这适用于 Ex 命令,“:”,模式搜索命令,“?” 和“/”,以及过滤命令“!”。

于 2013-08-29T15:19:02.197 回答
2

命令行缩写因导致用户不希望出现的细微错误而臭名昭著。您尝试创建的别名类型可能应该转换为命令。

command W w
command Q q

我将完成、爆炸参数和范围参数作为练习留给读者。

但是,如果您确实要使用cnoreabbrev,则需要谨慎使用。我通常会使用表达式缩写来检查getcmdtype()和检查命令行的值,以及通过getcmdline(). 下面的例子

cnoreabbrev <expr> W getcmdtype() == ':' && getcmdline() ==# 'W' ? 'w' : 'W'

如果您不想自己创建逻辑,可以使用 Hari Krishna Dara 调用cmdalias的插件。

如需更多帮助,请参阅:

:h Command-line-mode
:h :command
:h :map-expression
:h getcmdtype()
:h getcmdline()
于 2013-08-29T16:28:31.280 回答
1

特征。

如果你点击空格后?Q你会看到变成?q

我修复它的方法实际上只是定义一个用户命令。(因为无论如何它都是以大写字母开头的)

command! Q q
command! W w 
于 2013-08-29T15:20:11.677 回答