vim-map
軟件版本:
ubuntu10.04
Linux version 2.6.32-42-generic
VIM - Vi IMproved 7.2
目錄:
1. 簡介
2. 映射與運行模式的關系
3. 例子
4. 其他
1. 簡介
如果想讓 vim 成為你手中的利器,vim 的 map 功能就不得不學,它用於鍵映射、縮寫和自定義命令。由於 map 命令有很多,不同的命令作用與不同的模式之下,文章主要是想分析一下各個命令與模式之間的關系。
2. 映射與運行模式的關系
映射是否起作用的一個關鍵因數是當前 vim 處於哪種模式之下。map 與六種 vim 模式相關(vim 有多少種工作模式請參考 :help vim-modes):
- (o) 普通模式: 輸入命令時。
- (x) 可視模式: 可視區域高亮並輸入命令時。
- (s) 選擇模式: 類似於可視模式,但鍵入的字符對選擇區進行替換。
- (o) 操作符等待模式: 操作符等待中 ("d","y","c" 等等之后)。
- (i) 插入模式: 也用於替換模式。
- (c) 命令行模式: 輸入 ":" 或 "/" 命令時。
了解到 map 是與 vim 的工作模式相關之后,這時候再看一下支持嵌套和遞歸的 map 命令命名有什么特別之處(:help map):
命令 左邊 右邊 模式 跳躍點
:map {lhs} {rhs} |mapmode-nvo| *:map*
:nm[ap] {lhs} {rhs} |mapmode-n| *:nm* *:nmap*
:vm[ap] {lhs} {rhs} |mapmode-v| *:vm* *:vmap*
:xm[ap] {lhs} {rhs} |mapmode-x| *:xm* *:xmap*
:smap {lhs} {rhs} |mapmode-s| *:smap*
:om[ap] {lhs} {rhs} |mapmode-o| *:om* *:omap*
:map! {lhs} {rhs} |mapmode-ic| *:map!*
:im[ap] {lhs} {rhs} |mapmode-i| *:im* *:imap*
:lm[ap] {lhs} {rhs} |mapmode-l| *:lm* *:lmap*
:cm[ap] {lhs} {rhs} |mapmode-c| *:cm* *:cmap*
不難發現 map 命令的命名與它所支持的 vim 模式相關。下面再列出具體的關系:
字 符 模 式
<Space> 普通、可視、選擇和操作符等待
n 普通
v 可視和選擇
s 選擇
x 可視
o 操作符等待
! 插入和命令行
i 插入
l 插入、命令行和 Lang-Arg 模式的 ":lmap" 映射
c 命令行
總結,map 命令的首字母表明它作用於何中 vim 模式之下。
3. 例子
我以一些簡單的命令演示一下 map 命令與 vim 模式之間的關系。
1) 普通模式
輸入一下命令:
:nmap ;y "+y
這樣,我們就可以使用 ;y 替代 "+y 將內容復制到全局緩沖中。但是如果你首先使用<C-V>選中一塊數據,然后按 ;y,結果沒有將數據復制到全局緩沖中,只能復制到局部緩沖。這是因為 nmap 只在普通模式下起作用。
2) 可視模式
輸入下面這條命令之后,上面提到的問題就不復存在了。
:xmap :y "+y
我們再來看一個好玩的。
3) 選擇模式
如果你不知道怎么進入選擇模式,請參考 :help select 。我覺得一般情況下使用選擇模式都是首先進入可視模式,然后鍵入 <CTRL-G> 進入選擇模式。因為當你處在選擇模式下,鍵盤的輸入將替換選中區域。
:smap ;y "+y
看上面的命令與之前的例子大同小異吧。但效果卻截然不同。操作過程:
按 v,進入可是模式,然后左右上下移動選中一片區域;
按<CTRL-G>進入選擇模式;
按 ;y 之后我們看到:"+y 。
為什么他沒有幫我們實現復制的功能?因為當前處於選擇模式,輸入的鍵值將被直接替換選中區域,而我們輸入的 ;y 被映射成 "+y 。
4) <Space>
<Space> 支持的的模式包括 nvo,其中 v 包括 x 和 s 。所以用 <Space> ,也就是 :map 命令,就足夠了,不需要重復鍵入那么多吃同樣的映射命令。
map ;y "+y map ;p "+p
用這個命令的另一個好處就是即使在選擇模式下,;y 仍然完成復制操作。
5) 操作等待模式
有必要說一下什么叫操作等待模式嗎?它其實跟普通模式很接近,但是出現在輸入操作符之后。例如你在普通模式下輸入 y 則會進入操作等待模式一會兒,它在等待 y 的組合鍵,例如 w 。所以,我們可以輸入一下命令做一下認證:
:omap [ w
當我們在普通模式下輸入 y[ 的作用就等同與 yw 。
6) 插入模式
加入下面這幾條命令,在輸入時,如果需要左右移動光標,我們也不需要把右手移動到方向間上面去了。
:imap <C-G>l <Right> :imap <C-G>h <Left> :imap <C-G><C-L> <C-Right> :imap <C-G><C-H> <C-Left>
在輸入模式下按下 <CTRL-G> 再按 l ,光標右移。<C-G> + <C-L> 光標右移一個字,相當於普通模式下的 w 。
7) 命令模式
按葫蘆畫瓢,在命令模式下也可以這樣干。
:cmap <C-G>l <Right> :cmap <C-G>h <Left> :cmap <C-G><C-L> <C-Right> :cmap <C-G><C-H> <C-Left>
8)!
既然命令模式和插入模式的映射是一樣的,就沒有必要敲那么多命令了,用 map! 就好了。
:map! <C-G>l <Right> :map! <C-G>h <Left> :map! <C-G><C-L> <C-Right> :map! <C-G><C-H> <C-Left>
4. 其他
有時間再補。