考虑使用
取消箭头键的绑定 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
指定映射仅在该特定范围内有效模式。有这个原因吗?
答案 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)
与您的预期相反,noremap
和map
实际上并不适用于所有模式。根据{{1}}中非常有用的摘要,这里列出了可以作为:help map-listing
)加到!
,map
的前缀(或后缀)的字符列表, noremap
和unmap
以及它们适用的模式:
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>
)。说实话,使用键映射以这种方式运行命令对我来说似乎有点像黑客,但我不知道另一种方式。