歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

更好的使用 Vim 標簽(Tab)以及 Alt鍵映射

更好的使用 Vim7.0以後推出的標簽(TAB)功能,同現代編輯器一樣用標簽(TAB)來管理多文件,代替傳統 Buffer List:

讓Minibufexplor/tabbar這些上個世紀的插件都退場吧,直接使用標准的標簽功能會更加舒服。

快捷鍵切換 TAB

第一件事情就是要搞定標簽快速切換問題,不管是:tabn X還是 Xgt都十分低效,我們需要更快速的在各個文件之間切換。最簡單的是設置 0-9 來快速切換tab(默認leader是反斜槓,即先按下\鍵,再按數字鍵),不管終端還是GVIM都兼容:

noremap <silent><tab>m :tabnew<cr>
noremap <silent><tab>e :tabclose<cr>
noremap <silent><tab>n :tabn<cr>
noremap <silent><tab>p :tabp<cr>
noremap <silent><leader>t :tabnew<cr>
noremap <silent><leader>g :tabclose<cr>
noremap <silent><leader>1 :tabn 1<cr>
noremap <silent><leader>2 :tabn 2<cr>
noremap <silent><leader>3 :tabn 3<cr>
noremap <silent><leader>4 :tabn 4<cr>
noremap <silent><leader>5 :tabn 5<cr>
noremap <silent><leader>6 :tabn 6<cr>
noremap <silent><leader>7 :tabn 7<cr>
noremap <silent><leader>8 :tabn 8<cr>
noremap <silent><leader>9 :tabn 9<cr>
noremap <silent><leader>0 :tabn 10<cr>
noremap <silent><s-tab> :tabnext<CR>
inoremap <silent><s-tab> <ESC>:tabnext<CR>

其次,GVIM/MacVim 下設置 ALT-0-9 來切換TAB:

" keymap to switch table in gui
if has('gui_running') 
    set winaltkeys=no
    set macmeta
    noremap <silent><c-tab> :tabprev<CR>
    inoremap <silent><c-tab> <ESC>:tabprev<CR>
    noremap <silent><m-1> :tabn 1<cr>
    noremap <silent><m-2> :tabn 2<cr>
    noremap <silent><m-3> :tabn 3<cr>
    noremap <silent><m-4> :tabn 4<cr>
    noremap <silent><m-5> :tabn 5<cr>
    noremap <silent><m-6> :tabn 6<cr>
    noremap <silent><m-7> :tabn 7<cr>
    noremap <silent><m-8> :tabn 8<cr>
    noremap <silent><m-9> :tabn 9<cr>
    noremap <silent><m-0> :tabn 10<cr>
    inoremap <silent><m-1> <ESC>:tabn 1<cr>
    inoremap <silent><m-2> <ESC>:tabn 2<cr>
    inoremap <silent><m-3> <ESC>:tabn 3<cr>
    inoremap <silent><m-4> <ESC>:tabn 4<cr>
    inoremap <silent><m-5> <ESC>:tabn 5<cr>
    inoremap <silent><m-6> <ESC>:tabn 6<cr>
    inoremap <silent><m-7> <ESC>:tabn 7<cr>
    inoremap <silent><m-8> <ESC>:tabn 8<cr>
    inoremap <silent><m-9> <ESC>:tabn 9<cr>
    inoremap <silent><m-0> <ESC>:tabn 10<cr>
endif

或者在 MacVim 下還可以用 CMD_0-9 快速切換,按著更舒服:

if has("gui_macvim")
    set macmeta
    noremap <silent><c-tab> :tabprev<CR>
    inoremap <silent><c-tab> <ESC>:tabprev<CR>
    noremap <silent><d-1> :tabn 1<cr>
    noremap <silent><d-2> :tabn 2<cr>
    noremap <silent><d-3> :tabn 3<cr>
    noremap <silent><d-4> :tabn 4<cr>
    noremap <silent><d-5> :tabn 5<cr>
    noremap <silent><d-6> :tabn 6<cr>
    noremap <silent><d-7> :tabn 7<cr>
    noremap <silent><d-8> :tabn 8<cr>
    noremap <silent><d-9> :tabn 9<cr>
    noremap <silent><d-0> :tabn 10<cr>
    inoremap <silent><d-1> <ESC>:tabn 1<cr>
    inoremap <silent><d-2> <ESC>:tabn 2<cr>
    inoremap <silent><d-3> <ESC>:tabn 3<cr>
    inoremap <silent><d-4> <ESC>:tabn 4<cr>
    inoremap <silent><d-5> <ESC>:tabn 5<cr>
    inoremap <silent><d-6> <ESC>:tabn 6<cr>
    inoremap <silent><d-7> <ESC>:tabn 7<cr>
    inoremap <silent><d-8> <ESC>:tabn 8<cr>
    inoremap <silent><d-9> <ESC>:tabn 9<cr>
    inoremap <silent><d-0> <ESC>:tabn 10<cr>
    noremap <silent><d-o> :browse tabnew<cr>
    inoremap <silent><d-o> <ESC>:browse tabnew<cr>
endif

這下很舒服了,和大部分主流編輯器一樣切換tab十分輕松。那終端下 alt沒法很好的映射怎麼辦呢?

終端下映射 ALT-0-9 快速切換標簽

