學(xué)習(xí)vi──備忘單方法---超牛。
Posted on 2011-01-27 17:16 幻海藍(lán)夢(mèng) 閱讀(739) 評(píng)論(0) 編輯 收藏 所屬分類: Linux學(xué)習(xí)vi──備忘單方法
本教程將會(huì)向你展示如何使用vi──一個(gè)強(qiáng)大的可視化編輯器。通過(guò)使用特別的備忘單方法,本教程可使你成為一名熟練的vi用戶,而不要求大量的時(shí)間。在這個(gè)vi教程中,你將會(huì)學(xué)會(huì)如何移動(dòng)、編輯文本、使用插入模式、復(fù)制和粘貼文本,以及使用諸如可視化模式和多窗口編輯這樣重要的vim擴(kuò)展。
如果你沒(méi)聽說(shuō)過(guò)vi,或者不習(xí)慣使用vi,那么你就應(yīng)該對(duì)自己負(fù)責(zé),利用本教程趕緊學(xué)習(xí)這個(gè)最流行最強(qiáng)大的Linux/UNIX可視化編輯程序。
只有特別的一件事會(huì)使學(xué)習(xí)vi很困難──vi有眾多的命令。為了有效地使用vi,你需要記住不少命令。這會(huì)需要很長(zhǎng)時(shí)間,而本教程的目標(biāo)之一就是不占用你的很多時(shí)間。所以,我們一開始就有一個(gè)挑戰(zhàn)──我是如何具體地幫助你在短期就記住眾多的命令?
為了處理這個(gè)挑戰(zhàn),在我們進(jìn)行本教程的過(guò)程中,會(huì)逐漸地生成一個(gè)vi備忘單。這個(gè)單子會(huì)包括所有重要的vi命令。當(dāng)你完成本教程后,你將能在忘記了某個(gè)命 令的時(shí)候參考該備忘單。時(shí)間一長(zhǎng),由于你記住了命令,你會(huì)漸漸地越來(lái)越不依賴于備忘單。通過(guò)使用備忘單的方式,你將能前所未有地更快學(xué)習(xí)如何使用vi!
在本指南中,我將使用幾個(gè)技巧來(lái)幫助你學(xué)習(xí)。首先,我會(huì)描述某個(gè)命令是如何工作的,正如之前你所期望的。然后,我將讓你試著在vi中使用該命令(為了練 習(xí))。接下來(lái)我會(huì)讓你將該命令轉(zhuǎn)錄到備忘單上(以備將來(lái)參考)。如果你想更快地學(xué)習(xí)vi,執(zhí)行所有這些步驟是很重要的。在vi中試用命令并轉(zhuǎn)錄到備忘單中 將會(huì)幫助你記憶該命令。
vi有很多版本,而我將會(huì)向你展示如何使用一個(gè)叫做vim的版本。vim非常流行,并有使vi漂亮了很多的眾多擴(kuò)展(當(dāng)我示范vim專用的命令時(shí),我會(huì)加以說(shuō)明)。如果你需要安裝vim,可以從www.vim.org那里得到它。除了增強(qiáng)版的命令行vi,vim還增加了gvim,一個(gè)漂亮的圖形化編輯器,可以被配置來(lái)調(diào)用優(yōu)秀的GTK+圖形化界面庫(kù)。這是我系統(tǒng)上的gvim截圖:
圖示 1.1: VIM截圖 |
![]() |
如果你是vi新手,請(qǐng)讓gvim運(yùn)行在你的系統(tǒng)上。對(duì)于初學(xué)者來(lái)說(shuō),在圖形化界面下使用vi可以使事情變得簡(jiǎn)單一些。
在使用vi編輯文件之前,你需要知道如何使用vi在文件中移動(dòng)。vi有許多移動(dòng)命令,而我們將會(huì)看到其中的很多。為教程中的這一部分找一個(gè)不重要的文本文件,并通過(guò)輸入以下命令來(lái)將它載入到vi中:
代碼 2.1: 將文件載入vi |
$ vi myfile.txt |
如果你已安裝了vim,輸入vim myfile.txt。如果你更喜歡使用gvim,輸入gvim myfile.txt。myfile.txt應(yīng)該是你系統(tǒng)上的某個(gè)文本文件名。
vi啟動(dòng)之后,你應(yīng)該能在屏幕上看到載入的文本文件的一部分了。恭喜──你已經(jīng)進(jìn)入vi了!vi不像其他的編輯器,當(dāng)它啟動(dòng)時(shí)處于一個(gè)叫做命令模式的特殊模式中。這意味著如果你按鍵盤上的l鍵,光標(biāo)會(huì)向右移一位,而不是在當(dāng)前光標(biāo)位置上插入一個(gè)l。在命令模式下,鍵盤上的字符是用來(lái)向vi傳送命令的,而不是在文本中插入文字字符的。移動(dòng)命令是最重要的命令類型之一;讓我們來(lái)看看其中的一些。
當(dāng)在命令模式中時(shí),你可以分別使用h、j、k和l鍵來(lái)向左、下、上和右移動(dòng)。如果你正在使用現(xiàn)代版本的vi,你也可以使用方向鍵來(lái)達(dá)到同樣的目的。h、j、k和l鍵很方便,這是因?yàn)橐坏┠氵m應(yīng)了它們,你就可以不用把手指從主鍵盤上移開就在文件中四處移動(dòng)。試著用h、j、k和l鍵(還有方向鍵)在文本文件中移動(dòng)吧。試著用h鍵直到你移到了一行的開始處。注意,vi不允許你在行首時(shí)用h鍵轉(zhuǎn)到前一行。同樣地,你也不能在行尾時(shí)用l鍵轉(zhuǎn)到下一行。
vi為跳轉(zhuǎn)到當(dāng)前行的首或尾提供了特別的捷徑。你可以按0(零)鍵來(lái)跳轉(zhuǎn)到一行的開始,以及$鍵跳轉(zhuǎn)到末尾。試試它們看看。由于vi有許多便捷的移動(dòng)命令,它也是一個(gè)偉大的“翻頁(yè)工具”(如同more或者less命令)。用vi做翻頁(yè)也會(huì)幫助你迅速學(xué)習(xí)所有的移動(dòng)命令。
你也可以用<CTR>F和<CTR>B來(lái)一次前進(jìn)或后退一頁(yè)。現(xiàn)代版本的vi(比如vim)也允許你用PGUP和PGDOWN鍵達(dá)到同樣的目的。
vi也允許你向左右按詞移動(dòng)。按w鍵移到下一個(gè)詞的第一個(gè)字符。按e鍵移到下一個(gè)詞的最后一個(gè)字符。按b鍵移到前一個(gè)詞的第一個(gè)字符。試驗(yàn)一下它們。
玩過(guò)詞語(yǔ)移動(dòng)命令之后,可能你已經(jīng)注意到vi將像foo-bar-oni這樣的詞看做是五個(gè)分開的詞!這是因?yàn)関i默認(rèn)地按照空格或者標(biāo)點(diǎn)來(lái)區(qū)分詞語(yǔ)。因此foo-bar-oni被看做是五個(gè)詞:foo、-、bar、-和oni。
有時(shí)這是你想要的,而有時(shí)這卻不是。幸運(yùn)的是,vi也能理解“長(zhǎng)詞”的概念。vi僅按照空格或是新行分解長(zhǎng)詞。這意味著當(dāng)foo-bar-oni被看做是五個(gè)vi詞語(yǔ)時(shí),卻僅僅是一個(gè)vi長(zhǎng)詞。
你可以用一個(gè)大寫的詞語(yǔ)移動(dòng)命令來(lái)跳轉(zhuǎn)到前一個(gè)或后一個(gè)長(zhǎng)詞。用W鍵來(lái)跳轉(zhuǎn)到下一個(gè)長(zhǎng)詞的第一個(gè)字符,用E鍵跳轉(zhuǎn)到下一個(gè)長(zhǎng)詞的最后一個(gè)字符,用B鍵跳轉(zhuǎn)到前一個(gè)長(zhǎng)詞的第一個(gè)字符。試驗(yàn)一下它們,然后比較一下匹配的單詞和長(zhǎng)詞移動(dòng)命令,直到你理解了它們之間的不同。
在我們開始把它們集中到備忘單之前,再來(lái)看看幾個(gè)命令。你可以用(和)鍵來(lái)移到前一句或后一句的開始處。還有,你可以敲{或}鍵來(lái)轉(zhuǎn)到當(dāng)前段落或下一段落的開始處。試驗(yàn)一下它們。
我們已經(jīng)講過(guò)了基本的移動(dòng)命令,但是你還需要知道其他一些命令。輸入:q會(huì)退出vi。如果這個(gè)不靈,那你可能意外地修改了文件某處。如要讓vi放棄所有更改而退出,輸入:q!。現(xiàn)在你應(yīng)該位于命令提示符處了。
在vi中,所有以:開頭的命令都被稱為ex模式命令。這是因?yàn)関i有一個(gè)內(nèi)建的非可視化的編輯器,叫做ex。它可以像sed那樣用來(lái)做基于行的編輯操作。還有,它可以用來(lái)退出,就像我們剛剛看到的那樣。只要你在命令模式下敲了Q鍵,就會(huì)轉(zhuǎn)到ex模式。如果這發(fā)生在你身上了,那你會(huì)面對(duì)一個(gè):提示符,而且輸入回車符會(huì)使整個(gè)屏幕向上翻頁(yè)并退出。只要輸入vi并回車就能又回到vi模式。
我們已經(jīng)講過(guò)了許多命令,現(xiàn)在是把它們轉(zhuǎn)錄到備忘單的時(shí)候了。為此你需要一張信紙,或者A4大小的紙張(我們將會(huì)把許多信息都記在這張單子上!)。這張圖 片展示了我的備忘單,轉(zhuǎn)錄了到現(xiàn)在為止所有我們講到的命令。如果可能的話請(qǐng)模仿我的布局,這樣我們可以把所有的信息都集中在一張單子里。
圖示 5.1: 備忘單 |
![]() |
讓我們繼續(xù)學(xué)習(xí)命令的腳步。在命令模式中,你可以輸入G鍵來(lái)跳轉(zhuǎn)到特定的行。要跳轉(zhuǎn)到文件的首行,輸入1G。注意G是大寫的。
如果你想跳轉(zhuǎn)到下一處某個(gè)文本模式的出現(xiàn),輸入/<regexp>后敲回車。用你正在尋找的正則表達(dá)式替換<regexp>。如果你不知道怎么使用正則表達(dá)式,不要煩躁──輸入foo會(huì)移動(dòng)到下一處foo出現(xiàn)的地方。對(duì)此你唯一需要注意的是,當(dāng)你想引用^、.、$或\字符時(shí),用反斜線符號(hào)(\)做這些符號(hào)的前綴。比如,foo\.gif會(huì)搜索下一處“foo.gif”的出現(xiàn)。
要向前重復(fù)搜索,敲n鍵。要向后重復(fù)搜索,輸入N。跟往常一樣,在你自己的vi編輯器里測(cè)試這些命令。你也可以輸入//來(lái)重復(fù)上一次搜索。
我們已經(jīng)講過(guò)了如何使用ex命令:q來(lái)從vi中退出。如果你想要保存更改,輸入:w。如果你想要將更改保存到另一個(gè)文件,輸入:w filename.txt來(lái)另存為filename.txt。如果你想保存并退出,輸入:x或者:wq。
在vim(還有其他高級(jí)vi編輯器,像elvis)中,你可以同時(shí)打開多個(gè)緩沖區(qū)。要在新窗口中打開文件,輸入:sp filename.txt。filename.txt會(huì)在一個(gè)新的分割窗口中顯示為編輯打開。要在各窗口間切換,輸入<CTR>w<CTR>w(control-w兩次)。你輸入的任何:q、:q!、:w或:x命令只會(huì)作用于當(dāng)前激活的窗口。
現(xiàn)在是開始學(xué)習(xí)一些簡(jiǎn)單編輯命令的時(shí)候了。此處我們將要涉及的命令被認(rèn)為是簡(jiǎn)單的,是因?yàn)檫@些命令使你一直處于命令模式中。更復(fù)雜一些的命令會(huì)自動(dòng)將你放到插入模式中──一種允許你從鍵盤輸入文字?jǐn)?shù)據(jù)的模式。我們也會(huì)涉及一點(diǎn)兒這些情況。
而現(xiàn)在,試著移到一些字符上并重復(fù)按x鍵。你會(huì)看到x會(huì)刪除當(dāng)前光標(biāo)下的字符。現(xiàn)在,移動(dòng)到文本文件中某段落的中間,然后按J(大寫)。你會(huì)看到J命令讓vi將下一行加到當(dāng)前行末尾。現(xiàn)在,移到一個(gè)字符上并按r,然后輸入一個(gè)新字符;你會(huì)看到原始字符被替換掉了。最后,移到文件中任一行并輸入dd,你會(huì)看到dd刪除了文本的當(dāng)前行。
你可以靠.鍵來(lái)重復(fù)任一編輯命令。如果你試驗(yàn)一下,會(huì)看到輸入dd...會(huì)刪掉4行,而J......會(huì)加入4行。與往常一樣,vi提供了其他便捷的方式。
你也可以用d命令加上其他命令來(lái)刪除文本。比方說(shuō),dw會(huì)從當(dāng)前位置一直刪到下一個(gè)詞的開始處;d)會(huì)一直刪到下一句為止;而d}會(huì)刪掉本段落的其余部分。試一下d命令和其他編輯命令,直到你適應(yīng)了它們。
現(xiàn)在我們正在試驗(yàn)刪除,這也是學(xué)習(xí)如何撤消更改的好時(shí)候。按u鍵,原始版本的vi僅允許你撤消最后一次的編輯。然而,像vim之類的現(xiàn)代版本vi會(huì)允許你重復(fù)按u鍵繼續(xù)撤消對(duì)文件的更改。試著將一些d和u命令混合起來(lái)。
到更新備忘單的時(shí)候了!加上到目前為止我們講過(guò)的命令后,你的備忘單看起來(lái)應(yīng)該是這樣的:
圖示 6.1: 含有編輯命令的備忘單 |
![]() |
迄今為止,我們已經(jīng)講了如何在vi中移動(dòng),進(jìn)行文件輸入/輸出,以及一些基本的編輯操作。然而,我仍然沒(méi)有向你展示如何實(shí)際地輸入自由格式的文本!這是故意的,因?yàn)関i的插入模式一開始有點(diǎn)兒復(fù)雜。但是,當(dāng)你適應(yīng)了插入模式之后,它的復(fù)雜性(以及靈活性)會(huì)成為優(yōu)點(diǎn)。
在vi的插入模式中,你將能直接向屏幕里輸入文本,就像在其他很多可視化編輯器中一樣。一旦你輸入完更改,可敲Esc鍵退回到命令模式。你可以按i鍵或a鍵進(jìn)入插入模式。如果你按i鍵,你的文本會(huì)被插入到當(dāng)前字符之前,而如果你按a鍵,你的文本會(huì)被續(xù)寫到當(dāng)前字符之后。記住,在你輸入了文本之后,敲<ESC>來(lái)回到命令模式。
繼續(xù)試著使用a和i命令。敲a鍵或i鍵,輸入一些文本,然后敲ESC回到命令模式。敲完a或i后,試著敲<ENTER>看看會(huì)發(fā)生什么。試著使用方向鍵和<DEL>鍵來(lái)感受一下插入模式是怎樣工作的。通過(guò)使用方向鍵和<DEL>鍵,你可以執(zhí)行大量的編輯步驟,而不用重復(fù)進(jìn)出插入模式。
這里有一些其他進(jìn)入插入模式的便捷方式。不管你當(dāng)前處于當(dāng)前行的什么位置,按A鍵(大寫)來(lái)開始在該行的末尾處續(xù)寫。同樣地,按I鍵(大寫)來(lái)開始在當(dāng)前行的開始處插入文本。按o鍵來(lái)在當(dāng)前行下面創(chuàng)建一個(gè)新的可插入文本的空行,而按O鍵(大寫)可在當(dāng)前行之上創(chuàng)建一個(gè)新行。按cc可用新行將當(dāng)前行全部替換掉。要將從當(dāng)前位置到本行末尾之間的一切替換掉,輸入c$。要將從本行開頭到當(dāng)前位置的一切替換掉,輸入c0。
除了執(zhí)行特定的操作,這些命令都能將你置于插入模式中。輸入你的文本后,敲<ESC>鍵退回到命令模式。
迄今為止我們已經(jīng)使用了一些c(change,即變更)命令,包括cc、c0和c$。cc是變更命令的一種特殊形式,同dd相似。c0和c$命令是將變更命令和移動(dòng)命令結(jié)合使用的例子。在這種形式中,c和d工作方式類似,除了它將你置于插入模式之中以讓你能輸入可替代刪除區(qū)域的文本。將一些移動(dòng)命令和c結(jié)合起來(lái),在你的文件中試試看(提示:cW、ce、c(。)
當(dāng)你開始使用復(fù)合(“套餐”)命令,如d{和cw時(shí),vi才真正地變得強(qiáng)大起來(lái)。除了這些命令,你也可以將數(shù)字和任一移動(dòng)命令組合,比如3w,它會(huì)告訴vi向右跳轉(zhuǎn)三個(gè)詞。這里有一些移動(dòng)“套餐”命令的范例:12b、4j。
vi除了允許(數(shù)字)(移動(dòng)命令)的組合,還允許d或c和數(shù)字或移動(dòng)命令組合。所以,d3w會(huì)刪除后面三個(gè)單詞,d2j會(huì)刪除當(dāng)前行和下面兩行,等等。試驗(yàn)一下c和d相結(jié)合的移動(dòng),感受一下vi編輯是多么強(qiáng)大和簡(jiǎn)潔。一旦這些命令成為了第二天性,你將能以閃電般的速度編輯文件。
是再次更新備忘單的時(shí)候了。現(xiàn)在它看起來(lái)應(yīng)該是這個(gè)樣子:
圖示 8.1: 含有復(fù)合命令的備忘單 |
![]() |
到目前為止,我們已經(jīng)講了如何移動(dòng)、保存和退出、進(jìn)行簡(jiǎn)單編輯和刪除,以及使用插入模式。有了當(dāng)前備忘單上記錄的一切,你應(yīng)該能使用vi來(lái)進(jìn)行幾乎所有的任務(wù)了。
但是,vi還有許多更強(qiáng)大的命令。在本部分,你會(huì)學(xué)習(xí)到如何使用剪切、復(fù)制和粘貼、搜索和替換,以及使用自動(dòng)縮進(jìn)特性。這些命令會(huì)幫助vi變得更有趣更具工作效率。
剪切和粘貼的最佳方法是使用可視化模式,它是被加入到諸如vim和elvis等現(xiàn)代版本的vi中的一種特殊模式。你可以將可視化模式看做為一種“高亮文本”模式。一旦文本被高亮,它就可以被復(fù)制或刪除,然后粘貼。如果你正在使用gvim,即可用拖拽鼠標(biāo)左鍵滑過(guò)某段區(qū)域的方式來(lái)高亮。
圖示 8.2: 含有高亮文本的VIM |
![]() |
另外,你也可以按v鍵進(jìn)入可視化模式(如果你在控制臺(tái)中使用vi,這可能是你唯一的選擇)。然后,用移動(dòng)命令(通常是方向鍵)來(lái)移動(dòng)光標(biāo),你將能高亮某個(gè)文本區(qū)域。一旦文本被高亮了,我們就準(zhǔn)備好剪切或復(fù)制它們了。
如果你正在復(fù)制文本,敲y鍵(代表“yank”,即“用力拉拽”,譯者注)。如果你正在剪切文本,敲d。你將回到命令模式。現(xiàn)在,移到你想插入剪切或復(fù)制的文本的位置,并敲P鍵來(lái)將其插入于光標(biāo)之前,或p插入到光標(biāo)之后。瞧,剪切/復(fù)制和粘貼完成了!在進(jìn)入下一部分之前,試驗(yàn)一些復(fù)制/剪切和粘貼操作。
我們使用ex模式來(lái)替換某模式的文本。如果你想替換掉當(dāng)前行中第一個(gè)匹配的模式,輸入:s/<regexp>/<replacement>/并敲回車,此處<regexp>是你想匹配的模式,<replacement>是用來(lái)替換的字符串。要替換掉當(dāng)前行中所有匹配的模式,輸入:s/<regexp>/<replacement>/g并敲回車。要替換掉該模式在你的文件中的所有匹配(通常你是這么想的),輸入:%s/<regexp>/<replacement>/g。如果你想要做全局替換,但是希望vi提示每一處變化,輸入:%s/<regexp>/<replacement>/gc(代表“confirm”,即“確認(rèn)”,譯者注)并敲回車。
為了編輯源代碼vi支持自動(dòng)縮進(jìn)。當(dāng)你編輯源代碼文件(比如.c文件)時(shí),大多數(shù)現(xiàn)代版本的vi(如vim)自動(dòng)啟用自動(dòng)縮進(jìn)模式。當(dāng)自動(dòng)縮進(jìn)啟用時(shí),你可以用<CTR>d(control-d)來(lái)向左移動(dòng)一個(gè)縮進(jìn)單位,或用<CTR>t(control-t)來(lái)向右移動(dòng)一個(gè)縮進(jìn)單位。如果自動(dòng)縮進(jìn)并未被自動(dòng)啟用,你可以通過(guò)在ex命令中輸入:set autoindent的辦法來(lái)手工啟用之。你也可以用:set tabstop來(lái)告訴vi將制表符設(shè)定為你最喜歡的設(shè)置;:set tabstop=4相當(dāng)流行。
嗯,我們已經(jīng)抵達(dá)了vi教程的末尾了!在將所有高級(jí)編輯命令添加到你的備忘單之后,它看起來(lái)應(yīng)該是這樣的:
圖示 8.3: 終極備忘單 |
![]() |
將你的備忘單常置于手邊,并開始使用vi來(lái)編輯文件和編寫郵件。有需要時(shí)參考備忘單;你會(huì)發(fā)現(xiàn)一周之內(nèi),你能記住幾乎所有的命令,而你的vi工作效率會(huì)直沖云霄!
如果你想用vi做為默認(rèn)編輯器,對(duì)/etc/rc.conf做如下更改:
代碼 8.1: 將vi設(shè)為默認(rèn)編輯器 |
(將EDITOR設(shè)為你喜歡的編輯器) |
這里有一些資源,在你繼續(xù)深入學(xué)習(xí)vi時(shí)可能會(huì)有幫助:
- Vi愛好者主頁(yè),一個(gè)極棒的關(guān)于vi各方面的資源
- vim主頁(yè)是滿足你所有vim需要的地方
- 如果你在尋找一本優(yōu)秀的老式圖書,學(xué)習(xí)vi編輯器,第六版會(huì)是一個(gè)很棒的選擇。它很好地涵蓋了vi和vi克隆版本。
本文章的原始版本首先發(fā)布于IBM developerWorks,版權(quán)歸Westtech Information Services所有。本文檔是原始版本的更新版本,包含了由Gentoo Linux文檔組做的各種改進(jìn)。
原文:http://www.gentoo.org/doc/zh_cn/vi-guide.xml