注意:这个答案通常在无数字锁定上下文中讨论数字键盘。数字键盘上的所有数字都可以在数字锁定打开时使用<k0>...<k9> 进行映射。因此,对键的可映射性的引用是在无数字锁定的上下文中
注意,当我按下 NumPad5 时产生的 ANSI 序列是\033[E
Vim 不这么看。
在我的系统上(X11 下带有 Cinnamon 的 Mint 20.2),no-numlock 5 生成 ^[OE。 O 对观察到的行为非常很重要。 o 的意思是“转到下面的新行并进入插入模式”,O 的意思是完全相同的,只是上面的新行。然后下一个E 被解释为插入模式字符,因为 Vim。
此外,esc 表示为^[,因此为了映射目的,您只需要<esc>。这一点在 Vim 中更容易演示:
^[ 还被视为单个字符。如果你想玩这个,进入插入模式并按<C-v>。您按下的下一个键(绑定)将逐字打印到屏幕上
这意味着你真正想要的是:
nnoremap <Esc>OE <nop>
请注意,我不确定终端输入处理如何应用在这里;这可能只适用于某些终端,甚至只适用于 X11。
这里的另一个技巧,以及确保您的终端的键码正确的方法是,您可以输入:nnoremap ,然后按Ctrl+v kbd>+数字键 5。这将为您提供 Vim 看到的确切键码,然后您可以将其映射到您计划的任何内容。
但是,如果您在 gVim 中执行此操作,您会发现没有 numlock 的 numpad 5 实际上不会生成 gVim 可检测到的键码。这大概意味着它无法被映射(除非有某种我不知道的方式 - 如果有,请证明我错了)。但是因为它不会输出终端代码,所以还有一个额外的好处是不需要需要为这个特定目的重新映射它,因为它不存在你在此处试图避免的问题第一名。
romainl 在the comments 中提到了:help key-notation,但这里有一点要记住:
gVim 不生成键码通常意味着没有键码。在 gVim 中,<C-v> 后跟小键盘 9 会产生 <kPageUp>,但后跟小键盘 5,它不会产生任何结果。其次,如果你阅读:h key-notation,你会发现它只定义了home、end、up、down,以及各种运算符、enter和小数点。 2、4、6、8都注册为普通方向键,表示<Down>、<Left>、<Right>、<Up>。没有办法专门在小键盘上检测到这些,但这并不重要。
如果您一直在跟踪,您会发现 numpad 5 被排除在外。 注意: numlock 开启时,<C-v> + numpad 5 在 Vim 或 gVim 中不会输出任何内容,因为定义是:
按字面意思插入下一个非数字。
见:h i_CTRL-V。
TL;DR:
<C-v> 是你的朋友。
用途:
nnoremap <Esc>OE <nop>
或者使用<C-v> 插入可能依赖于终端也可能不依赖于终端的键码。
映射在 gVim 中不是必需的,也可能是不可能的。