在Vim中,是否可以将“wq”重新映射为保存并关闭当前缓冲区,而不是保存并退出?

9

我是一个 Vim 新手。

当我使用 :wq 命令时,我希望它只保存并关闭当前缓冲区,而不是保存并退出 Vim。

同样地,我希望 :q 命令的效果与 :bd 相同。

有什么建议可以实现这种行为吗?

2个回答

13

Vim允许用户在所有模式下添加命令的键映射,包括命令行模式,因此您可以在.vimrc文件中定义以下映射:

:cnoreabbrev wq w<bar>bd
:cnoreabbrev q bd

这些命令指示Vim将在命令行中按下WQ键时扩展为w|bd,同时将Q扩展为bd。有关更多详细信息,请参阅:help key-mapping


16
请不要使用 cnoremap 来实现此功能!这将在任何命令中扩展 q。例如,:set cscopequickfix 会被扩展为 :set cscopebduickfix。请改用 :cnoreabbrev!参见相关帮助文档。 - Benoit
你的第一个 cnoremap 不会生效。这行代码告诉 Vim 将命令模式下的 wq 重新映射为 w,并关闭当前缓冲区,而不是将 wq 重新绑定为 w|bd。Benoit 的抱怨也是有道理的,不过你可以使用 :cnoremap wq<cr> w<bar>bd<cr> 来达到预期的效果。 - Sarah
4
Sarah,不要这样。仍然使用cnoreabbrev更好,因为如果您想将文件保存为“以wq结尾的任何名称”,除非文件名确切地是“wq”,否则缩写不会触发。 - Benoit
2
我完全同意,尽管它仍然必须是w<bar>bd。 - Sarah
1
此外,您可以使用 :cnoreabbrev bx up<bar>bd 来模拟缓冲区的 :x 命令,这将仅在缓冲区已更改时写入缓冲区并关闭缓冲区。 - naught101
1
wq映射的问题在于它实际上并没有退出,但这实际上是与问题概念有关的问题。 - D. Ben Knoble

1

请查看Sayonara插件

我尝试了其他答案,但它缺少一个使用情况。当我关闭最后一个缓冲区时,我希望它像普通的:q命令一样关闭Vim。 :bd只会留下一个空白窗口和没有缓冲区。

这是从其他答案改编的映射:

" Prevent accidental closing of all buffers when doing :wq or :q
cnoreabbrev wq w<bar>Sayonara
cnoreabbrev  q       Sayonara

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