6

考虑使用解除箭头键的绑定

 noremap <Left>  <NOP>
 noremap <Right> <NOP>
 noremap <Up>    <NOP>
 noremap <Down>  <NOP>

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

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

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

4

3 回答 3

4
:help map-overview

map(和 noremap)用于正常、可视、选择和操作员挂起模式。

于 2012-10-18T11:10:57.057 回答
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>

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

于 2012-10-18T11:40:06.007 回答
0

与您的预期相反,noremap实际上map并不适用于所有模式。基于来自 的非常有用的摘要:help map-listing,这里列出了可以作为前缀(或在 的情况下为后缀!)到mapnoremapunmap和的字符mapclear,以及它们适用的模式:

  • (无)– 正常、可视、选择和等待操作员
  • n- 普通的
  • v- 视觉和选择
  • x- 视觉的
  • s- 选择
  • o– 运营商待定
  • !- 插入和命令行
  • i- 插入
  • c- 命令行
  • l– 用于插入、命令行和 Lang-Arg 的 ":lmap" 映射

因此,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>

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

These three mappings cover all six modes. (Apparently ‘Lang-Arg’ isn't a mode.) There are some corner-cases where it doesn't work, but then there are also some cases it works when I'd have thought it wouldn't, and I don't understand why. Also, most of the modes will loose little things like selections and pending operators, even if the mapped command wouldn't otherwise loose these things. For instance, when in Insert mode, I don't see why the example I've given would need to break the current edit into separate changes in the undo/redo history (try typing i123<C-O><Esc>456<Esc>u). To be honest using key mappings to run commands in this way seems like a bit of a hack to me, but I don't know another way.

于 2014-03-01T12:50:33.580 回答