vim 跳轉與回跳

開篇先說明日誌佈局, vim學習記錄連載中全部博客名以vim之開頭, 後面是當前博客主題, 博客的時間佈局以我當前vimrc中的配置佈局順序爲主.每篇博客筆記中羅列和主題相關的配置清單並說明設計思路以及注意事項.

  下面是本人當前vimrc和.vim文件夾備份路徑:
    網址     http://115.com/lb/5lbbmpxie05#
    文件名: my_vim_2013_1111_7.0.tar.gz
    115網盤禮包碼:5lbbmpxie05

  本章主題vim的光標快速定位, 在編碼上的高效性首先就得益於vim對光標超強的控制能裏,使用vim的人都知道vim的標準操做自己就能夠實現各類各樣的文件定位需求. 這裏介紹本身總結的兩套定位方案, 能夠任選其一做爲本身的定位模式, 也能夠兩者共用並選擇一個做爲主要的定位方式.

一. vim標準操做帶來的定位模式
主要技巧:
   ->普通模式負責全部光標定位能力.插入模式隨時使用<esc>鍵回到普通模式而且儘可能保持普通模式爲主要的工做狀態.
   -> hjkl四鍵負責光標的低速移動,若是還在使用方向鍵控制光標, 請儘可能改正到使用hjkl,不然vimer們會鄙視你的.
   -> gg 實現跳轉到文件首行, G實現跳轉到文件末行
   -> o實現向下新開行, O實現向上新開行
   -> 0和_實現跳轉到行首, $實現跳轉到行尾
   -> A實現直接到行尾插入, I實現直接在行首插入
   -> 數字+gg實現多行之間的快速定位
   -> f+字母實現單行內的快速前向定位,t+字母實現單行內的向快速反向定位.
   -> w實現按單詞前向定位, b實現按單詞反向定位
   -> ctrl+f,ctrl+y,ctrl+d,ctrl+b實現按頁和半頁跳轉

   以上是注意的定位體系,具體快捷鍵功能,請參考vim和help文檔或自行百度學習,記憶和使用
   其餘的特殊技巧不怎麼經常使用,這裏沒有一一列出,必要時請自行總結記憶和使用.

二. 我的定製的vim定位模式
   需求: vim光標定位的標準操做在很大程度上是爲編程設計的, 做者是一個歷來不中文的程序員,這樣樣的基礎致使了vim的標準操做對中文不友好, 若是你用vim來編輯中文, 你將發現頻繁的模式切換的同時還要照顧輸入法的切換是一件多麼痛苦的事情.
   思路: 爲了讓vim更加有效的支持中文編輯,同時找到一種更加簡潔高效的光標定位方式,咱們須要讓光標的定位和普通的輸入分開,爲了區分普通輸入和光標定位咱們須要引入功能輔助鍵, 這裏我使用的是ctrl鍵. 這種是思想其實就emacs的快捷鍵模式, 你能夠說這種設計實際上是抄襲了emacs的模式, 也能夠說我不是一個真正的vimer. 不過不要緊,我關注的定位是否真的變得更加高效和便捷, 至於vim和emacs之間的文化分歧本人並非太多關注.
   實現方法:在vimrc中添加映射配置,經過map映射將vim的標準定位修改爲另外一套徹底不一樣的模式.下面是個人vimrc的相關配置:

imap  `        <esc><left><right>
vmap  `        <esc><left><right>
nmap  j        gj
nmap  k        gk
imap  kj       <left>
imap  jk       <right>
imap  jj       <down>
imap  kk       <up>
imap <c-g><c-g> <esc>Gi<c-u>

imap <c-j>     <esc>gja
imap <c-k>       <esc>gka
imap <c-h>     <left>
imap <c-l>     <right>
nmap <c-j>       gji
nmap <c-k>       gki
nmap <c-h>       <left>i
nmap <c-l>     <right>i
vmap <c-j>       gj
vmap <c-k>     gk
vmap <c-h>       <left>
vmap <c-l>       <right>

imap <c-r>       <left><left><left><left><left><left>
imap <c-f>       <right><right><right><right><right><right>
imap <c-e>       <up><up><up><up><up><up>
imap <c-d>       <down><down><down><down><down><down>

nmap <c-b>       <pageup>i
imap <c-b>       <pageup>i
imap <c-y>     <pagedown>i
nmap <c-y>       <pagedown>i

vmap <c-i>     <esc><left><right>a
imap <c-o>        <esc><left><right>
vmap <c-o>     <esc><left><right>
imap <c-u>       <esc>A
imap <c-w>       <esc><left><right>==i

nmap <pageup>     <pageup>M
imap <pageup>     <pageup><esc><left><right>M
nmap <pagedown>   <pagedown>M
imap <pagedown>   <pagedown><esc><left><right>M

