原文:練上一年再來總結的vim使用技巧html
轉眼上vim
的「賊船」
有一年多了。從PHP
到C
,都在用。想要真正用vim
於平常的編碼工做,必然須要一些插件的支持。不過本文並不打算總結插件,筆者認爲vim的兩個精髓:組合
和重複
跟插件也沒有什麼關係。linux
在大多數編輯器中,相信你們都喜歡敲幾個單詞就「保存(ctrl+s)」一下。而在vim中,保存是:w
,並且須要在命令模式下進行。所以,每每要按Esc:w
多達三個鍵才能保存。不少初學者十分詬病這個設計。事實上,常用Esc
切換到命令模式纔是vimer須要練就的第一個重要的反射行爲。能夠絕不誇張的說,只要你不在輸入文字,就應該切換在命令模式下,命令模式應該是常態!程序員
這是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
最後應用I
和A
,添加開始和最後的雙引號就能夠了。spa
經過這個例子,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組合的思想,不少命令能夠經過組合獲得不一樣的效果。
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的過程就是自我否認和自動重塑的過程,若是你不斷的學習技巧的話,編輯習慣會一再被推翻,一再重塑。不斷有新的理解注入到平常的工做中。最終會造成本身編輯風格。