vim配置關於 map nmap vmap等

有五種映射存在 
- 用於普通模式: 輸入命令時。 
- 用於可視模式: 可視區域高亮並輸入命令時。 
- 用於操做符等待模式: 操做符等待中 ("d","y","c" 等等以後)。 
見下: |omap-info|。 
- 用於插入模式: 也用於替換模式。 
? 用於命令行模式: 輸入 ":" 或 "/" 命令時。 

下表是map綁定中,對應的模式代號。如今先了解一下,等看完以後再回過頭看這個模式代號就會明白了。 
字 符 模 式 ~ 
<Space> 普通、可視、選擇和操做符等待 
n 普通 
v 可視和選擇 
s 選擇 (在可視模式下Ctrl+G進入)
x 可視 
o 操做符等待 
! 插入和命令行 
i 插入 
l 插入、命令行和 Lang-Arg 模式的 ":lmap" 映射 
c 命令行 


我主要講解一下「n(普通模式)」下的兩個綁定命令,等看完以後就對應的明白別的模式下的命令了。 
適用於普通模式的映射命令主要有: 
1. :map 
[語法] :map {lhs} {rhs} |mapmode-nvo| *:map* 
1.1 做用模式: n、v、o (普通、可視和選擇、操做符等待) 
1.2 命令格式: 
:map {lhs} {rhs} 
含義: 在:map做用的模式中把鍵系列 {lhs} 映射爲 {rhs},{rhs}可進行映射掃描,也就是可遞歸映射。 
1.3 舉例: 
:map td :tabnew .<cr> 
含義:在其做用模式(普通、可視、操做符)下,輸入td等價於輸入 :tabnew . <cr>。而普通模式下輸入:tabnew . <cr>就是打開當前目錄 
若是再定義綁定 :map ts td,就是指在其做用模式下輸入ts等價於td,也就是打開當前目錄。不過若是沒有特殊須要,通常不建議遞歸映射。 

2. :noremap 
:moremap和:map命令相對,做用模式和命令格式都相同,只不過不容許再對{rhs}進行映射掃描,也就是{lhs}定義後的映射就是{rhs}的鍵序列,不會再對{rhs}鍵序列從新解釋掃描。它通常用於重定義一個命令,固然若是:map不須要遞歸映射的話,建議試用:noremap 
好比: 
:noremap ts td 
它的意思是在其做用模式下,輸入ts就是輸入td,可是和:map不一樣的是,此時td再不會作進一步掃描解釋。雖然以前已經定義了td,可是不會對td再作掃描 

3. :unmap 
:unmap是對應取消:map綁定的{lhs},做用模式相同,命令格式 :unmap {lhs}。 
例如: 
:unmap td 
就是取消在其做用模式中td的綁定,好比以前td被綁定爲:tabnew .<cr>,此時此綁定消失。 
4. :mapclear 
:mapclear時對應取消全部:map綁定的,慎用! 

5. :nmap 
:nmap是:map的普通模式板,也就是說其綁定的鍵只做用於普通模式。 
例如: 
:nmap td :tabnew .<cr> 和 :map td :tabnew .<cr> 在普通模式下等效 
6. :nnoremap 
:nnorempa和:nmap的關係和:noremap和:map的關係同樣,只是:nmap的非遞歸版 
7. :nunmap 
:nunmap和:nmap的關係和:unmap和:map的關係同樣,取消:nmap的綁定。 
8. :nmapclear 
:nmapclear是對應取消全部:map綁定的,慎用! 

看完以上,應該能夠發現一個規律,前4個是一組,後4個時一組,後一組比前一組多一個n就是指只做用於普通模式。其中每組內*nore*是其對應的非遞歸版、*un*是取消綁定某個<lhs>綁定、clear後綴是取消全部綁定。發現了這個規律,再翻到前面的模式代號表,你大致能夠猜到vmap、xmap、smap、omap是什麼意思了吧,以及相對應的nore版本、un版本、clear版本。 

