vim里最基本的map用法也就是
:map c a
這里把c映射成了a,在map生效的情況下,按下c就等同於按下了a
當然,常用的Ctrl,Shift,Alt自然也是支持的。
- 令Ctrl+a對應到a
:map a
- 令Alt+a對應到a
:map a
- 令Ctrl+Alt+a對應到a
:map a
到此,我們已經可以做很多事情了。
但是map命令遠不只這一種,在不同的模式下,同一組按鍵可以被映射到不同的組合上。
Vim的模式眾多,但是一般被提及的也就是這么幾種:
- Normal Mode
也就是最一般的普通模式,默認進入vim之后,處於這種模式。
Visual Mode
一般譯作可視模式,在這種模式下選定一些字符、行、多列。
在普通模式下,可以按v進入。
Insert Mode
插入模式,其實就是指處在編輯輸入的狀態。普通模式下,可以按i進入。
Select Mode
在gvim下常用的模式,可以叫作選擇模式吧。用鼠標拖選區域的時候,就進入了選擇模式。
和可視模式不同的是,在這個模式下,選擇完了高亮區域后,敲任何按鍵就直接輸入並替換選擇的文本了。
和windows下的編輯器選定編輯的效果一致。普通模式下,可以按gh進入。
Command-Line/Ex Mode
就叫命令行模式和Ex模式吧。兩者略有不同,普通模式下按冒號(:)進入Command-Line模式,可以輸入各種命令,
使用vim的各種強大功能。普通模式下按Q進入Ex模式,其實就是多行的Command-Line模式。
對於Map,有幾個基本的概念
- 命令的組合
同Vim下的其他命令一樣,命令的名字往往由好幾段組成。前綴作為命令本身的修飾符,微調命令的效果。
對於map而言,可能有這么幾種前綴
- nore
表示非遞歸,見下面的介紹
- n
表示在普通模式下生效
- v
表示在可視模式下生效
- i
表示在插入模式下生效
- c
表示在命令行模式下生效
- Recursive Mapping
遞歸的映射。其實很好理解,也就是如果鍵a被映射成了b,c又被映射成了a,如果映射是遞歸的,那么c就被映射成了b。
:map a b :map c a
對於c效果等同於
:map c b
默認的map就是遞歸的。如果遇到[nore]這種前綴,比如:noremap,就表示這種map是非遞歸的。
- unmap
unmap后面跟着一個按鍵組合,表示刪除這個映射。
:unmap c
那么在map生效模式下,c不再被映射到a上。
同樣,unmap可以加各種前綴,表示影響到的模式。
- mapclear
mapclear直接清除相關模式下的所有映射。
同樣,mapclear可以加各種前綴,表示影響到的模式。
這里列出常用的一些map命令,默認map命令影響到普通模式和可視模式。
詳細查看 :help map-overview
:
COMMANDS MODES ~
:map :noremap :unmap Normal, Visual, Select, Operator-pending
:nmap :nnoremap :nunmap Normal
:vmap :vnoremap :vunmap Visual and Select
:smap :snoremap :sunmap Select
:xmap :xnoremap :xunmap Visual
:omap :onoremap :ounmap Operator-pending
:map! :noremap! :unmap! Insert and Command-line
:imap :inoremap :iunmap Insert
:lmap :lnoremap :lunmap Insert, Command-line, Lang-Arg
:cmap :cnoremap :cunmap Command-line
字母代表含義:
'n' (for normal), 'v' (for visual and select), 'c' (for command), 'x' (for visual mode), 's' (for select), 'o' (for operator pending).
可以試試這些命令
- 命令行模式下建一個mapping
nmap b a
- 現在普通模式下,按b,可以進入插入模式,隨便輸入一些字符
- 命令行模式下建一個mapping
vmap b d
- 現在普通模式下,按V,進入了可視模式,並且選定了一整行,按下b,可以刪除整行
- 命令行模式下建一個mapping
imap b a
- 現在試着給正在編輯的這個文件輸入一個字符”b”吧 :p
- 命令行模式下建一個mapping
cmap b c
- 命令行模式下, 按下b,會出來一個a
如果vim的按鍵已經被你弄得亂七八糟了,試着用unmap和mapclear清除這些mapping, 或者用noremap 來中斷遞歸執行.