去年9月份寫了《Android拓展系列(4)--vim編輯器的基本使用》,記錄了最簡單的vim操作。但是vim魅力來自於他神出鬼沒的技巧操作。
這些技巧,或是巧妙組合利用vim特性,或是來自於特定場合的經驗總結,或是特殊小功能。
冰凍三尺,非一日之寒!
這些技巧都需要在實踐中不斷的練習或者使用,直到你感覺自己悄悄的上癮。
學會了這些技巧,不僅可以讓你如虎添翼,如有神助;而且絕對是你程序員身份的一種象征,它代表着專業,高端!
編輯器之神!
但是,也不要被這些嚇到,只要堅持,經過開始陡峭的學習曲線之后,你會看到光明!
下面我根據自己的經驗,挑選一些命令來特別說明(為了簡明清晰,盡量去掉那些特別簡單或者使用很少的命令)。
1. 移動指令
(1). h j k l, 方向鍵,記憶技巧:左右方向的是最左邊和最右邊的,j向下打了個勾,所以是向下鍵,剩下的k就是向上的鍵了。
(2). b, before,上一個單詞(詞首)
w, word,下一個單詞(詞首)
e, end,下一個單詞(詞尾)
注意這些小寫的命令由字母,點,數字,下划線划分,還有這三個對應的大寫字母的命令,B,W,E,類似的意思,但是是以空格區分移動的。總而言之,大寫的移動范圍要大。
(3). gg 首行
G 尾行,這兩個命令用的較多
(4). n% 跳到n%的那行
(5). ^/0 到行首,我有時特別喜歡0,非常清晰簡明的命令
$ 到行尾
(6). - 非空白行首向上移動
+ 非空白行首向下移動
(7). 行移動
nj //向下移動n行 nk //向上移動n行 nh //向左移動n列 nl //向有移動n列 n_ //向下移動n-1行,並光標移動到非空白行首 n- //向上移動n行,並光標移動到非空白行首
(8).通過查找字符移動
fx/Fx //向后/前查找字符x,行內跳轉很有用 tx/Tx //向后/前查找字符x //fx/Fx和tx/Tx的區別是用f光標停留在x上,用t光標停留在x的前面一個上 ; //執行上次的fFtT , //反方向執行fFtT,這兩個有意思
2. 插入,替換,刪除
(1). 學會a和i混用,不要只會用i進入插入模式,有時a進入插入模式后更方便,比如插入鍵盤右邊的字母符號,用a的話,左右手配合起來效率更高。
(2). 學會I和A,快速進入行首和行尾插入模式,特定時刻用起來超爽!
這個很好理解,小寫的i是光標前,大小的I是整行前面,o/O類似,畫面很清晰。
(3). 學會o和O混用,不要只會用o進入下行編輯:
(3.1). 進入上行編輯,大寫的O更快,而不是ko,雙手比單手要快!
(3.2). 第一行前面想插入一行時,O比其他任何操作更直接和快速(不要先回到開頭<+插入模式>+回車)
(4). r 快速替換字符,最大的好處是不許要切換模式,節省了大量時間,非常有用!(R,這個命令我用的少,有的時候用的特別混亂,就不說了)
s 刪除光標后一個字符並進入插入模式。該命令提供了r命令+進入插入模式的快速實現方法。
(5). c 這個命令很強大,歸類說明一下
cm //m指的是前面的移動命令,類似的有dm,ym,g?m,gum,gUm //改變內容(m定義了改變范圍)並進入插入模式,這里說的改變就是刪除,舉例說明: cw //刪除光標后一個單詞並進入插入模式 cl //刪除光標后一個字母並進入插入模式
(6). cc和S 修改當前行,意思是刪除該行所有字符內容,但保留行首空格
D和C 刪除該行光標后所有內容,無論字符還是空格,這個命令我用的很多:代碼審核格式化代碼時,刪除空行的空格和行尾空格。
(7). 學會結合t這個命令
t //till的意思,這是我最喜歡的命令之一 dt" //行內刪除直到","不刪除 ct) //行內改變直到),)不刪除 ... ...
(8). 學會x和X混用,分別是向前刪除和向后刪除字符
(9). :rd 刪除第r行
3.查找
# //向下一個查找結果 * //向下一個查找結果 //在#/*之后按n/N可以重復/反向重復它們的命令 //下面這兩個命令在編程時,很有用 gd //跳轉到光標變量的定義位置(局部變量) gD //跳轉到光標變量的定義位置(全局變量)
4. 撤銷和恢復
u //撤銷 ctrl + r //恢復
5. 滾動
ctrl + e/y //向下/上一行一行的滾動 ctrl + d/u //向下/上半頁半頁的滾動 ctrl + f/b //向下/上一頁一頁的滾動
6. 可視模式(選擇塊)
可視模式其實非常有用,它的選擇很靈活,而且視覺效果上看着和鼠標選擇一樣,學習成本低,但是功能強大。
(1). v 進入可視模式
(2). shift + v 也就是大寫的V,可視模式的行選擇,整行整行的選擇,用於剛好整行或者大篇幅內容的處理比較方便。
(3). ctrl + v 可視模式的列選擇,比行選擇模式更加細化,可選擇連續的列進入操作
選擇塊模式需要和其他命令結合:
V + G //選擇當前行一直到文本結尾 V + G + d //刪除當前行一直到文本結尾 V + G + y //復制當前行一直到文本結尾 V + gg + d //刪除當前行一直到文本開頭 V + gg + y //復制當前行一直到文本開頭 ctrl+v + <移動>+ d //刪除選擇的列 ctrl+v + <移動>+ y //復制選擇的列
(4). gv 選中上次的選中區域
(5). 選中單詞,句子,段落:
vaw //選中一個單詞(word) vas //選中一個句子(sentence) vap //選中一個段落(paragraph) viw //選中一個單詞(word) vis //選中一個句子(sentence) vip //選中一個段落(paragraph)
(6). 選中括號:
vab //選擇()里面的內容, 包括小括號 vaB //選擇{}里面的內容,包括大括號
7.執行shell命令
//記住這兩種用法,你嘗到它們的甜頭的 :sh //打開shell,可執行shell命令,輸入exit退出shell返回到vim :!cmd //直接執行shell
比如上篇文章中提到的自動化打包腳本,我修改了代碼后,需要執行一下這個腳本編譯一下,但是我還不想完全退出vim,因為我還需要繼續修改,就可以使用
:sh //打開一個終端 ./build.sh //執行build.sh exit //退出終端,繼續vim編輯 //或者 :!./build.sh //在vim窗口直接執行build.sh腳本,然后按Enter或其他命令繼續
是不是很方便!
8. 專題一:快速選中、刪除、復制、修改引號或括號內的內容
//以下操作一定要熟記,能大大提高你編輯文本的效率 ci’、ci”、ci(、ci[、ci{、ci< //分別更改這些配對標點符號中的文本內容 di’、di”、di(或dib、di[、di{或diB、di< //分別刪除這些配對標點符號中的文本內容 yi’、yi”、yi(、yi[、yi{、yi< //分別復制這些配對標點符號中的文本內容 vi’、vi”、vi(、vi[、vi{、vi< //分別選中這些配對標點符號中的文本內容
9. 專題二:替換
查找並替換操作使用的太頻繁了,下面針對這個專題從網上或書籍上收集了替換的幾個常用的強大用法:
//語法 /** * 說明 * range表示行數,如果是%表示所有行 * s表示substitution,替換的意思 * flag表示標志,取值g,i,c等 * g表示global,全部 * i表示ignore,忽略大小寫 * c表示confirm,一個一個交互確認替換 * count表示從當前行到接下來的第幾行,表示范圍 */ :[range]s/{pattern}/{string}/[flag] [count]
(1). 全部替換
參數g實現全部替換,否則只替換一個
:%s/{old-pattern}/new-text/g
(2). 行內替換
%代表所有行,去掉%表示當前行,只替換當前行
:s/{old-pattern}/new-text/g
(3). 指定行范圍替換
對1到10行的結果替換
:1,10s/{old-pattern}/new-text/g
(4). 可視模式替換
如果你覺得數行數比較麻煩,可以使用可視模式,首先進入可視模式,然后選擇行
列,最后輸入:自動進入:'<,'>
后面加上s/{old-pattern}/new-text/g,則只替換選擇區域的結果
:'<,'>s/{old-pattern}/new-text/g
(5). 整詞替換,而不是部分匹配的單詞
對單詞匹配模式外包一個<和>
:s/\<blog\>/weibo/g //替換blog,但是cnblog,blogs則不會替換
(6). 多項替換
同時對多個匹配都替換成某一字符串
:%s/\(good\|nice\)/awesome/g //good和nice都將被替換成awesome
(7). 確認式替換
參數c讓替換進行交互請求,需要你選擇y,n,a,l,q
/** * 選擇說明: * y 替換且跳轉到下一個匹配結果 * n 不替換且跳轉到下一個匹配結果 * a 替換所有並退出交互模式 * l 替換當前並退出交互模式 * q 退出交互模式 */ :s/{old-pattern}/new-text/gc
(8). 行首插入行號
把行首^替換成行號,可自定義具體形式
:%s/^/\=line(".")/g
10. 專題三:大小寫轉換
講這個,主要是覺得這個問題挺有意思的。
~ //改變當前字符並自動切換到下一個字符,大寫變小寫,小寫變大寫,可以一直按 gum //轉化為小寫,m指移動命令,如: //guw 光標后的一個單詞小寫化 //guG 光標所在行到最后行全部小寫化 //gut= 光標后直到=之間的字符小寫化 //羅嗦一句,gu還可以與可視模式結合,小寫化所選區域 gUm //轉化為大寫,用法同上
11. 專題四:錄制
這個其實很簡單,但也是很強大的功能,單獨柃出來說一下。
//為操作定義宏或者取別名 //這個命令的強大之處在於使重復復雜指令的簡單化了 q //按下q開始錄制 x //x是這個錄制的寄存器,x可以是其它字符 dd //刪除當前行,這個操作可以自定義其他復雜的操作 q //錄制結束,現在dd這個操作被定義到了@x這個命令里了
12. 專題五:數字增減
這個小技巧還挺有用的,比如說定義了一系列static final變量,而且時不時要中間插入一些新的變量,這些值一般都是遞增的,這時候這個技巧絕對比數字替換要方便。
//Normal模式下執行 Ctrl + a //自增1 Ctrl + x //自減1
13. 小結
工善其事,先利其器。
先想到這些,必然有很多遺漏,后面想到了什么,我會隨時添加更新進來。