imap o    <esc><left><right>o
imap <a-o>    <esc><left><right>o
nmap o    o
nmap <a-o>  o

配置註解:
->光標的全部定位實現直接集成到插入模式.
->ctrl+h,j,k,l 負責光標的低速定位, ctrl+r,f,e,d 實現光標的速度定位(上下左右6連跳)
->左ctrl鍵在大多鍵盤的左下角, 咱們能夠直接直接經過手掌的右下側來控制ctrl鍵(第六個手指^_^),h,j,k,l和r,f,e,d  分佈在左右手上而且都是最容易按下的鍵位.咱們能夠在同一時間隨意的控制光標的高速度和低速移動.這種操做方式的一些前提要求是:你須要改變原來的操做模式, 而且買一個ctrl比較大比較好控制的鍵盤(因此,若是你直接使用的是筆記本的鍵盤, 那麼我仍是建仍是直接使用標準方式,他絕對是你最好的選擇),最後你的手最好是和我同樣比較大的那種^_^

->選擇r,f,e,d  鍵是由於vim中有很多ctrl的組合鍵在插入模式下有默認的功能而且不能被從新映射, 幸運的是r,f,e,d四個鍵均可以從新映射,而且沒有重要ctrl組合鍵功能.
->因爲輸入法通常不會捕獲ctrl+和alt的組合鍵,全部ctrl和alt的組合功能能夠在中文輸入的狀況下順利的被vim處理.同時因爲使用的map映射,即使在中文輸入法下面組合鍵發送的映射功能依然是英文, 所以這樣能夠很幸運的繞過輸入法的切換,而且理論上支持全部語言.
->ctrl+r,f,e,d 的映射都使用了發送6個方向鍵的方式,這樣看似笨拙實際上是通過了優化.理由以下:
如過使用<esc>6ja(我最初的映射方式)這樣的映射方式首先是移動的時候會看到左下角的狀態標識不停的閃爍(由於他須要切換模式),其實次是<esc>在vim下面和alt鍵被設計成了相同的鍵位,<esc>6 等價於alt+6(<a-6>) 由於這樣映射會出現和alt+6組合鍵的衝突.6個方向鍵在vim的後臺處理的很快,使用時看到的效果是流暢的跳轉體驗.

->ctrl+j,k 兩個低速上下移動鍵被映射成<esc>gja和<esc>gka , 理由以下:
vim正常使用時開啓長行的自動迴轉顯示是很方便的,這會帶來一個問題,文件的單行在vim會被顯示成多行,j,k跳轉是按行跳轉的, 即使屏幕中多行顯示的是很長的單行,j,k依然會一次性跳過去
這樣的行跳轉很不直觀也不方便, 爲了實現按照屏幕顯示行的形式跳轉須要使用gj和gk.ctrl+j,k映射成gj和gk能夠實現更加直觀方便的定位方式.
但是,這樣會帶來一個問題, 當gj和gk遇到摺疊了的代碼行時會自動將其展開. 這裏的ctrl+j,k 也是如此, 不過我並沒修改他, 由於咱們能夠經過一個很巧妙的方式來解決這個小小的不便:
因爲ctrl+e,d是使用<left>,<right>鍵映射的, 所以他們不會出現自動展開摺疊的問題. 當咱們偶爾真遇到了須要跳到摺疊的對面去時候使用ctrl+r,f就能夠了, 這看起來很像這樣一種情形,摺疊行就像是一個鴻溝, 當咱們遇到鴻溝普通按步前進的方式是過不去的, 因而咱們很天然的向後倒退了幾步,而後一個超級大跳就跳過去啦...^_^!

->ctrl+h,j,k,l實現了在插入模式(imap),普通模式(nmap),可視模式(vmap)下的全部映射, 也就是說幾乎在全部的狀況下他們都是能夠自動進入插入模式並實現單步移動.但是ctrl+r,f,e,d四個高速跳轉只作了插入模式下的映射, 緣由在於普通模式下這四個組合鍵有各自標準的功能
爲了不衝突就只在插入模式下作了映射. 但是這樣高速跳轉只能在插入模式下使用會不會不方便的同時又容易誤操做呢(好比直接在普通模式下使用就是一種悟操做),不要緊,咱們又能夠經過一個很巧妙的方式避開這個不便和誤操做:
養成在移動的時候第一次按下的必定是低速移動的ctrl+h,j,k,l中的一個.
這樣任什麼時候候移動都會自進入插入模式, 即不會感到不便, 也不會出現誤操做.

