標籤:vim
map簡介
map是一個映射命令,將常用的很長的命令映射到一個新的功能鍵上。map是Vim強大的一個重要原因,可以自訂各種快速鍵,用起來自然得心應手。
映射的種類
有五種映射存在:
- 用於普通模式: 輸入命令時。
- 用於可視模式: 可視地區高亮並輸入命令時。
- 用於操作符等待模式: 操作符等待中 (“d”,”y”,”c” 等等之後)。
- 用於插入模式: 也用於替換模式。
- 用於命令列模式: 輸入 “:” 或 “/” 命令時。
幾種模式的介紹
Normal Mode
也就是最一般的普通模式,預設進入vim之後,處於這種模式。
Visual Mode
一般譯作可視模式,在這種模式下選定一些字元、行、多列。
在普通模式下,可以按v進入。
Insert Mode
插入模式,其實就是指處在編輯輸入的狀態。普通模式下,可以按i進入。
Select Mode
選擇模式。用滑鼠拖選地區的時候,就進入了選擇模式。和可視模式不同的是,在這個模式下,選擇完了高亮地區後,敲任何按鍵就直接輸入並替換選擇的文本了。和windows下的編輯器選定編輯的效果一致。普通模式下,可以按gh進入。
Command-Line/Ex Mode
命令列模式和Ex模式。兩者略有不同,普通模式下按冒號(:)進入Command-Line模式,可以輸入各種命令,
使用vim的各種強大功能。普通模式下按Q進入Ex模式,其實就是多行的Command-Line模式。
命令的組合
同Vim下的其他命令一樣,命令的名字往往由好幾段組成。首碼作為命令本身的修飾符,微調命令的效果。
對於map而言,可能有這麼幾種首碼:
*nore
表示非遞迴。
遞迴的映射。其實很好理解,也就是如果鍵a被映射成了b,c又被映射成了a,如果映射是遞迴的,那麼c就被映射成了b。
* n
表示在普通模式下生效
* v
表示在可視模式下生效
* i
表示在插入模式下生效
* c
表示在命令列模式下生效
普通模式的映射命令map
命令格式:
:map {lhs} {rhs}
其含義是,在:map作用的模式中把鍵系列 {lhs} 映射為 {rhs},{rhs}可進行映射掃描,也就是可遞迴映射。
舉例:
:map td :tabnew .<cr>
含義:在其作用模式(普通、可視、操作符)下,輸入td等價於輸入 :tabnew . 。而普通模式下輸入:tabnew . 就是開啟目前的目錄
如果再定義綁定 :map ts td,就是指在其作用模式下輸入ts等價於td,也就是開啟目前的目錄。不過如果沒有特殊需要,一般不建議遞迴映射。
noremap
:noremap和:map命令相對,作用模式和命令格式都相同,只不過不允許再對{rhs}進行映射掃描,也就是{lhs}定義後的映射就是{rhs}的鍵序列,不會再對{rhs}鍵序列重新解釋掃描。它一般用於重定義一個命令,當然如果:map不需要遞迴映射的話,建議使用:noremap
比如:
:noremap ts td
它的意思是在其作用模式下,輸入ts就是輸入td,但是和:map不同的是,此時td再不會做進一步掃描解釋。雖然之前已經定義了td,但是不會對td再做掃描。
unmap
:unmap是對應取消:map綁定的{lhs},作用模式相同,命令格式 :unmap {lhs}。
例如:
:unmap td
就是取消在其作用模式中td的綁定,比如之前td被綁定為:tabnew .,此時此綁定消失。
mapclear
:mapclear時對應取消所有:map綁定的,慎用!
只用於普通模式的
:nmap
:nmap是:map的普通模式板,也就是說其綁定的鍵只作用於普通模式。
例如:
:nmap td :tabnew . 和 :map td :tabnew . 在普通模式下等效
:nnoremap
:nnorempa和:nmap的關係和:noremap和:map的關係一樣,只是:nmap的非遞迴版
:nunmap
:nunmap和:nmap的關係和:unmap和:map的關係一樣,取消:nmap的綁定。
:nmapclear
:nmapclear是對應取消所有:map綁定的,慎用!
另外
{rhs} 之前可能顯示一個特殊字元:
* 表示它不可重新對應
& 表示僅指令碼的局部映射可以被重新對應
@ 表示緩衝區的局部映射
到這一步你可以輕鬆的長吸一口氣,因為相關的命令已經都瞭解了,記不住沒關係,可以隨時:help map一下。
鍵表
- 小鍵盤 0 到 9
特殊參數
有些特殊參數必須映射命令的後邊,在其他任何參數的前面。
如果這些映射命令的第一個參數是,映射將只局限於當前緩衝區(也就是你此時正編輯的檔案)內。比如:
:map ,w /a
它的意思時在當前緩衝區裡定義鍵綁定,“,w”將在當前緩衝區裡尋找字元a。同樣你可以在其他緩衝區裡定義:
:map ,w /b
比如我經常開啟多個標籤(:tabedit),想要在各自標籤裡定義”,w”鍵綁定,那麼你只要在每個標籤頁裡分別定義就可,其範圍也只在各自的標籤裡。同樣要清除這些緩衝區的鍵綁定也要加上參數,比如:
:unmap ,w
:mapclear
是指執行鍵綁定時不在命令列上回顯,比如:
:map ,w /abcd
你在輸入,w尋找abcd時,命令列上不會顯示/abcd,如果沒有參數就會顯示出來。
一般用於定義特殊鍵怕有副作用的場合。比如:
:map /Header
. 如果定義新映射的第一個參數是,那麼參數會作為運算式來進行計算,結果使用實際使用的,例如:
:inoremap . 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,並返回空。
一般用於定義新的鍵映射或者縮寫命令的同時檢查是否該鍵已經被映射,如果該映射或者縮寫已經存在,則該命令會失敗
和mapleader變數
mapleader變數對所有map映射命令起效,它的作用是將參數替換成mapleader變數的值,比如:
:map A oanother line
如果mapleader變數沒有設定,則用預設的反斜線代替,因此這個映射等效於:
:map \A oanother line
意思時輸入\A鍵時,在下一行輸入another line並返回到普通模式。
如果設定了mapleader變數,比如:
let mapleader = “,”
那麼就等效於:
:map ,A oanother line
和maplocalleader變數
和類似,只不過它只作用於緩衝區。
因此在設定mapleader和maplocalleader時最好區分開,不要出現衝突。
轉載請註明作者Jason Ding及其出處
GitCafe部落客頁(http://jasonding1354.gitcafe.io/)
Github部落客頁(http://jasonding1354.github.io/)
CSDN部落格(http://blog.csdn.net/jasonding1354)
簡書首頁(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
百度搜尋jasonding1354進入我的部落客頁
【Vim】使用map自訂快速鍵