我想我刚刚发现了一个Vim错误,但在打扰Bram Moolenaar之前,我想我会在这里查看我对Vim命令语法的理解是否正确。
在我的.vimrc
中,我有
cnoreabbrev W w
cnoreabbrev Q q
因为在输入:w
或:q
时,我会倾向于保持转变,提供:W
或:Q
。但是,当我现在尝试使用W
,Q
等搜索/W
或?Q
时,Vim会发现w
或{{1}的出现次数而是。我发现这令人惊讶,因为我以为我只缩写了命令,而不是搜索字符串。从我的q
中删除两行会产生所需的行为。
这是.vimrc
的错误还是功能?它出现在Debian打包的Vim 7.3.923和当前的Mercurial提示中。
答案 0 :(得分:2)
我不会说它是bug,它是一个.....功能。 :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命令,“:”,模式 搜索命令,“?”和“/”,和过滤器命令, “!”。
答案 1 :(得分: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()
答案 2 :(得分:1)
功能
如果您在?Q
后点击空格,则会看到更改为?q
我修复它的方法实际上就是定义一个用户命令。 (因为它始终以资本开始,它起作用)
command! Q q
command! W w