vim 自定义命令 自定义快捷键(转)
生活随笔
收集整理的這篇文章主要介紹了
vim 自定义命令 自定义快捷键(转)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
有五種映射存在?
- 用于普通模式: 輸入命令時。?
- 用于可視模式: 可視區(qū)域高亮并輸入命令時。?
- 用于操作符等待模式: 操作符等待中 ("d","y","c" 等等之后)。?
見下: |omap-info|。?
- 用于插入模式: 也用于替換模式。?
? 用于命令行模式: 輸入 ":" 或 "/" 命令時。?
下表是map綁定中,對應(yīng)的模式代號?,F(xiàn)在先了解一下,等看完之后再回過頭看這個模式代號就會明白了。?
字 符 模 式 ~?
<Space> 普通、可視、選擇和操作符等待?
n 普通?
v 可視和選擇?
s 選擇?
x 可視?
o 操作符等待?
! 插入和命令行?
i 插入?
l 插入、命令行和 Lang-Arg 模式的 ":lmap" 映射?
c 命令行?
我主要講解一下“n(普通模式)”下的兩個綁定命令,等看完之后就對應(yīng)的明白別的模式下的命令了。?
適用于普通模式的映射命令主要有:?
1. :map?
[語法] :map {lhs} {rhs} |mapmode-nvo| *:map*?
1.1 作用模式: n、v、o (普通、可視和選擇、操作符等待)?
1.2 命令格式:?
:map {lhs} {rhs}?
含義: 在:map作用的模式中把鍵系列 {lhs} 映射為 {rhs},{rhs}可進(jìn)行映射掃描,也就是可遞歸映射。?
1.3 舉例:?
:map td :tabnew .<cr>?
含義:在其作用模式(普通、可視、操作符)下,輸入td等價于輸入 :tabnew . <cr>。而普通模式下輸入:tabnew . <cr>就是打開當(dāng)前目錄?
如果再定義綁定 :map ts td,就是指在其作用模式下輸入ts等價于td,也就是打開當(dāng)前目錄。不過如果沒有特殊需要,一般不建議遞歸映射。?
2. :noremap?
:moremap和:map命令相對,作用模式和命令格式都相同,只不過不允許再對{rhs}進(jìn)行映射掃描,也就是{lhs}定義后的映射就是{rhs}的鍵序列,不會再對{rhs}鍵序列重新解釋掃描。它一般用于重定義一個命令,當(dāng)然如果:map不需要遞歸映射的話,建議試用:noremap?
比如:?
:noremap ts td?
它的意思是在其作用模式下,輸入ts就是輸入td,但是和:map不同的是,此時td再不會做進(jìn)一步掃描解釋。雖然之前已經(jīng)定義了td,但是不會對td再做掃描?
3. :unmap?
:unmap是對應(yīng)取消:map綁定的{lhs},作用模式相同,命令格式 :unmap {lhs}。?
例如:?
:unmap td?
就是取消在其作用模式中td的綁定,比如之前td被綁定為:tabnew .<cr>,此時此綁定消失。?
4. :mapclear?
:mapclear時對應(yīng)取消所有:map綁定的,慎用!?
5. :nmap?
:nmap是:map的普通模式板,也就是說其綁定的鍵只作用于普通模式。?
例如:?
:nmap td :tabnew .<cr> 和 :map td :tabnew .<cr> 在普通模式下等效?
6. :nnoremap?
:nnorempa和:nmap的關(guān)系和:noremap和:map的關(guān)系一樣,只是:nmap的非遞歸版?
7. :nunmap?
:nunmap和:nmap的關(guān)系和:unmap和:map的關(guān)系一樣,取消:nmap的綁定。?
8. :nmapclear?
:nmapclear是對應(yīng)取消所有:map綁定的,慎用!?
看完以上,應(yīng)該可以發(fā)現(xiàn)一個規(guī)律,前4個是一組,后4個時一組,后一組比前一組多一個n就是指只作用于普通模式。其中每組內(nèi)*nore*是其對應(yīng)的非遞歸版、*un*是取消綁定某個<lhs>綁定、clear后綴是取消所有綁定。發(fā)現(xiàn)了這個規(guī)律,再翻到前面的模式代號表,你大體可以猜到vmap、xmap、smap、omap是什么意思了吧,以及相對應(yīng)的nore版本、un版本、clear版本。?
另外:?
{rhs} 之前可能顯示一個特殊字符:?
* 表示它不可重映射?
& 表示僅腳本的局部映射可以被重映射?
@ 表示緩沖區(qū)的局部映射?
到這一步你可以輕松的長吸一口氣,因為相關(guān)的命令已經(jīng)都了解了,記不住沒關(guān)系,可以隨時: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" 入口鍵?
特殊參數(shù):?
1. <buffer>?
2. <silent>?
3. <special>?
4. <script>?
5. <expr>?
6. <unique>?
它們必須映射命令的后邊,在其他任何參數(shù)的前面。?
<buffer>如果這些映射命令的第一個參數(shù)是<buffer>,映射將只局限于當(dāng)前緩沖區(qū)(也就是你此時正編輯的文件)內(nèi)。比如:?
:map <buffer> ,w /a<CR>?
它的意思時在當(dāng)前緩沖區(qū)里定義鍵綁定,“,w”將在當(dāng)前緩沖區(qū)里查找字符a。同樣你可以在其他緩沖區(qū)里定義:?
:map <buffer> ,w /b<CR>?
比如我經(jīng)常打開多個標(biāo)簽(:tabedit),想要在各自標(biāo)簽里定義",w"鍵綁定,那么你只要在每個標(biāo)簽頁里分別定義就可,其作用域也只在各自的標(biāo)簽里。同樣要清除這些緩沖區(qū)的鍵綁定也要加上<buffer>參數(shù),比如:?
:unmap <buffer> ,w?
:mapclear <buffer>?
<silent>是指執(zhí)行鍵綁定時不在命令行上回顯,比如:?
:map <silent> ,w /abcd<CR>?
你在輸入,w查找abcd時,命令行上不會顯示/abcd,如果沒有<silent>參數(shù)就會顯示出來?
<special>一般用于定義特殊鍵怕有副作用的場合。比如:?
:map <special> <F12> /Header<CR>?
<unique>一般用于定義新的鍵映射或者縮寫命令的同時檢查是否該鍵已經(jīng)被映射,如果該映射或者縮寫已經(jīng)存在,則該命令會失敗?
<expr>. 如果定義新映射的第一個參數(shù)是<expr>,那么參數(shù)會作為表達(dá)式來進(jìn)行計算,結(jié)果使用實際使用的<rhs>,例如:?
:inoremap <expr> . InsertDot()?
這可以用來檢查光標(biāo)之前的文本并在一定條件下啟動全能 (omni) 補(bǔ)全。?
一個例子:?
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復(fù)位列表編號到0,并返回空。?
<Leader> mapleader?
mapleader變量對所有map映射命令起效,它的作用是將參數(shù)<leader>替換成mapleader變量的值,比如:?
:map <Leader>A oanother line<Esc>?
如果mapleader變量沒有設(shè)置,則用默認(rèn)的反斜杠代替,因此這個映射等效于:?
:map \A oanother line<Esc>?
意思時輸入\A鍵時,在下一行輸入another line并返回到普通模式。?
如果設(shè)置了mapleader變量,比如:?
let mapleader = ","?
那么就等效于:?
:map ,A oanother line<Esc>?
<LocalLeader> maplocalleader?
<LocalLeader>和<Leader>類似,只不過它只作用于緩沖區(qū)。?
因此在設(shè)置mapleader和maplocalleader時最好區(qū)分開,不要出現(xiàn)沖突。?
大體上映射的主要部分已經(jīng)都提到了,還有很多具體的映射相關(guān)的內(nèi)容可以參見:help map
- 用于普通模式: 輸入命令時。?
- 用于可視模式: 可視區(qū)域高亮并輸入命令時。?
- 用于操作符等待模式: 操作符等待中 ("d","y","c" 等等之后)。?
見下: |omap-info|。?
- 用于插入模式: 也用于替換模式。?
? 用于命令行模式: 輸入 ":" 或 "/" 命令時。?
下表是map綁定中,對應(yīng)的模式代號?,F(xiàn)在先了解一下,等看完之后再回過頭看這個模式代號就會明白了。?
字 符 模 式 ~?
<Space> 普通、可視、選擇和操作符等待?
n 普通?
v 可視和選擇?
s 選擇?
x 可視?
o 操作符等待?
! 插入和命令行?
i 插入?
l 插入、命令行和 Lang-Arg 模式的 ":lmap" 映射?
c 命令行?
我主要講解一下“n(普通模式)”下的兩個綁定命令,等看完之后就對應(yīng)的明白別的模式下的命令了。?
適用于普通模式的映射命令主要有:?
1. :map?
[語法] :map {lhs} {rhs} |mapmode-nvo| *:map*?
1.1 作用模式: n、v、o (普通、可視和選擇、操作符等待)?
1.2 命令格式:?
:map {lhs} {rhs}?
含義: 在:map作用的模式中把鍵系列 {lhs} 映射為 {rhs},{rhs}可進(jìn)行映射掃描,也就是可遞歸映射。?
1.3 舉例:?
:map td :tabnew .<cr>?
含義:在其作用模式(普通、可視、操作符)下,輸入td等價于輸入 :tabnew . <cr>。而普通模式下輸入:tabnew . <cr>就是打開當(dāng)前目錄?
如果再定義綁定 :map ts td,就是指在其作用模式下輸入ts等價于td,也就是打開當(dāng)前目錄。不過如果沒有特殊需要,一般不建議遞歸映射。?
2. :noremap?
:moremap和:map命令相對,作用模式和命令格式都相同,只不過不允許再對{rhs}進(jìn)行映射掃描,也就是{lhs}定義后的映射就是{rhs}的鍵序列,不會再對{rhs}鍵序列重新解釋掃描。它一般用于重定義一個命令,當(dāng)然如果:map不需要遞歸映射的話,建議試用:noremap?
比如:?
:noremap ts td?
它的意思是在其作用模式下,輸入ts就是輸入td,但是和:map不同的是,此時td再不會做進(jìn)一步掃描解釋。雖然之前已經(jīng)定義了td,但是不會對td再做掃描?
3. :unmap?
:unmap是對應(yīng)取消:map綁定的{lhs},作用模式相同,命令格式 :unmap {lhs}。?
例如:?
:unmap td?
就是取消在其作用模式中td的綁定,比如之前td被綁定為:tabnew .<cr>,此時此綁定消失。?
4. :mapclear?
:mapclear時對應(yīng)取消所有:map綁定的,慎用!?
5. :nmap?
:nmap是:map的普通模式板,也就是說其綁定的鍵只作用于普通模式。?
例如:?
:nmap td :tabnew .<cr> 和 :map td :tabnew .<cr> 在普通模式下等效?
6. :nnoremap?
:nnorempa和:nmap的關(guān)系和:noremap和:map的關(guān)系一樣,只是:nmap的非遞歸版?
7. :nunmap?
:nunmap和:nmap的關(guān)系和:unmap和:map的關(guān)系一樣,取消:nmap的綁定。?
8. :nmapclear?
:nmapclear是對應(yīng)取消所有:map綁定的,慎用!?
看完以上,應(yīng)該可以發(fā)現(xiàn)一個規(guī)律,前4個是一組,后4個時一組,后一組比前一組多一個n就是指只作用于普通模式。其中每組內(nèi)*nore*是其對應(yīng)的非遞歸版、*un*是取消綁定某個<lhs>綁定、clear后綴是取消所有綁定。發(fā)現(xiàn)了這個規(guī)律,再翻到前面的模式代號表,你大體可以猜到vmap、xmap、smap、omap是什么意思了吧,以及相對應(yīng)的nore版本、un版本、clear版本。?
另外:?
{rhs} 之前可能顯示一個特殊字符:?
* 表示它不可重映射?
& 表示僅腳本的局部映射可以被重映射?
@ 表示緩沖區(qū)的局部映射?
到這一步你可以輕松的長吸一口氣,因為相關(guān)的命令已經(jīng)都了解了,記不住沒關(guān)系,可以隨時: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" 入口鍵?
特殊參數(shù):?
1. <buffer>?
2. <silent>?
3. <special>?
4. <script>?
5. <expr>?
6. <unique>?
它們必須映射命令的后邊,在其他任何參數(shù)的前面。?
<buffer>如果這些映射命令的第一個參數(shù)是<buffer>,映射將只局限于當(dāng)前緩沖區(qū)(也就是你此時正編輯的文件)內(nèi)。比如:?
:map <buffer> ,w /a<CR>?
它的意思時在當(dāng)前緩沖區(qū)里定義鍵綁定,“,w”將在當(dāng)前緩沖區(qū)里查找字符a。同樣你可以在其他緩沖區(qū)里定義:?
:map <buffer> ,w /b<CR>?
比如我經(jīng)常打開多個標(biāo)簽(:tabedit),想要在各自標(biāo)簽里定義",w"鍵綁定,那么你只要在每個標(biāo)簽頁里分別定義就可,其作用域也只在各自的標(biāo)簽里。同樣要清除這些緩沖區(qū)的鍵綁定也要加上<buffer>參數(shù),比如:?
:unmap <buffer> ,w?
:mapclear <buffer>?
<silent>是指執(zhí)行鍵綁定時不在命令行上回顯,比如:?
:map <silent> ,w /abcd<CR>?
你在輸入,w查找abcd時,命令行上不會顯示/abcd,如果沒有<silent>參數(shù)就會顯示出來?
<special>一般用于定義特殊鍵怕有副作用的場合。比如:?
:map <special> <F12> /Header<CR>?
<unique>一般用于定義新的鍵映射或者縮寫命令的同時檢查是否該鍵已經(jīng)被映射,如果該映射或者縮寫已經(jīng)存在,則該命令會失敗?
<expr>. 如果定義新映射的第一個參數(shù)是<expr>,那么參數(shù)會作為表達(dá)式來進(jìn)行計算,結(jié)果使用實際使用的<rhs>,例如:?
:inoremap <expr> . InsertDot()?
這可以用來檢查光標(biāo)之前的文本并在一定條件下啟動全能 (omni) 補(bǔ)全。?
一個例子:?
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復(fù)位列表編號到0,并返回空。?
<Leader> mapleader?
mapleader變量對所有map映射命令起效,它的作用是將參數(shù)<leader>替換成mapleader變量的值,比如:?
:map <Leader>A oanother line<Esc>?
如果mapleader變量沒有設(shè)置,則用默認(rèn)的反斜杠代替,因此這個映射等效于:?
:map \A oanother line<Esc>?
意思時輸入\A鍵時,在下一行輸入another line并返回到普通模式。?
如果設(shè)置了mapleader變量,比如:?
let mapleader = ","?
那么就等效于:?
:map ,A oanother line<Esc>?
<LocalLeader> maplocalleader?
<LocalLeader>和<Leader>類似,只不過它只作用于緩沖區(qū)。?
因此在設(shè)置mapleader和maplocalleader時最好區(qū)分開,不要出現(xiàn)沖突。?
大體上映射的主要部分已經(jīng)都提到了,還有很多具體的映射相關(guān)的內(nèi)容可以參見:help map
轉(zhuǎn)載于:https://www.cnblogs.com/zhihaowang/archive/2011/01/07/10128588.html
總結(jié)
以上是生活随笔為你收集整理的vim 自定义命令 自定义快捷键(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长安铃木天语sx4防冻液壶怎么打开?
- 下一篇: 数据库优化的几条基本策略