Vim進階2 map映射
簡介
map是一個 vim 中的一些列映射命令,將常用的很長的命令映射到一個新的功能鍵上。map是Vim強大的一個重要原因,可以自定義各種快捷鍵,用起來自然得心應手。
map系列命令格式
格式
以 map 命令為例,它的命令格式是這樣的:
:map {lhs} {rhs}
其含義是,在 :map
作用的模式中把鍵系列 {lhs}
映射為 {rhs}
,{rhs}
可進行映射掃描,也就是可遞歸映射。
舉例
:map td :tabnew .<cr>
含義:在其作用模式(普通、可視、操作符)下,輸入 td
等價于輸入 :tabnew . <cr>
。而普通模式下輸入:tabnew . <cr>
就是打開當前目錄。
而如果再映射一次
:map ts td
就是指在其作用模式下輸入 ts
等價于 td
,也就是打開當前目錄。不過如果沒有特殊需要,一般不建議遞歸映射。
映射命令
不同模式下的映射命令
使用下表中不同形式的map命令,可以針對特定的模式設置鍵盤映射,實際上,不同的 map 命令前綴是可以相互組合的,
-
nore 表示非遞歸。 遞歸的映射。其實很好理解,也就是如果鍵a被映射成了b,c又被映射成了a,如果映射是遞歸的,那么c就被映射成了b,這個會在后面再介紹。
-
n 表示在普通模式下生效
-
v 表示在可視模式下生效
-
i 表示在插入模式下生效
-
c 表示在命令行模式下生效
常見的映射命令的有效模式如下:
Command 命令 | Normal 常規模式 | Visual 可視化模式 | Operator Pending 運算符模式 | Insert Only 插入模式 | Command Line 命令行模式 |
---|---|---|---|---|---|
:map | y | y | y | ||
:nmap | y | ||||
:vmap | y | ||||
:omap | y | ||||
:map! | y | y | |||
:imap | y | ||||
:cmap | y |
noremap
看它的名字其實也很好理解它的含義:no re map,即不要 重新 映射,就是說不要進行遞歸映射。
具體來說,: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 .<cr>
,此時此綁定消失。
注意 unmap
必須要有一個參數,即被取消的 {lhs}
,否則會報錯。
mapclear
:mapclear
是對應取消所有 :map
綁定的,慎用!
常用map映射參考
下面介紹幾個筆者在用的 vim 映射,大家如果覺得好用的話可以加到自己的 vimrc
里面。主要還是鼓勵大家在自己的日常使用中根據自己輸入的痛點,靈活地設計自己的map,畢竟做不同的工作,寫不同的語言,輸入的痛點都是不同的,這也正是 Vim 靈活好玩的地方之一。
推薦的原則是:將自己最常用的鍵設置在自己最容易按到的地方。
1. 禁用方向鍵
為了強迫幫助新手盡快適應 hjkl 來移動光標,而非用方向鍵,我們可以將方向鍵禁用掉,包括常規模式和插入模式,這也是 MIT 建議的 vimrc 中的設置 (該鏈接會直接下載MIT的vimrc)。
" 常規模式禁用方向鍵
nnoremap <Left> :echoe "Use h"<CR>
nnoremap <Right> :echoe "Use l"<CR>
nnoremap <Up> :echoe "Use k"<CR>
nnoremap <Down> :echoe "Use j"<CR>" 插入模式禁用方向鍵
inoremap <Left> <ESC>:echoe "Use h"<CR>
inoremap <Right> <ESC>:echoe "Use l"<CR>
inoremap <Up> <ESC>:echoe "Use k"<CR>
inoremap <Down> <ESC>:echoe "Use j"<CR>
2. 縮進
我們在 VS Code 等編輯器中都是 Tab
和 Shift+Tab
來進行縮進和反縮進,在 Vim 中,縮進和反縮進稍顯復雜,我們可以用下面的映射來使得它和我們在其他編輯器中一樣。
" 常規模式
nmap <tab> V>
nmap <s-tab> V<" 可視模式
vmap <tab> >gv
vmap <s-tab> <gv
3. 移動窗口
在 Vim 分屏中,我們使用 sp
和 vsp
來同時打開多個窗口,并通過 Ctrl+w+hjkl
來在各個窗口之間進行切換,但這也很麻煩,筆者實在是沒想通加那個 w 干嘛,換掉!
map <C-h> <C-w>h
map <C-j> <C-w>j
map <C-k> <C-w>k
map <C-l> <C-w>l
4. 移動到行首行位
在 Vim 常規模式下,移動到行首行位分別是 0
、^
和 $
,但是筆者也感覺直接格鍵巨難按,剛好 H
和 L
在平時不怎么用到,還是處在鍵盤的黃金位置,所以可以用來替換:
noremap H ^
noremap L $
5. 功能按鍵
在鍵盤的黃金區域,Vim 留給我們可以自己設置的鍵位并不多,但是功能鍵( F2
等)還是有很多可以用的,要注意的是,功能鍵離我們的手也很遠,所以最好不要設置一些頻繁用到的操作,而是應該讓 “鍵如其名”,設置一些 “功能鍵” 在功能鍵上。比如開關行數顯示,有時很有用,但是有時又看著很煩或者在復制文本時很礙事,以此為例,我們將開關行數設置在 F2
上:
nnoremap <F2> :set nu! nu?<CR>
其他的功能鍵大家可以結合自己日常輸入中常用的功能來進行設置。推薦在功能鍵設置一些 set
的功能命令。可參考 vimrc配置文件。
筆者在這里拋磚引玉,就介紹怎么多,其他的高效映射,大家自己在日常工作中再去探索吧。
Ref:
http://www.pythonclub.org/linux/vim/map
https://www.jianshu.com/p/8ae25a680ed7