不推薦把中斷裡的ALT鍵設置成+,大部分終端(XShell, SecureCRT, iTerm, gnome-terminal)都提供ALT鍵改為+的模式,即按下ALT-A,終端會連續發送ESC(27)和 A(65)兩個字節,這樣在emacs下挺好用,但是在vim下就糟糕了,比如你映射了<ESC>A來代替 ALT-A,那麼當你用ESC退出insert模式時,一秒鐘內馬上按下A來在行末追加內容,Vim會去觸發你之前設置的ALT-A的功能,這就對 Vim 原有的功能造成了擾亂,那終端下如何正確設置 ALT功能鍵呢?

我們使用終端自定義按鍵序列,大部分終端都支持自定義按鍵發送特定字符串(XShell,SecureCRT,iTerm,gnome-terminal),比如我們可以把ALT-1設置成發送 <ESC>[{0}1~ 這個字符串,而 ALT-2設置成發送 <ESC>[{0}2~ 這個字符串,於是我們可以在Vim裡面建立快捷映射:

" set terminal and map alt+n or alt+shift+n to "<ESC>[{0}n~"
if !has('gui_running')
    noremap <silent><ESC>[{0}1~ :tabn 1<cr>
    noremap <silent><ESC>[{0}2~ :tabn 2<cr>
    noremap <silent><ESC>[{0}3~ :tabn 3<cr>
    noremap <silent><ESC>[{0}4~ :tabn 4<cr>
    noremap <silent><ESC>[{0}5~ :tabn 5<cr>
    noremap <silent><ESC>[{0}6~ :tabn 6<cr>
    noremap <silent><ESC>[{0}7~ :tabn 7<cr>
    noremap <silent><ESC>[{0}8~ :tabn 8<cr>
    noremap <silent><ESC>[{0}9~ :tabn 9<cr>
    noremap <silent><ESC>[{0}0~ :tabn 10<cr>
    inoremap <silent><ESC>[{0}1~ <ESC>:tabn 1<cr>
    inoremap <silent><ESC>[{0}2~ <ESC>:tabn 2<cr>
    inoremap <silent><ESC>[{0}3~ <ESC>:tabn 3<cr>
    inoremap <silent><ESC>[{0}4~ <ESC>:tabn 4<cr>
    inoremap <silent><ESC>[{0}5~ <ESC>:tabn 5<cr>
    inoremap <silent><ESC>[{0}6~ <ESC>:tabn 6<cr>
    inoremap <silent><ESC>[{0}7~ <ESC>:tabn 7<cr>
    inoremap <silent><ESC>[{0}8~ <ESC>:tabn 8<cr>
    inoremap <silent><ESC>[{0}9~ <ESC>:tabn 9<cr>
    inoremap <silent><ESC>[{0}0~ <ESC>:tabn 10<cr>
endif

如此由於終端上映射了 ALT-0-9 為 <ESC>[{0}N~ 所以在 XShell/SecureCRT/iTerm下按 ALT-0-9 可以發送對應的字符串給 Vim並被上面的配置代碼識別。

有人問XShell/SecureCRT下面ALT-0-9是用來快速切換終端標簽的,怎麼辦呢?好辦,在終端下把 ALT-SHIFT-0-9映射成剛才的字符串即可啊,這樣保證不影響終端快捷鍵的同時,方便的使用<M-S-0/9>來切換標簽和很方便,或者用先前的0-9來代替。

避免按鍵沖突

有人說這會不會和退出insert後馬上按[又發生沖突?其實不用當心,後很少有機會按[,即使你按了[也很少有機會繼續迅速按下{,0,}三個按鍵,而終端下F5即被映射為字符串:<ESC>[15~ 所以你放心大膽的用<ESC>[{開頭吧,即使你正常使用下按了馬上按[,你會發現VIM等待了1秒鐘,發現期間沒有後續的{0}1~,就馬上判斷不是該映射,所以正常執行[功能。

這和 Vim中按下 的情況一樣,xterm終端下被映射為字符串<ESC>OP,你在XShell/iTerm/SecureCRT下面敲下 實際會發送:0x1b (ESC), 0x4f(O), 0x50(P) 三字字節到服務端,所以你在Vim下一秒鐘內快速敲入 OP三個鍵和鍵的功能相同–打開幫助。那麼你可能會問,如果我想按離開INSERT模式後馬上按O在光標上面插入一行,在VIM裡到底是被判斷成我想要的模式?還是F1的前綴呢?其實是靠超時(help timeout),你馬上離開插入模式後按了O,VIM會等待一秒鐘知道確認沒有後續追加按鍵了,才判斷為離開插入模式向上插入一行兩個獨立的動作,否則在timeout(默認1秒)內你又按了下P,那VIM就真的以為你按下了了。

如果你想避免退出插入模式馬上按O,P被識別成,那麼你可以先按O,然後等一秒過了真的插入一行了,再按下P,問題不大。或者用ko來代替,又或者直接使用GVIM/MacVim就沒這個歧義了。

所以在終端下通過配置鍵盤映射,當按下ALT-X時,發送<ESC>[{0}X~字符串,可以比直接把ALT鍵設置成+能更好的減少按鍵歧義,正常使用很少後緊跟[的。

Copyright © Linux教程網 All Rights Reserved