Vim:如何映射Ctrl-M而不影响Return keypress?

时间:2010-10-14 17:44:48

标签: vim

我想在插入模式下将 Ctrl - M 映射到 Ctrl - N 。如果我只是imap <C-M> <C-N>那么 Ctrl - M 的确表现得像 Ctrl - N ,但随后点击Enter也一样。我想按Return键继续插入新行,同时使 Ctrl - M 插入下一个关键字完成匹配,就像 Ctrl - N 。这可能吗?

编辑: 我设法修改Vim的源代码,无条件地将 Ctrl - M 视为 Ctrl - N 而不影响Return。在这样做的同时,我也意识到在没有源代码更改的情况下确实没有办法做到这一点,因为实际按下的内容之间存在区别 - Enter Ctrl - M ,在按键处理中似乎太早消失了。它发生在依赖于平台的UI模块中,按键处理中的可移植代码部分已经不知道 Ctrl - M 还是实际按下了返回键导致键代码13。

我的修改是在FreeBSD(GTK)和Windows的GUI模块中,因为这些是我最常使用gvim的平台。

P.S。如果有人想要实现同样的目标,请随时给我留言。

P.P.S。致所有为这个问题提供答案的人:非常感谢!你的评论给了我很多帮助。

4 个答案:

答案 0 :(得分:6)

:help key-notation明确指出CTRL-M等同于Enter。这是因为回车符是ASCII字符号。 13和M是字母表的第13个字母。

答案 1 :(得分:2)

当弹出菜单可见时,以下命令将CTRL-M(或Enter as Benoit指出)视为CTRL-N,当弹出菜单不可见时,将其恢复为默认操作。

:inoremap <C-M> <C-R>=pumvisible() ? "\<lt>C-N>" : "\<lt>C-M>"<CR>

这要求您在将CTRL-M用作CTRL-N之前使用CTRL-N或CTRL-P调用弹出菜单。

答案 2 :(得分:2)

如果您使用的是Windows,如果活动窗口是vim,则可以在插入模式下使用Autohotkey重新映射Ctrl-M。

ahk脚本可能看起来像这样:

 #IfWinActive, Write: ahk_class GVIM
 ^M::^N

或者,您可能会考虑使用触摸打字技能(我怀疑您希望听到该解决方案,但我仍然认为这是一个有效的建议),以避免让Ctrl-M和Ctrl-N混淆。

如果您正在使用某种Linux版本,我不确定哪些工具可以与autohotkey等效。

另一种方法是映射一个完全不同的键,让你自动完成,而不是使用ctrl-n,例如Ctrl-K::inoremap <c-k> <c-n>

答案 3 :(得分:2)

执行此操作的一种方法(取决于您的终端)是将return密钥重新映射到C-J {{1}}。 几乎每个终端应用程序中的C-J似乎都像返回一样。