与您所期望的相反,noremap
和map
实际上并不适用于所有模式。基于从:help map-listing
非常有用的总结,这里是可以前缀(或后缀中的!
的情况下)的字符来map
,noremap
,unmap
和mapclear
列表,以及它们适用于模式一起:
- (无) - 普通,可视,选择和操作符等待
n
- 正常
v
- 视觉和选择
x
- 视觉
s
- 选择
o
- 操作符等待
!
- 插入和命令行
i
- 插入
c
- 命令行
l
- “:lmap打开” 为插入映射,命令行和Lang-Arg
所以一个noremap
映射在插入或命令行模式下不起任何作用,并且在没有考虑的情况下,在Visual,Select或Operator-pending模式下可能无法正常工作。
但是,映射可以适应在不同模式下工作,只需通过更改模式并返回映射即可。例如,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
适用于普通,可视,选择和操作员正在等待的模式,其中:<C-U>
进入命令行模式,然后在Vim插入范围的情况下清除当前行; inoremap
适用于插入模式,其中<C-O>:
暂时退出到正常模式,然后进入命令行模式;而cnoremap
适用于命令行模式,为此<C-C>:
退出并重新进入命令行模式以清除该行,但与<C-U>
不同,它将其保留在命令历史记录中,以便:<Up>
可以将其恢复。
这三个映射涵盖了所有六种模式。 (显然'Lang-Arg'不是一种模式。)有一些不起作用的角落案例,但是当我认为它不行时,也有一些案例起作用,不明白为什么。另外,即使映射的命令不会放弃这些东西,大多数模式也会像选择和未决操作符那样放松一些东西。例如,在插入模式下,我不明白为什么我给出的示例需要将当前编辑分解为撤销/重做历史中的单独更改(请尝试输入i123<C-O><Esc>456<Esc>u
)。说实话,使用键映射来以这种方式运行命令似乎对我来说有点破绽,但我不知道另一种方式。
现在还不清楚你的blockquote“为什么没有一个全包模态地图,而不是发布地图和地图!”引用了部分[无评论](http://stackoverflow.com/questions/12953183 #评论17559832_12953259)Paul Ruane的回答。 –
显然,我应该评论这个答案,而不是解决它。尽管nil的原文句子在语法上是正确的,但nil的评论引用并不正确。 ''和''不是装备;他们不一定要在一开始。 'nmap'不等于'noremap'的递归,所以可以通过将'nmap'改为'map'或者说'* map'与'* noremap''来改进。我修改了这些问题,但被拒绝了。我似乎总是被告知要么编辑得太少,要么编辑得太多;我无法赢得版主。 SE太官色了。 –