光棍節啦, 淘東西的閑暇上來發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有其他功能會在以后的文章中介紹.
