只要使用Linux,那么不使用文本編輯器幾乎是不可能的。這是因?yàn)槎鄶?shù)Linux配置文件是純文本文件,所以有時(shí)肯定需要進(jìn)行手動(dòng)修改。
如果正在使用GUI,那么可以運(yùn)行g(shù)edit,編輯文本時(shí)使用它相當(dāng)直觀。還有一個(gè)簡(jiǎn)單的文本編輯器nano,可從shell運(yùn)行它。但是多數(shù)Linux shell用戶會(huì)使用vi或emacs命令來(lái)編輯文本文件。與圖形編輯器相比,vi或emacs的優(yōu)勢(shì)在于可以在任何shell、字符終端或基于字符的網(wǎng)絡(luò)連接(例如,使用telnet或ssh)中使用它們,而無(wú)須使用GUI。它們都具有強(qiáng)大的功能,所以可一直使用它們。
本節(jié)提供一個(gè)簡(jiǎn)單的vi文本編輯器教程,使用它可在任意shell中手動(dòng)編輯配置文件(如果vi不適合您,請(qǐng)參閱選讀部分“了解其他文本編輯器”了解其他選擇)。
Vi編輯器在開(kāi)始時(shí)很難學(xué),可是一旦掌握了它,就永遠(yuǎn)不必使用鼠標(biāo)或功能鍵了——使用鍵盤(pán)就可以快速高效地在文件中編輯和移動(dòng)。
2.7.1 運(yùn)行vi
通常情況下,運(yùn)行vi可打開(kāi)特定的文件。例如,要打開(kāi)/tmp/test文件,可輸入下面的命令:
$ vi /tmp/test
如果這是一個(gè)新文件,應(yīng)該看到和下面類似的內(nèi)容:
~
~
~
~
~
"/tmp/test" [New File]
頂部的框表示光標(biāo)的位置。底部的行通知編輯情況(此處只是打開(kāi)了一個(gè)新文件)。在這兩部分之間,波浪線(~)作為填充符,因?yàn)槲募羞€沒(méi)有任何文本。現(xiàn)在這是令人害怕的部分:這里沒(méi)有提示、菜單或圖標(biāo)告訴我們要做什么。不能只是從頂部開(kāi)始輸入。如果這樣做,計(jì)算機(jī)就會(huì)發(fā)出蜂鳴聲。所以有些人抱怨Linux并不友好。
首先需要了解的是不同的操作模式:命令或輸入。vi編輯器始終啟動(dòng)到命令模式。在添加或修改文件中的文本前,必須輸入命令(一個(gè)或者兩個(gè)字母加上一個(gè)可選的數(shù)字)告訴vi您想要做什么。大小寫(xiě)很重要,所以要按例子所示精確地使用大寫(xiě)或小寫(xiě)字母!要進(jìn)入輸入模式,輸入該輸入命令。輸入下面的命令開(kāi)始操作:
· a:添加命令。在它之后,可以從光標(biāo)的右端開(kāi)始輸入文本。
· i:插入命令。在它之后,可以從光標(biāo)的左端開(kāi)始輸入文本。
輸入一些單詞,然后按Enter鍵。重復(fù)執(zhí)行該操作數(shù)次,直到有幾行文本為止。完成輸入后,按Esc返回到命令模式。現(xiàn)在文件中有一些文本了,試用下面的鍵或字母在文本中移動(dòng):
|
記住Esc鍵!它始終可以回到命令模式。 |
· 方向鍵:在文件中向上、下、左或右移動(dòng)光標(biāo),一次一個(gè)字符。也可以使用退格鍵和空格鍵分別向左和向右移動(dòng)。如果喜歡將手指放在鍵盤(pán)上,可使用h(左)、l(右)、j(下)或k(上)來(lái)移動(dòng)光標(biāo)。
· w:將光標(biāo)移動(dòng)到下個(gè)單詞的開(kāi)頭。
· b:將光標(biāo)移動(dòng)到前個(gè)單詞的開(kāi)頭。
· 0(zero):將光標(biāo)移動(dòng)到當(dāng)前行的開(kāi)頭。
· $:將光標(biāo)稱動(dòng)到當(dāng)前行的末尾。
· H:將光標(biāo)移動(dòng)到屏幕的左上角(屏幕上的第一行)。
· M:將光標(biāo)移動(dòng)到屏幕中間行的第一個(gè)字符。
· L:將光標(biāo)移動(dòng)到屏幕的左下角(屏幕上的最后一行)。
其他編輯操作中惟一需要知道的是如何刪除文本。下面是一些刪除文本用的vi命令:
· x:刪除光標(biāo)下的字符。
· X:刪除光標(biāo)前字符。
· dw:刪除從當(dāng)前字符開(kāi)始直到當(dāng)前單詞末尾的所有字符。
· d$:刪除從當(dāng)前字符開(kāi)始直到當(dāng)前行末尾的所有字符。
· d0:刪除從前一個(gè)字符開(kāi)始直到當(dāng)前行開(kāi)頭的所有字符。
要結(jié)束編輯,可使用下列擊鍵保存和退出文件:
· ZZ:將當(dāng)前修改保存到文件并退出vi。
· :w:保存當(dāng)前文件,但繼續(xù)編輯。
· :wq:與ZZ相同。
· :q:退出當(dāng)前文件。沒(méi)有任何未保存的修改時(shí)該命令才會(huì)工作。
· :q!:退出當(dāng)前文件,并且不保存對(duì)文件進(jìn)行的修改。
|
如果確實(shí)錯(cuò)誤地修改了文件,那么:q!命令是退出并且放棄修改的最好方法。文件會(huì)還原到最近修改的版本。所以如果只是使用:w,有時(shí)可能會(huì)陷入困境。如果只想取消一些錯(cuò)誤的編輯,按u鍵即可撤銷修改。 |
現(xiàn)在已學(xué)習(xí)了一些vi編輯命令。在后面的各節(jié)會(huì)介紹更多的命令。這里先列出首次試用vi的一些提示:
· Esc:記住,Esc用于回到命令模式(我曾看到有人按下鍵盤(pán)上的所有鍵來(lái)嘗試退出文件)。在Esc后面鍵入ZZ可以退出命令模式、保存文件并退出vi。
· u:按u鍵可以撤銷之前做的修改。連續(xù)按u可以撤銷更前面的修改。
· Ctrl+R:如果決定不再撤銷前面的命令,可使用Ctrl+R進(jìn)行恢復(fù)。本質(zhì)上,這個(gè)命令取消所做的撤銷操作。
· Caps Lock:小心不要錯(cuò)按了Caps Lock鍵。處于大寫(xiě)狀態(tài)時(shí),在vi中輸入的任何內(nèi)容都有不同的含義。輸入大寫(xiě)字母時(shí)不會(huì)出現(xiàn)警告,但事情卻開(kāi)始變得不可思議。
· :!命令:在vi中,可使用:!后跟命令名的方式來(lái)運(yùn)行命令。例如,輸入:!date查看當(dāng)前的時(shí)間和日期,輸入:!pwd查看當(dāng)前目錄,輸入:!jobs查看后臺(tái)是否有任務(wù)正在運(yùn)行。命令運(yùn)行完成時(shí),按Enter鍵就可以返回繼續(xù)編輯文件。甚至可以使用該技術(shù)從vi中啟動(dòng)shell(:!bash)、在該shell中運(yùn)行幾個(gè)命令,然后鍵入exit返回到vi(我建議轉(zhuǎn)到shell前保存文件,防止回到vi后忘記保存)。
· --INSERT:處于插入模式時(shí),INSERT一詞會(huì)出現(xiàn)在屏幕底部。
· Ctrl+G:如果忘記了正在編輯的內(nèi)容,按下這些鍵可在屏幕底部顯示正在編輯的文件名和所在的行。它還顯示文件的總行數(shù)、已瀏覽過(guò)的部分占該文件的百分比,以及光標(biāo)所在的列號(hào)。這用來(lái)在下午停止工作一段時(shí)間后,幫助您確定編輯的位置。
2.7.2 在文件中移動(dòng)
除了前面所述的幾個(gè)移動(dòng)命令外,還有其他方法可在vi文件中移動(dòng)。要嘗試這些方法,可打開(kāi)一個(gè)不會(huì)對(duì)其進(jìn)行太大破壞的大文件(把/var/log/messages復(fù)制到/tmp中,然后在vi中打開(kāi)它)。下面是一些可用的移動(dòng)命令:
· Ctrl+F:向前翻頁(yè),一次一頁(yè)。
· Ctrl+B:向后翻頁(yè),一次一頁(yè)。
· Ctrl+D:向前翻頁(yè),一次半頁(yè)。
· Ctrl+U:向后翻頁(yè),一次半頁(yè)。
· G:轉(zhuǎn)到文件的末行。
· 1G:轉(zhuǎn)到文件的首行(使用任意數(shù)字可轉(zhuǎn)到文件中的該行)。
2.7.3 搜索文本
要搜索文本在文件中下次出現(xiàn)的位置,可使用斜線(/)或問(wèn)號(hào)(?)字符。在斜線或問(wèn)號(hào)后面加上模式(字符串或文本)可分別向前或向后搜索該模式。搜索時(shí)也可以使用元字符。下面是一些例子:
· /hello:向前搜索單詞hello。
· ?goodbye:向后搜索單詞goodbye。
· /The.*foot:向前搜索包括單詞The,同時(shí)在The之后的某處有單詞foot的行。
· ?[pP]rint:向后搜索print或Print。記住,Linux中是區(qū)分大小寫(xiě)的,所以可使用括號(hào)來(lái)搜索大小寫(xiě)不同的單詞。
vi編輯器最初基于ex編輯器,而ex編輯器不能在全屏模式下運(yùn)行。但是它允許運(yùn)行命令,以便同時(shí)在一行或者多行中搜索和修改文本。輸入冒號(hào)并且光標(biāo)到達(dá)屏幕底部時(shí),實(shí)際上就處于ex模式中。下面的例子用ex命令搜索和修改文本(我選擇搜索Local和Remote,但也可使用其他合適的單詞)。
· :g/Local:搜索單詞Local,并且打印文件中它所出現(xiàn)的行(如果結(jié)果多于一個(gè)屏幕,則以管道形式將輸出定向到more命令)。
· :s/Local/Remote:在當(dāng)前行上用Remote代替Local。
· :g/Local/s//Remote:用Remote代替文件中每行第一次出現(xiàn)的Local。
· :g/Local/s//Remote/g:用Remote代替文件中出現(xiàn)的所有Local。
· :g/Local/s//Remote/gp:用Remote代替文件中出現(xiàn)所有的Local,然后打印每一行來(lái)查看進(jìn)行的修改(如果輸出多于一頁(yè),則以管道形式將輸出定向到more命令)。
2.7.4 使用命令和數(shù)字
在多數(shù)vi命令前都可以使用數(shù)字,這樣命令就能夠重復(fù)執(zhí)行該指定數(shù)目的次數(shù)。這是一次處理多行、多個(gè)單詞或多個(gè)字符的便捷方法。下面是一些例子:
· 3dw:刪除下面的3個(gè)單詞。
· 5cl:修改下面的5個(gè)字母(即刪除字母并進(jìn)入輸入模式)。
· 12j:向下移動(dòng)12行。
在多數(shù)命令前加上數(shù)字只是重復(fù)執(zhí)行這些命令。此時(shí)對(duì)于使用vi命令應(yīng)該相當(dāng)精通了。
|
在很多Linux系統(tǒng)中調(diào)用vi時(shí),實(shí)際上正在調(diào)用vim文本編輯器,它運(yùn)行在vi兼容模式下。進(jìn)行大量編程工作的人可能更愿意使用vim,因?yàn)樗圆煌念伾@示不同的代碼層次。vim還有一些其他有用的功能,例如在打開(kāi)文檔時(shí),將光標(biāo)放在最后一次退出文件時(shí)光標(biāo)所在的位置。 |