練上一年再來總結的vim使用技巧

原文:練上一年再來總結的vim使用技巧html

轉眼上vim「賊船」有一年多了。從PHPC,都在用。想要真正用vim於平常的編碼工做,必然須要一些插件的支持。不過本文並不打算總結插件,筆者認爲vim的兩個精髓:組合重複跟插件也沒有什麼關係。linux

命令模式應該是常態

在大多數編輯器中,相信你們都喜歡敲幾個單詞就「保存(ctrl+s)」一下。而在vim中,保存是:w,並且須要在命令模式下進行。所以,每每要按Esc:w多達三個鍵才能保存。不少初學者十分詬病這個設計。事實上,常用Esc切換到命令模式纔是vimer須要練就的第一個重要的反射行爲。能夠絕不誇張的說,只要你不在輸入文字,就應該切換在命令模式下,命令模式應該是常態!程序員

HJKL讓右手歇歇,畢竟右手「很累」

這是vim中的光標上下左右的移動,剛開始使用vim的同窗可能以爲這並無什麼卵用,我用鍵盤上的上下左右就能夠了!咱們知道,vim的大部分快捷鍵須要在命令模式下完成,並且HJKL也是須要在命令模式下才生效的,若是你常常在插入模式下工做,固然不會去用HJKL。然而,當你真正開始更多的使用命令模式的時候,你會懶到不想把右手挪到「上下左右」那兒去,這個時候HJKL成爲無需思考的反射行爲。HJKL的好處就是減小了右手的位移距離。畢竟右手還有不少「事情」要作。編程

讓你的操做可重複

咱們來舉個例子,假設以下文本vim

one two three four five six

我但願改爲編輯器

"one","two","four","five","six"

首先光標定位在該行的行首,可以使用^。而後鍵入f␣(␣表示空格),此時光標定位在one和two之間的空格處,而後鍵入c␣","(修改空格,進入插入模式,而後增長","):ide

one","two three four five six

接着按;.,光標將先查找下一個空格,即重複f␣,這個空格位於two和three之間,而後.能夠重複上一次的修改操做,即c␣","學習

one","two","three four five six

接着重複按若干次;.便可完成全部中間字符的修改:編碼

one","two","three","four","five","six

最後應用IA,添加開始和最後的雙引號就能夠了。spa

經過這個例子,vimer必需要領會的一個精髓是:讓你的操做可重複!!。若是上面的例子,咱們用l或者->來定位空格的話,因爲one、two、three這些單詞的長度是不肯定的,咱們沒法事先知道須要按多少次l,因此l定位是不可重複的。而經過f能夠重複咱們的查找操做,從而精確的定位到空格。另外,若是咱們經過xi","代替c␣","也是不可重複的,由於xi","表示先刪除空格,而後進入插入模式後鍵入",",這樣就是兩次分開的修改操做,而最近的操做變成了「進入插入模式後鍵入","」,若是經過.重複這個操做,是沒法刪除空格的。

這須要大量的實踐和練習,才能改掉鼠標流的思惟定式。通常來講,儘可能多用fcr是不錯的選擇。另外,儘量的利用AaoO來進入插入模式,而不是每次經過i進入插入模式。

高效移動

光標移動效率是vim程序員達到甚至超過鼠標流程序員的關鍵技能。vim中的移動光標的方式有不少,我來舉幾個我實際使用過程當中應用比較頻繁的技巧:

