Vim:为什么noremap在插入模式下不起作用?

Dus*_*ran 5 keyboard vim

考虑使用箭头键解除绑定

 noremap <Left>  <NOP>
 noremap <Right> <NOP>
 noremap <Up>    <NOP>
 noremap <Down>  <NOP>
Run Code Online (Sandbox Code Playgroud)

这个工作在正常模式,但它并不会在插入模式下工作:一个仍然可以使用箭头键导航.作为对策,必须包括

 inoremap <Left>  <NOP>
 inoremap <Right> <NOP>
 inoremap <Up>    <NOP>
 inoremap <Down>  <NOP>
Run Code Online (Sandbox Code Playgroud)

但这对我来说并没有多大意义,因为我假设map并且noremap应该在所有模式下工作,而前置n/v/x/s/o/i/l/c指定映射仅在该特定模式下工作.是否有一个原因?

Ing*_*kat 4

为什么没有一张全包的模态地图,而不是地图和地图都发!

这很容易解释:在插入模式映射中,Vim 不会自动切换到正常模式(您可能希望保持插入模式,尽管文本翻译通常是通过:iabb,而不是 via:imap完成),因此适用的命令集完全不同。例如,在正常模式下 Ctrl-U 向上滚动,但在插入模式下它会删除该行中输入的字符!

前缀如<C-O>暂时从插入模式切换到正常模式。实际上,人们通常甚至还必须为命令行模式定义不同的前缀,如以下示例所示:

noremap <C-Tab> :<C-U>tabnext<CR>
inoremap <C-Tab> <C-O>:tabnext<CR>
cnoremap <C-Tab> <C-C>:tabnext<CR>
Run Code Online (Sandbox Code Playgroud)

因此,在定义映射时,请始终考虑在哪些模式下需要它们以及是否需要重新映射(:nmap:noremap,更喜欢后者)。