接上
第五步,學習多次操作命令
vi為了避免反復操作,vi設計了多次操作命令,操作為:操作次數+操作命令。這樣大大提高了編輯的效率。
例如1:要刪去50行。我們可以連續50次dd,但是,我們更應該利用多次操作命令,輸入50dd就ok了!
例如2:要復制當前行以下的50行,我們可以鍵入:
1、50
2、yy
3、將光標移到第50行
4、p
這個命令非常非常有用,且考驗編程者的眼力。比如,我們常常要編寫一個while、for等循環語句或一個函數。我們往往會將以前的while、for等循環語句或函數拷貝過來,做些修改。而拷多少條語句這就要看編程者的眼力了。比如,實際要拷35條。而如果編程者認為這段語句是30條,則要重新再拷5條。如果編程者這段語句是40條,則要在拷貝後,刪除5條。如果編程者一眼就能看出要拷35條,那就如同中獎一樣的高興。畢竟眼力准確可以減少額外的操作。
例如3,將hello myself 改成hi world
1、將光標移到hello
2、2
3、cw
4、hi world
5、Esc
上面的2表示將修改2個單詞。
多次操作是一次操作的重復,不學多次操作,也可以通過一次一次操作完成,但是,超過2次,超過3次以上的操作,選擇多次操作,可以大大提高編輯效率。
第六步,vi 命令行
vi不但在可以在編輯對象上進行各種操作,而且可以在vi的命令行上進行操作。這個命令行是通過鍵入“:”產生的,在文件的屏幕的最後一行。
我們的第一步中的,q命令,就是一個命令行的命令。
上面介紹的q!,x,x!命令都是命令行命令。
下面介紹一個有用行刪除的命令。
假定文件內容為:
Hello world
Hello myself
Hello c
當前光標在第一行
1、現要求,將第二行到第三行刪除。
方法1:將光標移至第二行,輸入dddd。這個上面講的一種方法。
方法2:
1,:
2,2,3d
這種方法是在命令行輸入d命令。表示,從第二行到第三行都要刪除。這種方法也叫絕對刪除法。
方法3:
1,將光標移到第二行
2,:
3,.,+1d
這種方法也是命令行命令。表示從當前行(.)到當前行後面的一行(+1)進行刪除。這種方法叫相對刪除法。意思刪除的行是相對於當前行的。
方法4:
1,當前光標在第一行
2,:
3,+1,+2d
這種方法上,表示,將第一行的下面一行到第一行下面的第二行之間全部刪除。
方法5:
1,:
2,2,$d
這種方法表示將第二行,到文件的最後一行都刪掉。$表示文件的最後一行。這個命令也十分有用。
如果我們不知道我們當前行是哪一行,我們可以鍵入:ctrl-g,這個時候,命令行就會出現提示:The cursor is at line 1 of 3—33%--,就可以看到當前行是第幾行,整個文件有多少行了。其中1是當前行,3是所有的行。
Ctrl-g也是很常用的命令。
在vi長期實踐中,相對法用於刪除20行之內語句比較有效,快捷;絕對法用於刪除大批語句有效。
2、替換所有hello 為hi
1,:
2,1,$s/hello/hi/g
我是這樣理解這個命令的:從第一行到最後一行,查到(s)hello用hi來全部(g)替換。這樣今後就忘不了了。
第七步,讀文件,寫文件
前面都是基於語句級、單詞級的編輯。在我們初學vi的時候,十分有用,在我們編寫少量的C語言時候,也很有用,也足夠了。但是,當我們編寫的C語言程序越來越多的時候,我們看到的別人C語言程序越來越多的時候,我們往往會復制別人的程序和自己的程序,會復制某一段成程,用在自己的程序之中。這個時候,我們就會出現一個以文件級程序“復制、粘貼”的操作。
例如,我們要將a.c中的open_deal這個函數,拷貝到b.c中。
1,vi a.c
2,/open_deal
3,n
4,ctl-g
5,記下當前行,假定243
6,將光標移到open_deal最後一行
7,ctl-g
8,記下當前行,假定343
9,:
10,243,343w open.c
11,q!
12,vi b.c
13,將光標移動open_deal要放的地方那一行。
14,:
15,r open.c
16,:
17,x!
這個例子,有兩個重點,一個是243,343w open.c.這個操作說明,將第243行到343行的open_deal函數程序,寫到open.c文件之中。
另個重點是,r open.c,這個操作說明,將open.c 讀到當前行之下。
通過w和r我們完成了函數的復制和粘貼。
很多情況下,我們會將整個文件r進來,在進行修改的。
此外,很多情況下,我們會起找一下我們過去的程序,去找一下某一個我們想要的函數,和一些語句的用法,但是,我們又不知道在那個文件之中。這個時候,我們可以通過同時打開多個文件的方法,一個一個文件去查看是否有我們想要的東西,一旦發現,我們就會知道這個函數在那個文件之中了。
例如,假定我們的目錄下,有a1.c,a2.c,a3.c,b1.c,b2.c,b3.c六個文件,我們記得其中有一個名為open_deal函數,我們想改造這個函數,但是,我們不知道這個函數在什麼文件之中。這時候我們可以這樣操作。
1,vi *.c
2,/open_deal
3,:n
4,/open_deal
直到找到為止。
這裡重點有2個,一是vi *.c,表示編輯所有的.c文件;二是,:n(next)讀下一個文件。
找到open_deal之後,你可以通過w命令,將函數寫成一個文件,以便以後r用。
學習vi一定要從簡單到復雜,從第一步到第七步要慢慢而來,不要著急,一口吃個胖子。第一步到第四步是入門和基礎,了解需要半天到一天,操作練習估計要2天到3天,後面幾步也要3天左右。有人在旁,估計1周掌握vi應該不成問題。但是要精通vi則是很難給出一個時間的。我可以肯定地說,如果你能掌握這7個步驟,幾乎所有的C語言的編寫是沒有問題的(編輯方面)。
四、Vi命令小結
將我認為的vi常用的命令小結一下,便於大家查詢(其他命令因為很少用,我就不列舉在其中了,想學的可以去網上查詢。)
1、 進入和退出vi
1)vi 文件名 編輯一個文件。
2)vi *.c 編輯多個文件。
3):q 退出vi(不保存退出,文件沒有被編輯過)。
4):q! 退出vi(不保存退出,文件被編輯過)。
5):x 退出vi(保存退出)。
6):x! 退出vi(保存退出,文件被編輯過)。
2、 增加、修改、刪除、查詢、取消命令
1)i 在當前字符前插入,Esc退出插入狀態
2)I 在行首插入,Esc退出插入狀態
3)a 在當前字符後插入,Esc退出插入狀態
4)A 在行尾插入,Esc退出插入狀態
5)o 在當前行下面插入,Esc退出插入狀態
6)O 在當前行上面插入,Esc退出插入狀態
7)r 修改當前字符
8)cw 修改當前單詞,以空格,(),[]等為界,Esc退出插入狀態
9)s 修改當前字符並插入,Esc退出插入狀態
10)x 刪除當前字符。
11)dd 刪除當前行
12)/ 查詢,後面跟查詢內容
13)n 滿足查詢的下一個內容
14)u 放棄前一次操作
3、復制和粘貼
1)yy 復制當前行
2)p 將復制行粘貼到當前行下
4、光標移動、行數、操作次數
1)光標鍵 將光標按光標鍵所指的方向,向上,向下,向左,向右移動。
2):1 將光標移動打文件首行
3)G 將光標移動到文件尾行
4). 表示當前行
5)+n n是數值,表示當前行後nn行
6)ctrl-g 查看當前行的是第幾行,當前文件的文件名,文件總行數。
7)n操作符 進行n次操作。例如5yy 就是將yy重復5次。5x就等於xxxxx。
5、替換
1)n1,n2s/字符串1/字符串2/g
將n1行到n2行中字符串1全部替換成字符串2
6、寫文件,讀文件
1)n1,n2 w 文件名 將n1行到n2行寫入文件名的文件之中。
2)r 文件名 將文件名的文件裝入到當前行下面。
五、 編輯工具的掌握程度
不少程序員滿足於會,不追求於精;編程如此,編輯也是如此。這種程序員真的可以選擇轉行。程序員是屬於更高更快更精的職業,不進則退,否則,枉然程序員這個稱號。對於vi也是這樣,程序員千萬不要滿足於我會這個命令,我知道這個命令,因為會和知道僅僅是一個手段,目的是要用,要用好這個命令,讓程序編的更快才是最重要的。
對於一個編輯工具掌握程度有沒有一個標准?當然有!那就是使用編輯命令的准確性,也就是說,什麼時候該用什麼命令。把這用於可量化的標准,那就是:在相同的最終的編輯內容,我們所用的擊鍵次數最少為高。這就要求我們盡量減少修改、刪除的次數,一次就能把程序編寫好(一次幾乎不可能,但是次數越少越好,這樣可以迫使自己考慮更完美一些。),在需要修改情況下,用准確的命令進行修改,使得擊鍵次數最少。
例如,某行有50個字符,當前光標在字首,現要在字尾加上hello。一種方法是,將光標直至第50個字符,鍵入i,鍵入hello,鍵入Esc。這種方法一共要擊50+1+5+1=57個鍵。第二種方法是,鍵入A,鍵入hello,鍵入Esc,這種方法一共要擊1+5+1=7個鍵。你說哪種方法好?當然是第二種方法好!因為A命令就是為在行尾增加而設計的,你選擇A就是選擇最准確的編輯命令。
www.2cto.com
再例如,某行為this is a new world,光標在行首,現要將改成this is a cat。第一種方法,單字刪除插入法:將光標移動到new,鍵入xxx,鍵入x,鍵入xxxxx,鍵入i,鍵入cat,鍵入Esc。這種方法一共要擊11+3+1+5+1+3+1=25個鍵。第二種方法,詞組刪插入法:將光標移動到new,鍵入2cw,鍵入cat,鍵入Esc。這種方法一共要擊11+3+3+1=18個鍵。第三種方法,刪除插入法,將光標移動到new,鍵入D,鍵入A,鍵入cat,鍵入Esc。這種方法一共要擊11+1+1+3+1=16個鍵。當然還有其他方法,這裡就不一一例舉了。就這三種方法而言,當然是第三種方法最好,它准確了運用了尾刪除命令,總的擊鍵數最少。而第二種方法,要遠好於第一種方法,它成功運用了詞組修改和次數的結合,使得修改相比第一種更加快捷和合理。
以上我們可以看出我們對編輯命令的掌握程度高低是可以通過擊鍵數多少而得出。擊鍵數少,說明運用編輯命令合理,運行編輯命令巧妙,編程時間短,可以節約編程時間用於其他諸如設計,調試等工作。反之,則說明不能正確的使用編輯命令,擊鍵數多,編程時間就長,減少了設計時間和調試時間。
另外,除了正確掌握編輯命令之外,單純的打字速率是必須要提高的,無論是英文還是漢字都要盲打才行。在我們那個年代,打字不被重視,有的程序員竟然是單手單指打字,被人戲稱為“一指禅”。這種基本功在現在看來是絕對不允許的。可以容忍的打字速度是和語速相當那種水平,或再低一些也行。但是,語速不能間斷。
很多程序員,如果你站在他的身邊看他編程序,那只打字的手,打打停停,不知道他在想什麼,是在思考程序的編法?是在考慮程序語法如何?是在考慮如何編輯?很簡單很簡單的程序到他們那裡就會變的很復雜很復雜似的,看得你非急死了不可,這那叫編程序呀,這簡直要了別人的命,要了自己的命!
優秀的程序員不但要程序編的好,在一些基本功方面,比如打字、編輯方面也要同樣的出色。很難想象一個優秀程序員,用一個手指,不停地思索著,不斷地修改著,慢慢吞吞編出來個優秀程序。編輯應該像行雲流水一樣,沒有停頓(停頓不超過2秒),一氣呵成,程序就出來了,這才是我們追求的境界。
總之,vi 與C語言有不解之緣,尤其是在unix操作系統平台上,更是密不可分,相依相伴。砍柴需要快刀,而vi就是砍C語言這個柴的快刀。每當你舉起快刀利利索索砍下C語言這個硬柴的時候,你心中有說不出的快感。當yy落下,當dd落下,你不得不感歎vi設計者的神奇,他復制了從前,他又刪除了當前,一切又回到了原點。
後記:
寫到此處,我不禁對自己刮目相看了,這篇文章讓我斷斷續續寫了近十天,本來只想寫個大概,寫幾個命令舉例舉例就完了。那曉得越寫越想寫,越寫越寫得細,恨不得將我所有有關vi的東西都寫出來。畢竟我寫了幾十年的程序,用了幾十年的vi卻從來沒有看過一本vi書,所有的命令都是從同事那裡學來的。可以說是我是草根vi。有時候,我在vi的時候,一直在想vi設計者當時為啥這樣設計這個命令的,這些簡單而又復雜,好記又很巧妙的設計,千變萬化的vi,甚至能比C語言本身更能讓我激動,讓我叫好。我一直在想我能否有一天能編出一個程序象vi設計者那樣,讓我的用戶感到激動和叫好呢?沒想到我為了寫博客能把這些命令系統地寫出來。我把一些vi要點、重點、體會告訴給想學vi的新手,希望能給他們一些參考。同時把這也算自己學習和操作vi做個總結吧,也算是我給vi設計者一個匯報吧、一個敬意吧