->vim中爲了充分利用alt鍵帶來的一大堆便捷的組合鍵, 咱們須要注意以下幾個問題:
1.爲了不<esc>鍵和alt鍵的衝突全部映射中用到<esc>鍵的地方採用<esc><left><right>來取代
2.因爲一旦引入一個alt功能鍵的映射, 就會帶來一個問題, <esc>返回到普通模式下速度明顯變慢,這是因爲<alt>鍵和<esc>在vim實際上是同一個鍵而咱們又對<alt>作了組合鍵的映射, 這樣一來當咱們按下<esc>鍵的時候vim沒法肯定使用者是想只按下<esc>鍵仍是後面想再按下一個功能組合鍵, 爲解決這個問題vim引入了輸入等待模式, 當輸入一個具備組合功能的部分按鍵的時候vim將等待半秒左右的時間來等待用戶輸入下一可能的鍵位,若是半秒以後用戶沒有按下任何鍵,那麼vim將確認用戶但願按下的是單一的當前鍵位.這就是爲何引入alt組合鍵以後<esc>反應變得遲鈍的緣由.
<esc>鍵變得的遲鈍不管是對須要常用普通模式功能的標準用戶仍是像我這種偶爾須要原始操做才能解決問題的vim重度定製化的人來講都是一個致命的問題.簡單想法是對<esc>鍵重映射到<esc><left><right>,不幸的是這樣作沒有效果, 沒有辦法解決了嗎? vim最動人最銷魂最讓人興奮不已的地方就經過對在標準的元操做不斷的組合,咱們老是能夠找到一寫解決問題的辦法, 這種辦法又在不少時候是那麼的幸運!
咱們知道如今的鍵盤大多數<esc>鍵都在左上角,這個位置仍是比較遠的,vim的做者之所選擇<esc>鍵做爲模式切換鍵是由於在他設計vim的時候使用的鍵盤的<esc>鍵就在Q鍵的旁邊!咱們如今用的鍵盤在不幸將esc鍵扯遠的的同時還在esc鍵的下方引入了一個咱們幾乎不會用到的 "`" 鍵.既然用不到位置又比<esc>便捷,將其取代<esc>何樂不爲呢.因而下面兩句映射應運而生:
imap  `        <esc><left><right>
vmap  `        <esc><left><right>
因爲在插入模式下"`"鍵被映射掉了,這會致使vim中永遠都沒法輸入"`"這個符號了, 一個簡單的解決辦法是,須要輸入的時候在其餘地方寫下 "`"再複製到vim中來.好在這個鍵幾乎用不到, 真的是幾乎用不到, 要不是如今寫這篇文章的須要, 我想我在幾個月內不會再複製粘貼這符號一次了吧

->jj,jk,kj,kk這四個鍵的映射是爲了在寫代碼的時候提高流暢度而設定的,若是你須要編程,能夠試試這個四個映射, 在括號的跳轉的時候但是至關方便的哦, 固然我是一個苦逼的程序員, 爲了最大限度的用vim來編程, 我會最大限度的將vim設計的適合編程. 這在之後的介紹中將會明顯感受到這一點.行雲流水的編碼感受是vim帶給咱們最大的禮物.

->ctrl+u 實現跳轉到行尾並插入, ctrl+w實現跳轉到行首並插入, 注意:
.這裏兩個功能也是隻能在插入模式下才有效.
.ctrl+w的映射比較特殊,普通模式下"=="實現當前行的排版功能, 而且會自動跳轉到行首, 所以這裏利用了這個特性將跳轉到行首和當前行排版的功能都集成在了ctrl+w鍵位上,這兩個功能在時間上大可能是沒有衝突的, 實踐表示兩個功能用同一個功能鍵仍是想當方便的
.ctrl+u和ctrl+w在鍵盤佈局上比較容易記憶.

->alt+o實如今任什麼時候候向下開新行並進入插入模式

-> alt+i實現可視模式向插入模式的直接切換

->ctrl+o功能和<esc>相同,有時候會比"`" 方便一些.注意:普通模式下ctrl+o會跳轉到上一次編輯的位置, ctrl+i則是向前跳轉編輯位置, 這兩個功能仍是比較有用的,由於這裏並無在普通模式下對carl+i和ctrl+o進行映射設置.

->ctrl+y插入模式下向下翻頁, ctrl+b 插入模式下向下翻頁,這裏的翻頁功能在鍵盤佈局上和功能反過來了, 主要緣由是下翻比上翻要經常使用而ctrl+y又比ctrl+b更加容易按下

->翻頁鍵實如今翻頁時自動定位到屏幕中間行位置.這樣不管是向下定位仍是向上定位都會比較方便.

->按兩次carl+g鍵直接跳轉到文件末尾追加.因爲在文件末尾追加的功能不叫經常使用, 就作這個映射.ctrl+g有其餘功能會在之後的文章中介紹.
php

相關文章
相關標籤/搜索