我想在插入模式下将 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。致所有为这个问题提供答案的人:非常感谢!你的评论给了我很多帮助。
答案 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似乎都像返回一样。