以前在 vim 中映射快捷键时,不是网上看被人怎么写然后拷贝回来,要么直接用 ‘map’ 来映射,根本搞不懂 ‘map’, ‘noremap’, ‘nmap’, ‘vmap’ … 之间的区别到底是什么。
今天,上网 Google 了下,不过先要从 vim 的几种模式说起。
vim 中有六种基本模式:
-
普通模式 (Normal-mode)
一般,启动编辑器之后就处于普通模式,除非你设置了 ‘insertmode’。也称为命令 (command) 模式。
-
可视模式 (Visual-mode)
可视模式与普通模式相似,只是光标移动会扩展高亮的区域。而其它非移动命令会作用于高亮的区域。在普通模式下,可以通过 v 或 V 或 CTRL-V 进入。如果没有关闭 ‘showmode’ 选项,窗口底部会出现 “—VISUAL—“ 字样。
-
选择模式 (Select-mode)
选择模式与 Windows 下其它编辑器的选择模式很像。选中字符后,键入一个可显示字符会删掉所有被选择的字符,并进入插入模式。一般,可以在普通模式下按 gh 进入,或在 gvim 中用鼠标拖选区域。窗口底部会出现 “—SELECT—“ 字样。
-
插入模式 (Insert-mode)
插入模式下你键入的内容会插入到缓冲区。一般,在普通模式下按 i 或 a 进入插入模式。窗口底部会出现 “—INSERT—“ 字样。
-
命令行模式 (Cmdline-mode)
命令行模式可以在窗口底部输入一行命令。可以用 “:” 执行命令,用 “?” 和 “/“ 来查找。
-
Ex 模式 (Ex-mode)
与命令行模式类似,只是执行完一条命令后,会继续停留在 Ex 模式。在普通模式下,按 Q 进入 Ex 模式。
快捷键映射
快捷键映射分两种: map 和 noremap
递归映射 (map)
如果键 b 映射为键 a,然后键 c 映射为键 b,那么当按键 c 时会产生按键 a 的效果。
1 2 | :map b a :map c b |
相当于
1 | :map c a
|
非递归映射 (noremap)
1 2 | :noremap b a :noremap c b |
非递归映射则不会产生递归映射一样的效果。
不同模式下的快捷键映射
在 map 与 noremap 前分别可以加 ‘n’, ‘v’, ‘x’, ‘s’, ‘o’, ‘i’, ‘l’, ‘c’ 以及 ‘map!’ 和 ‘noremap!’。
- n 表示在普通模式下生效,如 nmap, nnoremap
- v 表示在可视模式下生效,如 vmap, vnoremap
- s 表示在选择模式下生效,如 smap, snoremap
- i 表示在插入模式下生效,如 imap, inoremap
- c 表示在命令行模式下生效,如 cmap, cnoremap
map 和 noremap 不加任何前缀的话,是 mapmode-nvo。会在普通模式,可视模式,操作符等待模式下生效。
清除模式
- unmap
1 | unmap {lhs}
|
在映射命令作用的模式中删除 {lhs} 的映射。该映射仍然可以在其它模式中保留其定义。
- mapclear
在映射命令作用的模式中删除所有的映射。