Vim:如何在不影响返回键的情况下映射Ctrl-M?

Vim:如何在不影响返回键的情况下映射Ctrl-M?,vim,Vim,我想在插入模式下将Ctrl-M映射到Ctrl-N。如果我只是执行imap,那么Ctrl-M确实开始像Ctrl-N一样工作,但是按Enter键也会这样做。我想按回车键继续插入新行,同时让Ctrl-M插入下一个关键字完成匹配,就像Ctrl-N那样。可能吗 编辑: 我设法修改了Vim的源代码,以便在不影响返回的情况下无条件地将Ctrl-M视为Ctrl-N。在这样做的同时,我也意识到,如果不更改源代码,确实无法做到这一点,因为实际按下的键之间的区别——回车键或Ctrl-M键,似乎在按键处理过程中过早消失

我想在插入模式下将Ctrl-M映射到Ctrl-N。如果我只是执行
imap
,那么Ctrl-M确实开始像Ctrl-N一样工作,但是按Enter键也会这样做。我想按回车键继续插入新行,同时让Ctrl-M插入下一个关键字完成匹配,就像Ctrl-N那样。可能吗

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

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

另外,如果有人想达到同样的目标,请随时给我留言


p.p.S.感谢所有为这个问题提供答案的人:非常感谢!您的评论对我帮助很大。

:帮助键符号
清楚地表明CTRL-M相当于Enter。这是因为回车符是ASCII字符编号13,M是字母表中的第13个字母。

以下内容将在弹出菜单可见时将CTRL-M(或按Benoit指出的方式输入)视为CTRL-N,在弹出菜单不可见时恢复为默认操作

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

这要求您在使用CTRL-M作为CTRL-N之前,先使用CTRL-N或CTRL-p调用弹出菜单。

如果您使用的是Windows,如果活动窗口为vim,则在插入模式下,您可能可以使用自动热键重新映射CTRL-M

ahk脚本可能如下所示:

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

另外,你可以考虑使用你的触摸打字技巧(我怀疑你想听到这个解决方案,但我仍然认为这是一个有效的建议),以避免CTRL M和CTRL N混淆。 如果您使用的是某种风格的Linux,我不确定哪些工具可以等同于autohotkey

另一种方法是映射一个完全不同的键,以允许您执行自动完成,而不是使用ctrl-n,例如ctrl-K:
:inoremap

执行此操作的一种方法(取决于您的终端)是(在您的终端中)将
返回
键重新映射到
C-J

在几乎所有终端应用程序中,C-J都像是返回。

谢谢您的回答。是的,我看到了
\r
和Ctrl-M之间的联系,因为M是第13个字母。但是,难道没有办法在Vim中以某种方式分离这种关联吗?除了修改源代码之外,也就是说:)您可以通过
~/.Xresources
将其重新映射到其他程序(如F20),这将允许其他终端程序也捕获它(如F20)。谢谢您的回答。也许我应该澄清我为什么以及如何需要这个。如果Ctrl-M仅在弹出窗口可见后才使用其新功能,则为时已晚。基本上,我需要让Ctrl-M和Enter做不同的事情。这就是为什么我需要这样做:当我想按Ctrl-N时,我的手指经常出错并按Ctrl-M,所以不是插入下一个关键字完成匹配,而是插入一个新行,这对我来说是非常烦人的体验。我不需要Ctrl-M插入新行,所以我只想永久更改它的函数,使其行为与Ctrl-N一样;我将一如既往地使用Enter插入新行,不需要Ctrl-M也这样做。随着Ctrl-M插入下一个匹配项,我甚至不会注意到我按错了键,我的(g)Vim体验将变得更加愉快。感谢您的阅读!我很确定你不能破坏和之间的联系。我希望你能找到你的答案。罗宾逊:谢谢你,这些确实都是有效的建议(触摸打字技能也有提高,即使不太受欢迎!)。有时我确实使用Windows,但我主要使用FreeBSD,所以Autohotkey对我来说并不是一个真正的解决方案+1对于完全不同的关键建议,非常好的一个事实上,我会记住这一点。但首先我会尝试我的运气在黑客的VIM的源代码,如果这不起作用,我会认真考虑你的建议方法。再次感谢你的帮助!