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

时间:2012-10-18 11:06:01

标签: keyboard vim

考虑使用

取消箭头键的绑定
 noremap <Left>  <NOP>
 noremap <Right> <NOP>
 noremap <Up>    <NOP>
 noremap <Down>  <NOP>

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

 inoremap <Left>  <NOP>
 inoremap <Right> <NOP>
 inoremap <Up>    <NOP>
 inoremap <Down>  <NOP>

但这对我来说并没有多大意义,因为我认为mapnoremap应该适用于所有模式,而前置n/v/x/s/o/i/l/c指定映射仅在该特定范围内有效模式。有这个原因吗?

3 个答案:

答案 0 :(得分:4)

  

为什么没有一个包罗万象的模态地图,而不是同时发布地图和地图!

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

:imap之类的前缀暂时从插入模式切换到普通模式。实际上,通常甚至还必须为命令行模式定义不同的前缀,如此示例所示:

<C-O>

因此,在定义映射时,请始终考虑需要哪些模式以及是否需要重新映射(noremap <C-Tab> :<C-U>tabnext<CR> inoremap <C-Tab> <C-O>:tabnext<CR> cnoremap <C-Tab> <C-C>:tabnext<CR> :nmap,更喜欢后者。)

答案 1 :(得分:3)

:help map-overview

map(和noremap)用于普通,视觉,选择和操作员待定模式。

答案 2 :(得分:0)

与您的预期相反,noremapmap实际上并不适用于所有模式。根据{{​​1}}中非常有用的摘要,这里列出了可以作为:help map-listing)加到!map的前缀(或后缀)的字符列表, noremapunmap以及它们适用的模式:

  • (无) - 正常,视觉,选择和操作员待定
  • mapclear - 正常
  • n - 视觉和选择
  • v - Visual
  • x - 选择
  • s - 操作员待定
  • o - 插入和命令行
  • ! - 插入
  • i - 命令行
  • c - “:lmap”插入,命令行和Lang-Arg的映射

因此l映射在插入或命令行模式下不起作用,并且无需考虑,也可能无法在Visual,Select或Operator-pending模式下正常工作。

但是,只需更改模式并返回映射,映射就可以适应不同的模式。例如,发出命令行命令但仅在普通模式下工作的noremap映射可以适用于其他模式,如本示例所示:

noremap

noremap <C-Tab> :<C-U>set list!<CR> inoremap <C-Tab> <C-O>:set list!<CR> cnoremap <C-Tab> <C-C>:set list!<CR>:<Up> 适用于Normal,Visual,Select和Operator-pending模式,noremap进入命令行模式,然后在Vim插入范围时清除当前行; :<C-U>适用于插入模式,inoremap暂时退出到普通模式,然后进入命令行模式;并且<C-O>:适用于命令行模式,cnoremap退出并重新进入命令行模式以清除该行,但与<C-C>:不同,将其保留在命令历史记录中,以便<C-U>可以将其恢复。

这三个映射涵盖了所有六种模式。 (显然'Lang-Arg'不是一种模式。)有些角落不适用,但也有一些情况下,当我认为它不会时,它会起作用,我不喜欢不明白为什么。此外,大多数模式都会丢失诸如选择和挂起运算符之类的小东西,即使映射命令不会松动这些东西。例如,在插入模式下,我不明白为什么我给出的示例需要将当前编辑分解为撤消/重做历史记录中的单独更改(尝试键入:<Up>)。说实话,使用键映射以这种方式运行命令对我来说似乎有点像黑客,但我不知道另一种方式。