另外: 
{rhs} 以前可能顯示一個特殊字符: 
* 表示它不可重映射 
& 表示僅腳本的局部映射能夠被重映射 
@ 表示緩衝區的局部映射 

到這一步你能夠輕鬆的長吸一口氣,由於相關的命令已經都瞭解了,記不住不要緊,能夠隨時:help map一下。不過別急,後面還有map更多的選項等着去攻克。 

鍵表 |key-notation| 
<k0> - <k9> 小鍵盤 0 到 9 *keypad-0* *keypad-9* 
<S-...> Shift+鍵 *shift* *<S-* 
<C-...> Control+鍵 *control* *ctrl* *<C-* 
<M-...> Alt+鍵 或 meta+鍵 *meta* *alt* *<M-* 
<A-...> 同 <m-...> *<A-* 
<t_xx> termcap 裏的 "xx" 入口鍵 

特殊參數: 
1. <buffer> 
2. <silent> 
3. <special> 
4. <script> 
5. <expr> 
6. <unique> 
它們必須映射命令的後邊,在其餘任何參數的前面。 

<buffer>若是這些映射命令的第一個參數是<buffer>,映射將只侷限於當前緩衝區(也就是你此時正編輯的文件)內。好比: 
:map <buffer> ,w /a<CR> 
它的意思時在當前緩衝區裏定義鍵綁定,「,w」將在當前緩衝區裏查找字符a。一樣你能夠在其餘緩衝區裏定義: 
:map <buffer> ,w /b<CR> 
好比我常常打開多個標籤(:tabedit),想要在各自標籤裏定義",w"鍵綁定,那麼你只要在每一個標籤頁裏分別定義就可,其做用域也只在各自的標籤裏。一樣要清除這些緩衝區的鍵綁定也要加上<buffer>參數,好比: 
:unmap <buffer> ,w 
:mapclear <buffer> 

<silent>是指執行鍵綁定時不在命令行上回顯,好比: 
:map <silent> ,w /abcd<CR> 
你在輸入,w查找abcd時,命令行上不會顯示/abcd,若是沒有<silent>參數就會顯示出來 

<special>通常用於定義特殊鍵怕有反作用的場合。好比: 
:map <special> <F12> /Header<CR> 

<unique>通常用於定義新的鍵映射或者縮寫命令的同時檢查是否該鍵已經被映射,若是該映射或者縮寫已經存在,則該命令會失敗 

<expr>. 若是定義新映射的第一個參數是<expr>,那麼參數會做爲表達式來進行計算,結果使用實際使用的<rhs>,例如: 
:inoremap <expr> . InsertDot() 
這能夠用來檢查光標以前的文本並在必定條件下啓動全能 (omni) 補全。 
一個例子: 
let counter = 0 
inoremap <expr> <C-L> ListItem() 
inoremap <expr> <C-R> ListReset() 

func ListItem() 
let g:counter += 1 
return g:counter . '. ' 
endfunc 

func ListReset() 
let g:counter = 0 
return '' 
endfunc 
在插入模式下,CTRL-L插入順序的列表編號,並返回;CTRL-R復位列表編號到0,並返回空。 


<Leader> mapleader 
mapleader變量對全部map映射命令起效,它的做用是將參數<leader>替換成mapleader變量的值,好比: 
:map <Leader>A oanother line<Esc> 
若是mapleader變量沒有設置,則用默認的反斜槓代替,所以這個映射等效於: 
:map \A oanother line<Esc> 
意思時輸入\A鍵時,在下一行輸入another line並返回到普通模式。 
若是設置了mapleader變量,好比: 
let mapleader = "," 
那麼就等效於: 
:map ,A oanother line<Esc> 

<LocalLeader> maplocalleader 
<LocalLeader>和<Leader>相似,只不過它只做用於緩衝區。 
所以在設置mapleader和maplocalleader時最好區分開,不要出現衝突。 

大致上映射的主要部分已經都提到了,還有不少具體的映射相關的內容能夠參見:help mapspa

相關文章
相關標籤/搜索