set relativenumber(顯示相對行號)。我無心間發現的一個十分實用的技巧,比set number顯示行號更好用。經過這個設置,行號的顯示會根據當前的光標的相對位置顯示成偏移數,並動態變化。這個好處是,能夠利用數字+j 數字+k來進行多行跳轉,由於是編譯行數,因此數字不會太大。不然就算要向下移動10行,咱們可能也須要用138gg

  • web:按照單詞進行先後光標跳轉,也能夠組合數字進行跳轉,不過以個人經驗,與其去算要跳多少個單詞,不如多按幾回吧。

  • IA:移動到行首或行末的第一個字符處,並進入插入模式。

  • HML:光標分別跳轉到可視區域的最上面、中間、最下面。

  • Ctrl+DCtrl+U:有時,須要看的文本不在可視區域,經過這些組合進行上下翻頁。

  • ^$0:光標移動到行首和行尾(0是絕對行首)。不過由於^$都須要同時按住shift,並且數字鍵咱們每每難以盲打,因此我通常直接使用I+EscA+Esc

  • %:移動到與當前括號匹配的括號處。

  • gjgk:有時可視區域不夠寬,而一行的字符有不少,致使了wrap。那麼經過jk是沒法直觀的定位到同一物理行,卻不在同一個可視行裏的位置,此時須要gjgk

  • fF:經過上面的例子,咱們知道,f是find的意思,能夠在一行內查找某個字符出現的位置,並直接跳轉過去。好比f<能夠從當前光標開始向右,找到第一個<,並移動過去。F是向左查找。

  • ;:重複上一次的f查找操做

  • .:重複上一次的修改操做,跟;能夠說是好基友,常常用來實現一些簡單的重複操做,比錄製宏要簡單不少。常常有意識的使用這種簡單重複,是vimer編輯思路進階的分水嶺。

高效修改

vim的另外一個優點是高效修改。在vim下修改就要改掉傳統鼠標流的思惟方式,切忌提到修改就按i。有不少高效的修改辦法,並且這些辦法每每是可重複的。下面舉一些我經常使用的例子:

  • r:替換模式,替換當前光標所在位置的一個字符。雖然你一樣能夠i進入插入模式,而後刪掉那個字符,再輸入須要的字符,但這種操做是鼠標流思惟方式。替換是一個可重複操做,多用沒壞處。

  • cwchange word能夠刪除從當前位置到一個單詞的結尾,並進入插入模式。這種操做經常使用於修改一個變量。好比對於:int count=0;但願把count改爲cnt,那麼當光標位於c字符處的時候,按cw可直接刪除count,並進入插入模式。而後直接繼續輸入cnt便可。

  • cawchange a word能夠刪除當前光標所在位置的單詞。對於int count=0;的例子,若是此時光標在count中間某處,好比u處,直接鍵入caw能夠達到一樣的效果。因此caw更強大一些。

  • c$c^:觸類旁通,能夠猜到c$是從當前位置刪除到行尾,並進入插入模式。

  • ci"change inside "能夠用於修改當前位置附近,在相同配對的"中的內容。好比對於const char *str="hello world";。當在雙引號中間的任意位置鍵入ci"能夠直接清空字符串,並繼續輸入新的但願的字符串。

  • ci(ci[:觸類旁通change inside ( change inside [

  • cit:這個比較特殊,能夠直接編輯匹配的xml標籤中的內容!常常編寫html的童鞋能夠熟悉一下。

  • yi"yank inside " 猜猜是啥意思?相似ci"只是把編輯操做編程複製操做,由於y是複製!是否是很強大。

  • ya"yank around " 複製整個字符串,包括雙引號。

  • ywyawdawd$...:好了,這些能夠"發明"出來了。

  • oO:向下向上增長空行

  • uCtrl+r:undo和redo

上面的例子體現了vim組合的思想,不少命令能夠經過組合獲得不一樣的效果。

Visual模式是鼠標流後遺症,不過也有妙用

vVCtrl+v是Visual模式,相似用鼠標選中一些文本。我在早期使用vim時候,十分喜歡用v,好比要刪除一個單詞,我每每會用vwd,試圖用vw選中一個單詞,而後d刪除。這種方式明顯是鼠標流的後遺症。直到我學會上面介紹的一些技巧後,v已經不多用了。不過Ctrl+vBlock Visual模式,相似選中列,這個技巧有時頗有用。好比有以下文本:

one
two
three
four

但願變成

"one, two, three, four"

首先將光標定位到one的o處,Ctrl+v3j$A,EscV3jJ。這一套連招下來,出來了:

one, two, three, four,

若是要合的行數不少,就比較有優點了。問我怎麼知道按3j,上文提到的set relativenumber幫到你。

總結

在開發效率上,不敢說vim優於IDE,不過vim的編輯和修改速度是比鼠標快的。使用vim的過程就是自我否認和自動重塑的過程,若是你不斷的學習技巧的話,編輯習慣會一再被推翻,一再重塑。不斷有新的理解注入到平常的工做中。最終會造成本身編輯風格。

相關文章
相關標籤/搜索