如何在Vim中重新定义命令?

Ykt*_*ula 11 vim command definition

在vim中,在我的.vimrc中,如何将命令(即:e)重新定义为其他内容?我想重新定义:e *:tabe *.

Ykt*_*ula 10

我想出了办法.请参见如何在vim中禁用内置命令.从那里,我们可以看到我们可以使用cabbrev来改变命令的作用.对于我的需求,cabbrev e tabe是完美的.

但是我们可以推广这个解决方案,使用户可以访问用户定义的小写字符开始命令:使用cabbrev(重新)定义内置命令作为用户定义的命令.因此,我们能够重新定义内置命令以及用户定义的命令.

这是一个例子,相当于我上面提到的解决问题的方法:

:command -nargs=+ E :tabe "<args>"
:cabbrev e E
Run Code Online (Sandbox Code Playgroud)

就这样.

  • 如果你想输入“echo ef”,这会中断,它会变成“echo E f”。我的回答试图克服这个问题。 (2认同)

Cir*_*四事件 6

cnoreabbrev 解决方法

到目前为止,没有插件的最佳解决方法是:

cnoreabbrev <expr> e getcmdtype() == ":" && getcmdline() == 'e' ? 'tabe' : 'e'
Run Code Online (Sandbox Code Playgroud)

如果你使用简单的:

cnoreabbrev e E
Run Code Online (Sandbox Code Playgroud)

正如@Yktula所建议的那样,如果你想这样做会破坏你的命令:

echo e f
Run Code Online (Sandbox Code Playgroud)

这会成为:

echo E f
Run Code Online (Sandbox Code Playgroud)

代替.


正如@pydave在评论中所解释的那样,cmdalias插件为执行安全别名添加了一个更简单的接口,简单如下:

:Alias e tabe
Run Code Online (Sandbox Code Playgroud)

在编写本文时,插件还使用该getcmdtype() == ":"技术来实现其功能.