Linux下C編程基礎(chǔ)之:常用編輯器
Linux系統(tǒng)提供了一個(gè)完整的編輯器家族系列,如Ed、Ex、vi和emacs等。按功能它們可以分為兩大類:行編輯器(Ed、Ex)和全屏幕編輯器(vi、emacs)。行編輯器每次只能對(duì)一行進(jìn)行操作,使用起來(lái)很不方便。而全屏幕編輯器可以對(duì)整個(gè)屏幕進(jìn)行編輯,用戶編輯的文件直接顯示在屏幕上,從而克服了行編輯那種不直觀的操作方式,便于用戶學(xué)習(xí)和使用,具有強(qiáng)大的功能。
vi是Linux系統(tǒng)的第一個(gè)全屏幕交互式編輯程序,它從誕生至今一直得到廣大用戶的青睞,歷經(jīng)數(shù)十年仍然是人們主要使用的文本編輯工具,足以見其生命力之強(qiáng),而強(qiáng)大的生命力是其強(qiáng)大的功能帶來(lái)的。由于大多數(shù)讀者在此之前都已經(jīng)用慣了Windows平臺(tái)上的編輯器,因此,在剛剛接觸時(shí)總會(huì)或多或少不適應(yīng),但只要習(xí)慣之后,就能感受到它的方便與快捷。
1.vi的模式vi有3種模式,分別為命令行模式、插入模式及命令行模式。下面具體介紹各模式的功能。
(1)命令行模式。
用戶在用vi編輯文件時(shí),最初進(jìn)入的為一般模式。在該模式中用戶可以通過(guò)上下移動(dòng)光標(biāo)進(jìn)行“刪除字符”或“整行刪除”等操作,也可以進(jìn)行“復(fù)制”、“粘貼”等操作,但無(wú)法編輯文字。
(2)插入模式。
只有在該模式下,用戶才能進(jìn)行文字編輯輸入,用戶按[ESC]可鍵回到命令行模式。
(3)底行模式。
在該模式下,光標(biāo)位于屏幕的底行。用戶可以進(jìn)行文件保存或退出操作,也可以設(shè)置編輯環(huán)境,如尋找字符串、列出行號(hào)等。
2.vi的基本流程(1)進(jìn)入vi,即在命令行下鍵入“vihello”(文件名)。此時(shí)進(jìn)入的是命令行模式,光標(biāo)位于屏幕的上方,如圖3.2所示。
圖3.2進(jìn)入vi命令行模式
(2)在命令行模式下鍵入i進(jìn)入插入模式,如圖3.3所示??梢钥闯?,在屏幕底部顯示有“插入”表示插入模式中的輸入狀態(tài),在該模式下可以輸入文字信息。
圖3.3進(jìn)入vi插入模式
(3)最后,在插入模式中,按“Esc”鍵,則當(dāng)前模式轉(zhuǎn)入命令行模式,并在底行行中輸入“:wq”(存盤退出)進(jìn)入底行模式,如圖3.4所示。
這樣,就完成了一個(gè)簡(jiǎn)單的vi操作流程:命令行模式→插入模式→底行模式。由于vi在不同的模式下有不同的操作功能,因此,讀者一定要時(shí)刻注意屏幕最下方的提示,分清所在的模式。
圖3.4進(jìn)入vi底行模式
3.vi的各模式功能鍵(1)命令行模式常見功能鍵如表3.1所示。
表3.1 vi命令行模式功能鍵
功能鍵
功能
i
切換到插入模式,在目前的光標(biāo)所在處插入輸入的文字,已存在的文字會(huì)向后退
a
切換到插入模式,并從目前光標(biāo)所在位置的下一個(gè)位置開始輸入文字
o
切換到插入模式,且從行首開始插入新的一行
[ctrl]+[b]
屏幕往“后”翻動(dòng)一頁(yè)
[ctrl]+[f]
屏幕往“前”翻動(dòng)一頁(yè)
[ctrl]+[u]
屏幕往“后”翻動(dòng)半頁(yè)
[ctrl]+[d]
屏幕往“前”翻動(dòng)半頁(yè)
0(數(shù)字0)
光標(biāo)移到本行的開頭
G
光標(biāo)移動(dòng)到文件的最后
nG
光標(biāo)移動(dòng)到第n行
$
移動(dòng)到光標(biāo)所在行的“行尾”
n<Enter>
光標(biāo)向下移動(dòng)n行
/name
在光標(biāo)之后查找一個(gè)名為name的字符串
?name
在光標(biāo)之前查找一個(gè)名為name的字符串
x
刪除光標(biāo)所在位置的一個(gè)字符
X
刪除光標(biāo)所在位置的前一個(gè)字符
dd
刪除光標(biāo)所在行
ndd
從光標(biāo)所在行開始向下刪除n行
yy
復(fù)制光標(biāo)所在行
nyy
復(fù)制光標(biāo)所在行開始的向下n行
p
將緩沖區(qū)內(nèi)的字符粘貼到光標(biāo)所在位置(與yy搭配)
u
恢復(fù)前一個(gè)動(dòng)作
(2)插入模式的功能鍵只有一個(gè),即按“Esc”鍵可回到命令行模式。
(3)底行模式常見功能鍵如表3.2所示。
表3.2 vi底行模式功能鍵
功能鍵
功能
:w
將編輯的文件保存到磁盤中
:q
退出vi(系統(tǒng)對(duì)做過(guò)修改的文件會(huì)給出提示)
:q!
強(qiáng)制退出vi(對(duì)修改過(guò)的文件不作保存)
:wq
存盤后退出
:w[filename]
另存一個(gè)名為filename的文件
:setnu
顯示行號(hào),設(shè)定之后,會(huì)在每一行的前面顯示對(duì)應(yīng)行號(hào)
:setnonu
取消行號(hào)顯示
注意
vim是vi的升級(jí)版,與vi相比擴(kuò)展了很多功能且保持與vi的90%相兼容,感興趣的讀者可以查看相關(guān)資料進(jìn)行學(xué)習(xí)。
3.2.2初探emacs正如前面所述,vi是一款功能非常強(qiáng)大的編輯器,它能夠方便、快捷、高效地完成用戶的任務(wù),那么,在此再次向讀者介紹另一款編輯器是否多此一舉呢?答案是否定的。因?yàn)閑macs不僅僅是一款功能強(qiáng)大的編譯器,而且是一款融合編輯、編譯、調(diào)試于一體的開發(fā)環(huán)境。雖然,它沒有VisualStudio一樣絢麗的界面,但是它可以在沒有圖形顯示的終端環(huán)境下出色的工作,相信追求強(qiáng)大功能和工作效率的用戶不會(huì)介意它樸素的界面的。emacs的使用和vi截然不同。在emacs里,沒有類似于vi的3種“模式”。emacs只有一種模式,也就是編輯模式,而且它的命令全靠功能鍵完成。因此,功能鍵也就相當(dāng)重要了。
但emacs卻還使用一個(gè)不同vi的“模式”,它的“模式”是指各種輔助環(huán)境。比如,當(dāng)編輯普通文本時(shí),使用的是“文本模式(TextMode)”,而當(dāng)寫程序時(shí),使用的則是如“c模式”、“shell模式”等。
下面,首先介紹一下emacs作為編輯器的使用方法,以幫助讀者熟悉emacs的環(huán)境。
注意
emacs縮寫注釋:
C+<chr>表示按住Ctrl鍵的同時(shí)鍵入字符<chr>。因此,C+f就表示按住Ctrl鍵同時(shí)鍵入f。
M+<chr>表示當(dāng)鍵入字符<chr>時(shí)同時(shí)按住Meta或Edit或Alt鍵(通常為Alt鍵)。
1.emacs安裝現(xiàn)在較新版本的Linux(如本書中所用的RedHatEnterprise4AS)的安裝光盤中一般都自帶有emacs的安裝包,用戶可以通過(guò)安裝光盤進(jìn)行安裝(一般在第2張光盤中)。
2.啟動(dòng)emacs安裝完emacs之后,只需在命令行鍵入“emacs[文件名]”(若缺省文件名,也可在emacs編輯文件后另存時(shí)指定),也可從“編程”→“emacs”打開,如3.5圖所示的就是從“編程”→“emacs”打開的emacs歡迎界面。
圖3.5emacs歡迎界面
接著可單擊任意鍵進(jìn)入emacs的工作窗口,如圖3.6所示。
從圖中可見,emacs的工作窗口分為上下兩個(gè)部分,上部為編輯窗口,底部為命令顯示窗口,用戶執(zhí)行功能鍵的功能都會(huì)在底部有相應(yīng)的顯示,有時(shí)也需要用戶在底部窗口輸入相應(yīng)的命令,如查找字符串等。
圖3.6emacs的工作窗口
3.進(jìn)入emacs在進(jìn)入emacs后,即可進(jìn)行文件的編輯。由于emacs只有一種編輯模式,因此用戶無(wú)需進(jìn)行模式間的切換。下面介紹emacs中基本編輯功能鍵。
(1)移動(dòng)光標(biāo)。
雖然在emacs中可以使用“上”、“下”、“左”、“右”方向鍵來(lái)移動(dòng)單個(gè)字符,但筆者還是建議讀者學(xué)習(xí)其對(duì)應(yīng)功能鍵,因?yàn)樗鼈儾粌H能在所有類型的終端上工作,而且讀者將會(huì)發(fā)現(xiàn)在熟練使用之后,輸入這些Ctrl加字符會(huì)比按方向鍵快很多。表3.3列舉了emacs中光標(biāo)移動(dòng)的常見功能鍵。
表3.3 emacs光標(biāo)移動(dòng)功能鍵
功能鍵
功能
功能鍵
功能
C-f
向前移動(dòng)一個(gè)字符
M-b
向后移動(dòng)一個(gè)單詞
C-b
向后移動(dòng)一個(gè)字符
C-a
移動(dòng)到行首
C-p
移動(dòng)到上一行
C-e
移動(dòng)到行尾
C-n
移動(dòng)到下一行
M-<(M加
“小于號(hào)”)
移動(dòng)光標(biāo)到整個(gè)文本的開頭
M-f
向前移動(dòng)一個(gè)單詞
M->(M加
“大于號(hào)”)
移動(dòng)光標(biāo)到整個(gè)文本的末尾
(2)剪切和粘貼。
在emacs中可以使用“Delete”和“BackSpace”刪除光標(biāo)前后的字符,這和用戶之前的習(xí)慣一致,在此就不贅述。以詞和行為單位的剪切和粘貼功能鍵如表3.4所示。
表3.4 emacs剪切和粘貼
功能鍵
功能
功能鍵
功能
M-Delete
剪切光標(biāo)前面的單詞
M-k
剪切從光標(biāo)位置到句尾的內(nèi)容
M-d
剪切光標(biāo)前面的單詞
C-y
將緩沖區(qū)中的內(nèi)容粘貼到光標(biāo)所在的位置
C-k
剪切從光標(biāo)位置到行尾的內(nèi)容
C-xu
撤銷操作(先操作C+x,接著再單擊u)
注意
在emacs中對(duì)單個(gè)字符的操作是“刪除”,而對(duì)詞和句的操作是“剪切”,即保存在緩沖區(qū)中,以備后面的“粘貼”所用。
(3)復(fù)制文本。
在emacs中的復(fù)制文本包括兩步:選擇復(fù)制區(qū)域和粘貼文本。
選擇復(fù)制區(qū)域的方法是:首先在復(fù)制起始點(diǎn)(A)按下“C-Space”或“C-@(C-Shift-2)”使它成為一個(gè)標(biāo)識(shí)點(diǎn),再將光標(biāo)移至復(fù)制結(jié)束點(diǎn)(B),再按下“M-w”,就可將A與B之間的文本復(fù)制到系統(tǒng)的緩沖區(qū)中。再使用功能鍵C-y將其粘貼到指定位置。
(4)查找文本。
查找文本的功能鍵如表3.5所示。
表3.5 emacs查找文本功能鍵
功能鍵
功能
C-s
查找光標(biāo)以后的內(nèi)容,并在對(duì)話框的“I-search:”后輸入要查找的字符串
C-r
查找光標(biāo)以前的內(nèi)容,并在對(duì)話框的“I-searchbackward:”后輸入要查找的字符串
(5)保存文檔。
在emacs中保存文檔的功能鍵為“C+xC+s”(即先操作C+x,接著再操作C+s),這時(shí),屏幕底下的對(duì)話框會(huì)出現(xiàn)如“Wrote/root/workplace/editor/why”的字樣,如圖3.7所示。
圖3.7emacs中保存文檔
另外,emacs在編輯時(shí)會(huì)為每個(gè)文件提供“自動(dòng)保存(autosave)”的機(jī)制,而且自動(dòng)保存的文件的文件名前后都有一個(gè)“#”,例如,編輯名為“hello.c”的文件,其自動(dòng)保存的文件的文件名就叫“#hello.c#”。當(dāng)用戶正常地保存了文件后,emacs就會(huì)刪除這個(gè)自動(dòng)保存的文件。這個(gè)機(jī)制當(dāng)系統(tǒng)發(fā)生異常時(shí)非常有用。
(6)退出文檔。
在emacs中退出文檔的功能鍵為“C-xC-c”。
4.emacs中的模式emacs不僅僅是個(gè)強(qiáng)大的編譯器,它還是一個(gè)集編譯、調(diào)試等于一體的工作環(huán)境。在這里,讀者將會(huì)了解到emacs作為編譯器的最基本的概念,感興趣的讀者可以參考《LearningGNUEmacs,SecondEdition》一書進(jìn)一步學(xué)習(xí)emacs。
在emacs中并沒有像vi中那樣的“命令行”、“編輯”模式,只有一種編輯模式。這里所說(shuō)的“模式”是指emacs里的各種輔助環(huán)境。下面著重講解C模式。
當(dāng)我們啟動(dòng)某一文件時(shí),emacs會(huì)判斷文件的類型,從而自動(dòng)選擇相應(yīng)的模式。當(dāng)然,用戶也可以手動(dòng)啟動(dòng)各種模式,用功能鍵“M-x”,然后再輸入模式的名稱,如圖3.8所示,這樣就啟動(dòng)了“C模式”。
圖3.8emacs中選擇模式
在強(qiáng)大的C模式下,用戶擁有“自動(dòng)縮進(jìn)”、“注釋”、“預(yù)處理擴(kuò)展”、“自動(dòng)狀態(tài)”等強(qiáng)大功能。在“C模式”下編輯代碼時(shí),可以用“Tab”鍵自動(dòng)地將當(dāng)前行的代碼產(chǎn)生適當(dāng)?shù)目s進(jìn),使代碼結(jié)構(gòu)清晰、美觀,它也可以指定縮進(jìn)的規(guī)則。
源代碼要有良好的可讀性,必須要有良好的注釋。在emacs中,用“M-”可以產(chǎn)生一條右縮進(jìn)的注釋。C模式下是“/*comments*/”形式的注釋,C++模式下是“//comments”形式的注釋。當(dāng)用戶高亮選定某段文本,然后操作“C-cC-c”,就可以注釋該段文字。
emacs還可以使用C預(yù)處理其運(yùn)行代碼的一部分,以便讓程序員檢測(cè)宏、條件編譯以及include語(yǔ)句的效果。
5.emacs編譯調(diào)試程序emacs可以讓程序員在emacs環(huán)境里編譯自己的軟件。此時(shí),編輯器把編譯器的輸出和程序代碼連接起來(lái)。程序員可以像使用Windows的其他開發(fā)工具一樣,將出錯(cuò)位置和代碼定位聯(lián)系起來(lái)。
emacs默認(rèn)的編輯命令是對(duì)一個(gè)make(在本章3.6節(jié)中會(huì)詳細(xì)介紹)的調(diào)用。用戶可以打開“tool”下的“Compile”進(jìn)行查看。emacs可以支持大量的工程項(xiàng)目,以方便程序員的開發(fā)。
另外,emacs為gdb調(diào)試器提供了一個(gè)功能齊全的接口。在emacs中使用gdb的時(shí)候,程序員不僅能夠獲得gdb的全部標(biāo)準(zhǔn)特性,還可以獲得通過(guò)接口增強(qiáng)而產(chǎn)生的其他性能。