将Vim中的:x函数更改为删除缓冲区而不是保存并退出

16

我想在vim的GUI模式下将:x设置为删除缓冲区,因为我总是不小心杀死整个gvim,这有点烦人。 我知道我可以使用 if has("gui running") 来特别设置GUI问题,但不知道如何重新映射 :x

提前致谢

附:也许标签/术语remap是错误的,但我不知道正确的术语,这就是为什么谷歌根本没有提供任何帮助的原因。


1
可能是重复的问题:Vim:重新定义一个命令 - eckes
2个回答

33

我发现最安全的选择是使用表达式缩写:

cnoreabbrev <expr> x getcmdtype() == ":" && getcmdline() == 'x' ? 'bd' : 'x'
这将确保只有在使用:x时才会将缩写扩展为bd,否则只扩展为x

如需更多帮助:

:h map-<expr>
:h getcmdtype()
:h getcmdline()

进一步检查发现,Hari Krishna Dara开发的cmdalias.vim插件完全可以实现这个功能。它使用了上述技术的变体。


4
这并不像看起来的那么简单。 :map 命令不能与其他命令一起使用,而 :command 命令只接受以大写字母开头的命令。但是你可以使用:cabbrev命令:
if has("gui_running")
  cabbrev x bd
endif

更新:实际上可以使用:cmap x bd,但它不能正常工作:命令中每个x的出现都会立即被替换为bd

编辑:这个问题是在vim中我可以重新映射Ex命令吗?的副本。


为什么使用 has("gui running")?我不相信它会变成真的。应该使用 has("gui") - Chris Morgan
3
这样做的问题在于,如果你将“x”作为单词输入,例如 :echo "1 + x = 3" (有点绕口!),它会被转换为 :echo "1 + bd = 3"。@Peter提供的解决方案更好,因为它没有这个缺陷。 - Chris Morgan
@ChrisMorgan 应该是 has("gui_running")。它可以在 :h has-patch 下面的列表中找到(使用 :helpg gui_running)。 - ZyX
@ZyX 对,我错了。我以前用过它,但是没有参考它... has('gui') 当然不会管用。 - Chris Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接