當前位置:
首頁 > 知識 > 練了一年再來總結的 vim 使用技巧

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


作者:P_Chou 


來自:http://www.pchou.info/index.html




轉眼上

vim

賊船

有一年多了。從

PHP

C

,都在用。想要真正用

vim

於日常的編碼工作,必然需要一些插件的支持。不過本文並不打算總結插件,筆者認為 vim 的兩個精髓:

組合

重複

跟插件也沒有什麼關係。





命令模式應該是常態



在大多數編輯器中,相信大家都喜歡敲幾個單詞就 「保存(ctrl+s)」 一下。而在 vim 中,保存是

:

w

,而且需要在命令模式下進行。因此,往往要按

Esc:w

多達三個鍵才能保存。很多初學者十分詬病這個設計。事實上,經常使用

Esc

切換到命令模式才是 vimer 需要練就的第一個重要的反射行為。可以毫不誇張的說,只要你不在輸入文字,就應該切換在命令模式下,命令模式應該是常態!




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




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




讓你的操作可重複




我們來舉個例子,假設如下文本



one

two three four five six




我希望改成



"one"

,

"two"

,

"four"

,

"five"

,

"six"




首先游標定位在該行的行首,可使用

^

。然後鍵入

f?

(?表示空格),此時游標定位在 one 和 two 之間的空格處,然後鍵入

c?","

(修改空格,進入插入模式,然後增加

","

):



one

","

two three four five six




接著按

;.

,游標將先查找下一個空格,即重複

f?

,這個空格位於 two 和 three 之間,然後

.

可以重複上一次的修改操作,即

c?","



one

","

two

","

three four five six




接著重複按若干次

;.

即可完成所有中間字元的修改:

one

","

two

","

three

","

fo

ur","

five

","

six




最後應用

I

A

,添加開始和最後的雙引號就可以了。




通過這個例子,vimer 必須要領會的一個精髓是:

讓你的操作可重複!!

。如果上面的例子,我們用

l

或者

->

來定位空格的話,由於 one、two、three 這些單詞的長度是不確定的,我們無法事先知道需要按多少次

l

,所以

l

定位是不可重複的。而通過

f

可以重複我們的查找操作,從而精確的定位到空格。另外,如果我們通過

xi","

代替

c?","

也是不可重複的,因為

xi","

表示先刪除空格,然後進入插入模式後鍵入

","

,這樣就是兩次分開的修改操作,而最近的操作變成了 「進入插入模式後鍵入

","

」,如果通過

.

重複這個操作,是無法刪除空格的。




這需要大量的實踐和練習,才能改掉滑鼠流的思維定式。一般來說,盡量多用

f

c

r

是不錯的選擇。另外,儘可能的利用

A

a

o

O

來進入插入模式,而不是每次通過

i

進入插入模式。




高效移動




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




set relativenumber(顯示相對行號)

。我無意間發現的一個十分實用的技巧,比

set number

顯示行號更好用。通過這個設置,行號的顯示會根據當前的游標的相對位置顯示成偏移數,並動態變化。這個好處是,可以利用

數字

+j

 

數字

+k

來進行多行跳轉,因為是編譯行數,所以數字不會太大。否則就算要向下移動 10 行,我們可能也需要用

138gg









  • w、e、b

    :按照單詞進行前後游標跳轉,也可以組合數字進行跳轉,不過以我的經驗,與其去算要跳多少個單詞,不如多按幾次吧。



  • I

    A

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



  • H

    M

    L

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



  • Ctrl+D

    Ctrl+U

    :有時,需要看的文本不在可視區域,通過這些組合進行上下翻頁。



  • ^、

    $

    0

    :游標移動到行首和行尾(0 是絕對行首)。不過因為

    ^

    $

    都需要同時按住 shift,而且數字鍵我們往往難以盲打,所以我一般直接使用

    I+Esc

    A+Esc



  • %

    :移動到與當前括弧匹配的括弧處。



  • gj

    gk

    :有時可視區域不夠寬,而一行的字元有很多,導致了 wrap。那麼通過 jk 是無法直觀的定位到同一物理行,卻不在同一個可視行里的位置,此時需要

    gj

    gk



  • f

    F

    :通過上面的例子,我們知道,

    f

    是 find 的意思,可以在一行內查找某個字元出現的位置,並直接跳轉過去。比如

    f<

    可以從當前游標開始向右,找到第一個

    <

    ,並移動過去。F 是向左查找。



  • ;

    :重複上一次的

    f

    查找操作



  • .

    :重複上一次的修改操作,跟

    ;

    可以說是好基友,經常用來實現一些簡單的重複操作,比錄製宏要簡單很多。經常有意識的使用這種簡單重複,是 vimer 編輯思路進階的分水嶺。



高效修改




vim 的另一個優勢是高效修改。在 vim 下修改就要改掉傳統滑鼠流的思維方式,切忌提到修改就按

i

。有很多高效的修改辦法,而且這些辦法往往是可重複的。下面舉一些我常用的例子:




  • r

    :替換模式,替換當前游標所在位置的一個字元。雖然你同樣可以

    i

    進入插入模式,然後刪掉那個字元,再輸入需要的字元,但這種操作是滑鼠流思維方式。替換是一個可重複操作,多用沒壞處。



  • cw

    change word

    可以刪除從當前位置到一個單詞的結尾,並進入插入模式。這種操作常用於修改一個變數。比如對於:

    int count=0

    ;

    希望把

    count

    改成

    cnt

    ,那麼當游標位於

    c

    字元處的時候,按

    cw

    可直接刪除

    count

    ,並進入插入模式。然後直接繼續輸入

    cnt

    即可。



  • caw

    change 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 "

     複製整個字元串,包括雙引號。



  • yw、yaw、daw、d$…

    :好了,這些可以」 發明」 出來了。



  • o、O

    :向下向上增加空行



  • u、Ctrl+r

    :undo 和 redo




上面的例子體現了 vim 組合的思想,很多命令可以通過組合得到不同的效果。




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




v、V、Ctrl+v

是 Visual 模式,類似用滑鼠選中一些文本。我在早期使用 vim 時候,十分喜歡用

v

,比如要刪除一個單詞,我往往會用

vwd

,試圖用

vw

選中一個單詞,然後

d

刪除。這種方式明顯是滑鼠流的後遺症。直到我學會上面介紹的一些技巧後,

v

已經很少用了。不過

Ctrl+v

Block Visual

模式,類似選中列,這個技巧有時很有用。比如有如下文本:



one
two
three
four




希望變成



"one, two, three, four"




首先將游標定位到 one 的 o 處,

Ctrl+v,3j,$,A,,,Esc,V,3j,J

。這一套連招下來,出來了:



one, two, three, four,




如果要合的行數很多,就比較有優勢了。問我怎麼知道按

3j

,上文提到的

set relativenumber

幫到你。




總結




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





●編號

503

,輸入編號直達本文



●輸入m獲取文章

目錄

推薦↓↓↓



黑客技術與網路安全


更多推薦

18個技術類公眾微信


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux學習 的精彩文章:

大波新特性到來,升級到 Ubuntu 18.04 LTS 的 8 大理由
Linux DNS 伺服器安裝、配置和維護,一文看全~

TAG:Linux學習 |