【Vim】使用map自定義快捷鍵

map簡介

map是一個映射命令,將常用的很長的命令映射到一個新的功能鍵上霎奢。map是Vim強(qiáng)大的一個重要原因,可以自定義各種快捷鍵饼灿,用起來自然得心應(yīng)手幕侠。

映射的種類

有五種映射存在:

  • 用于普通模式: 輸入命令時(shí)。
  • 用于可視模式: 可視區(qū)域高亮并輸入命令時(shí)碍彭。
  • 用于操作符等待模式: 操作符等待中 ("d"晤硕,"y","c" 等等之后)庇忌。
  • 用于插入模式: 也用于替換模式舞箍。
  • 用于命令行模式: 輸入 ":" 或 "/" 命令時(shí)。

幾種模式的介紹

  1. Normal Mode
    也就是最一般的普通模式皆疹,默認(rèn)進(jìn)入vim之后疏橄,處于這種模式。

  2. Visual Mode
    一般譯作可視模式略就,在這種模式下選定一些字符捎迫、行、多列表牢。
    在普通模式下窄绒,可以按v進(jìn)入。

  3. Insert Mode
    插入模式崔兴,其實(shí)就是指處在編輯輸入的狀態(tài)彰导。普通模式下蛔翅,可以按i進(jìn)入。

  4. Select Mode
    選擇模式位谋。用鼠標(biāo)拖選區(qū)域的時(shí)候山析,就進(jìn)入了選擇模式。和可視模式不同的是倔幼,在這個模式下,選擇完了高亮區(qū)域后爽待,敲任何按鍵就直接輸入并替換選擇的文本了损同。和windows下的編輯器選定編輯的效果一致。普通模式下鸟款,可以按gh進(jìn)入膏燃。

  5. 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)入我的博客主頁

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棍掐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拷况,更是在濱河造成了極大的恐慌塌衰,老刑警劉巖诉稍,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異最疆,居然都是意外死亡杯巨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門努酸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來服爷,“玉大人,你說我怎么就攤上這事获诈∪栽矗” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵舔涎,是天一觀的道長笼踩。 經(jīng)常有香客問我,道長亡嫌,這世上最難降的妖魔是什么嚎于? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮挟冠,結(jié)果婚禮上于购,老公的妹妹穿的比我還像新娘。我一直安慰自己知染,他們只是感情好肋僧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著控淡,像睡著了一般嫌吠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掺炭,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天辫诅,我揣著相機(jī)與錄音,去河邊找鬼竹伸。 笑死泥栖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勋篓。 我是一名探鬼主播吧享,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼譬嚣!你這毒婦竟也來了钢颂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拜银,失蹤者是張志新(化名)和其女友劉穎殊鞭,沒想到半個月后遭垛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡操灿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年锯仪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趾盐。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡庶喜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出救鲤,到底是詐尸還是另有隱情久窟,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布本缠,位于F島的核電站斥扛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丹锹。R本人自食惡果不足惜稀颁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卷仑。 院中可真熱鬧峻村,春花似錦麸折、人聲如沸锡凝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窜锯。三九已至,卻和暖如春芭析,著一層夾襖步出監(jiān)牢的瞬間锚扎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工馁启, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驾孔,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓惯疙,卻偏偏與公主長得像翠勉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霉颠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 映射的種類 有五種映射存在: 用于普通模式: 輸入命令時(shí)对碌。 用于可視模式: 可視區(qū)域高亮并輸入命令時(shí)。 用于操作符...
    __XY__閱讀 860評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蒿偎,服務(wù)發(fā)現(xiàn)朽们,斷路器怀读,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Ubuntu的發(fā)音 Ubuntu叁丧,源于非洲祖魯人和科薩人的語言犁跪,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,156評論 9 467
  • 由我發(fā)起的書香童年護(hù)苗計(jì)劃之繪本講師訓(xùn)練營從九月開始歹袁,每月一期坷衍,期期爆滿,目前已經(jīng)成功舉辦了三期(12月的第四期也...
    阿渡SZ閱讀 571評論 1 7
  • 我們的風(fēng)箏条舔, 為何會彷徨枫耳? 迷失原來的方向, 回憶閃爍的淚光…… 曾經(jīng)孟抗, 寫下美麗約定迁杨, 一同登山欣賞, 朝陽初升...
    蕭竺閱讀 604評論 0 0