map簡介
map是一個映射命令,將常用的很長的命令映射到一個新的功能鍵上霎奢。map是Vim強(qiáng)大的一個重要原因,可以自定義各種快捷鍵饼灿,用起來自然得心應(yīng)手幕侠。
映射的種類
有五種映射存在:
- 用于普通模式: 輸入命令時(shí)。
- 用于可視模式: 可視區(qū)域高亮并輸入命令時(shí)碍彭。
- 用于操作符等待模式: 操作符等待中 ("d"晤硕,"y","c" 等等之后)庇忌。
- 用于插入模式: 也用于替換模式舞箍。
- 用于命令行模式: 輸入 ":" 或 "/" 命令時(shí)。
幾種模式的介紹
Normal Mode
也就是最一般的普通模式皆疹,默認(rèn)進(jìn)入vim之后疏橄,處于這種模式。Visual Mode
一般譯作可視模式略就,在這種模式下選定一些字符捎迫、行、多列表牢。
在普通模式下窄绒,可以按v進(jìn)入。Insert Mode
插入模式崔兴,其實(shí)就是指處在編輯輸入的狀態(tài)彰导。普通模式下蛔翅,可以按i進(jìn)入。Select Mode
選擇模式位谋。用鼠標(biāo)拖選區(qū)域的時(shí)候山析,就進(jìn)入了選擇模式。和可視模式不同的是倔幼,在這個模式下,選擇完了高亮區(qū)域后爽待,敲任何按鍵就直接輸入并替換選擇的文本了损同。和windows下的編輯器選定編輯的效果一致。普通模式下鸟款,可以按gh進(jìn)入膏燃。Command-Line/Ex Mode
命令行模式和Ex模式。兩者略有不同何什,普通模式下按冒號(:)進(jìn)入Command-Line模式组哩,可以輸入各種命令,
使用vim的各種強(qiáng)大功能处渣。普通模式下按Q進(jìn)入Ex模式伶贰,其實(shí)就是多行的Command-Line模式。
命令的組合
同Vim下的其他命令一樣罐栈,命令的名字往往由好幾段組成黍衙。前綴作為命令本身的修飾符,微調(diào)命令的效果荠诬。
對于map而言琅翻,可能有這么幾種前綴:
- nore
表示非遞歸。
遞歸的映射柑贞。其實(shí)很好理解方椎,也就是如果鍵a被映射成了b,c又被映射成了a钧嘶,如果映射是遞歸的棠众,那么c就被映射成了b。- n
表示在普通模式下生效- v
表示在可視模式下生效- i
表示在插入模式下生效- c
表示在命令行模式下生效
普通模式的映射命令
map
命令格式:
:map {lhs} {rhs}
其含義是有决,在:map作用的模式中把鍵系列 {lhs} 映射為 {rhs}摄欲,{rhs}可進(jìn)行映射掃描,也就是可遞歸映射疮薇。
舉例:
:map td :tabnew .<cr>
含義:在其作用模式(普通胸墙、可視、操作符)下按咒,輸入td等價(jià)于輸入 :tabnew . <cr>迟隅。而普通模式下輸入:tabnew . <cr>就是打開當(dāng)前目錄
如果再定義綁定 :map ts td但骨,就是指在其作用模式下輸入ts等價(jià)于td,也就是打開當(dāng)前目錄智袭。不過如果沒有特殊需要奔缠,一般不建議遞歸映射。
noremap
:noremap和:map命令相對吼野,作用模式和命令格式都相同校哎,只不過不允許再對{rhs}進(jìn)行映射掃描,也就是{lhs}定義后的映射就是{rhs}的鍵序列瞳步,不會再對{rhs}鍵序列重新解釋掃描闷哆。它一般用于重定義一個命令,當(dāng)然如果:map不需要遞歸映射的話单起,建議使用:noremap
比如:
:noremap ts td
它的意思是在其作用模式下抱怔,輸入ts就是輸入td,但是和:map不同的是嘀倒,此時(shí)td再不會做進(jìn)一步掃描解釋屈留。雖然之前已經(jīng)定義了td,但是不會對td再做掃描测蘑。
unmap
:unmap是對應(yīng)取消:map綁定的{lhs}灌危,作用模式相同,命令格式 :unmap {lhs}碳胳。
例如:
:unmap td
就是取消在其作用模式中td的綁定乍狐,比如之前td被綁定為:tabnew .<cr>,此時(shí)此綁定消失固逗。
mapclear
:mapclear時(shí)對應(yīng)取消所有:map綁定的浅蚪,慎用!
只用于普通模式的
:nmap
:nmap是:map的普通模式板烫罩,也就是說其綁定的鍵只作用于普通模式惜傲。
例如:
:nmap td :tabnew .<cr> 和 :map td :tabnew .<cr> 在普通模式下等效
:nnoremap
:nnorempa和:nmap的關(guān)系和:noremap和:map的關(guān)系一樣,只是:nmap的非遞歸版
:nunmap
:nunmap和:nmap的關(guān)系和:unmap和:map的關(guān)系一樣贝攒,取消:nmap的綁定盗誊。
:nmapclear
:nmapclear是對應(yīng)取消所有:map綁定的,慎用隘弊!
另外
{rhs} 之前可能顯示一個特殊字符:
- 表示它不可重映射
& 表示僅腳本的局部映射可以被重映射
@ 表示緩沖區(qū)的局部映射
到這一步你可以輕松的長吸一口氣哈踱,因?yàn)橄嚓P(guān)的命令已經(jīng)都了解了,記不住沒關(guān)系梨熙,可以隨時(shí):help map一下开镣。
鍵表
<k0> - <k9> 小鍵盤 0 到 9
<S-...> Shift+鍵
<C-...> Control+鍵
<M-...> Alt+鍵 或 meta+鍵
<A-...> 同 <M-...>
<Esc> Escape 鍵
<Up> 光標(biāo)上移鍵
<Space> 插入空格
<Tab> 插入Tab
<CR> 等于<Enter>
特殊參數(shù)
有些特殊參數(shù)必須映射命令的后邊,在其他任何參數(shù)的前面咽扇。
<buffer>
<buffer>如果這些映射命令的第一個參數(shù)是<buffer>邪财,映射將只局限于當(dāng)前緩沖區(qū)(也就是你此時(shí)正編輯的文件)內(nèi)陕壹。比如:
:map <buffer> ,w /a<CR>
它的意思時(shí)在當(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>
<silent>是指執(zhí)行鍵綁定時(shí)不在命令行上回顯绊袋,比如:
:map <silent> ,w /abcd<CR>
你在輸入,w查找abcd時(shí)毕匀,命令行上不會顯示/abcd,如果沒有<silent>參數(shù)就會顯示出來愤炸。
<special>
<special>一般用于定義特殊鍵怕有副作用的場合期揪。比如:
:map <special> <F12> /Header<CR>
<expr>
<expr>. 如果定義新映射的第一個參數(shù)是<expr>掉奄,那么參數(shù)會作為表達(dá)式來進(jìn)行計(jì)算规个,結(jié)果使用實(shí)際使用的<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墅拭,并返回空。
<unique>
<unique>一般用于定義新的鍵映射或者縮寫命令的同時(shí)檢查是否該鍵已經(jīng)被映射涣狗,如果該映射或者縮寫已經(jīng)存在谍婉,則該命令會失敗
<Leader>和mapleader變量
mapleader變量對所有map映射命令起效,它的作用是將參數(shù)<leader>替換成mapleader變量的值镀钓,比如:
:map <Leader>A oanother line<Esc>
如果mapleader變量沒有設(shè)置穗熬,則用默認(rèn)的反斜杠代替,因此這個映射等效于:
:map \A oanother line<Esc>
意思時(shí)輸入\A鍵時(shí)丁溅,在下一行輸入another line并返回到普通模式唤蔗。
如果設(shè)置了mapleader變量,比如:
let mapleader = ","
那么就等效于:
:map ,A oanother line<Esc>
<LocalLeader>和maplocalleader變量
<LocalLeader>和<Leader>類似窟赏,只不過它只作用于緩沖區(qū)妓柜。
因此在設(shè)置mapleader和maplocalleader時(shí)最好區(qū)分開,不要出現(xiàn)沖突涯穷。
轉(zhuǎn)載請注明作者Jason Ding及其出處
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
Github博客主頁(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.reibang.com/users/2bd9b48f6ea8/latest_articles)
百度搜索jasonding1354進(jìn)入我的博客主頁