GNU/Linux實戰手記之Emacs篇 下——Emacs是個IDE (轉)

gugu99發表於2007-08-16
GNU/Linux實戰手記之Emacs篇 下——Emacs是個IDE (轉)[@more@]

【/實戰手記之Emacs篇 下——Emacs是個】
作者:葉魏彬 :fritz_yea@hot.com
Copyright(C)Free Software Library,Org()
本文依照GNU Free Document Lience釋出,任何人都可以將本文原封不動的複製、轉載,但請務必保留此宣告。作者不對本文所導致的任何結果負責。

十、定製你的Emacs
  其實,有關Emacs的爭論一直沒有停息過。有人堅持Emacs是個龐大的史前生物,也有人堅持Emacs是神造的萬能工具。總之,一切都是圍繞著它的複雜性而論。毋庸置疑的,單作為一個文字編輯器而言,Emacs的確是太龐大了(它足有70多兆!)。但是,如果把Emacs視為一個環境(它也的確是一個環境),則它是非常優秀的,70兆的體積也就不算什麼了。作為普通,我不推薦你去使用Emacs,vi就可以了--但我不併不是在貶低vi,相反,vi同樣是令我們尊敬的一個優秀的編輯器--它將複雜性隱藏在了幕後,透過各種命令實現,而這些命令我們也許永遠也用不到,所以我們不必去理睬它,它就是一個小巧、簡潔和直觀的文字編輯器。但是如果你是一個員,或是管理員,你所關心的就不會是絢麗的介面,而是強大的功能和工作的。而這就是Emacs能帶給你的。平心而論,Emacs並不比我們平常所慣用的其他編輯器,如UltraEdit、TextPad、EmEditor等難用多少,只是我們在使用Emacs的時候,要從新適應Emacs定義的罷了。而正是這一點,給許多淺嘗輒止的人眼前蒙上了一層紗,他們也就以訛傳訛,大肆宣揚起Emacs的“複雜”來。其實,一旦你熟悉了它的快捷鍵,你就能像用其它一樣自如。
  (如果你只是為了寫幾個字,你會固執的堅持使用嗎?如果你要寫C/C++程式,你會用Word嗎?要是我,我寧可用notepad。當我初次接觸的時候,我還是在黑底白字的DOS時代。我曾為Turbo C裡的IDE環境驚歎不已。那時的剪貼、貼上的快捷鍵是Ctrl-Ins、Shift-Ins,刪除一行是Ctrl-y,直到現在我還忍不住想用Ctrl-y來刪除一行。其實統一軟體快捷鍵的不是MS,而是WordPerfect,正是因為它的流行,使得之後的軟體都紛紛效仿它,以增加親和力。F1代表“幫助”就是它最先使用的。所以不要再抱怨Emacs的快捷鍵了。Emacs可以在沒有圖形顯示的終端環境下出色的工作,和它在X下一模一樣。UltraEdit可以嗎?)
  廢話少說,言歸正傳。我們的目的是定製我們的工作環境,使之最適合我們的工作。因此,我們必須首先澄清一些概念。
緩衝區(Buffer)
  緩衝區(Buffer)的概念聽起來很玄,其實就是一塊用來儲存我們輸入的東西的區域,你可以把它理解為。在Emacs裡,一切都是在記憶體中進行,直到你按下C-x C-s來儲存,你的檔案才會被改變。這是一個普遍的文字儲存策略,幾乎所有的文字編輯器都是這樣工作的。
視窗(Frame)
  視窗(Frame)不是Window,它是指你所編輯的文字被顯示的區域。這一點類似於你在UltraEdit裡開啟的各個檔案所在的小視窗。
(mode)
  模式(mode)是Emacs裡最重要的概念,Emacs的強大功能基本上都是由各種模式提供的。常用的有C/C++模式、模式、模式、SGML/HTML模式等等。

  基於上面的概念,讓我們來逐步研究Emacs的IDE環境

10.1、檔案,緩衝區和視窗
  首先,我們可以在Emacs裡同時編輯多個檔案。你隨時可以使用C-x C-f來開啟(或者建立)檔案。但是預設情況是,編輯器自動進入到新的檔案視窗中(所有的編輯器都這樣)。如果我們希望同時看到兩個檔案(比如比對兩個檔案),我們就必須首先對視窗進行分割。使用C-x 2對視窗進行水平分割。分割完畢後你會失望的發現,兩個視窗裡的內容竟然完全一樣(包括你對任一視窗的修改,都會同步顯示在另一個視窗中)!是的,我們只是分割了視窗,但是並沒有切換緩衝區,因此依舊是顯示原來緩衝區的內容。使用C-x o切換到你想去的視窗,然後在緩衝區列表(C-x C-b)裡選擇目標檔案。這樣你就可以在同一屏終審視兩個檔案了。
  你也可以用C-x 3垂直分割螢幕,分成左右兩個區域。視窗理論上可以無限分割,只要你覺得分那麼多的小視窗有意義(試試看,連Emacs都會覺得你這樣做很愚蠢),因此你完全可以將螢幕分割成倒“品”字形,只需依次按下C-x 2、C-x 3即可。
  視窗和緩衝區的概念是完全不同的,因此我們可以“關閉”視窗,而非“關閉”緩衝區,讓它暫時從我們的視線裡消失。這相當於圖形環境下的“最小化視窗”。使用C-x 0關閉當前視窗,使用C-x 1關閉當前視窗以外的其他視窗。

  下面的這個列表很直觀的顯示了對視窗和緩衝區的鍵盤操作:
-------------------------------------------------------------------------------------------------------
視窗操作:

功能鍵  功能
C-x 0  刪除當前視窗,對緩衝區無影響。注意這裡是數字0。  (最小化當前視窗)
C-x 1  刪除當前以外的所有視窗,對緩衝區無影響。  (最小化其他視窗)
C-x 2  水平分割當前視窗。
C-x 3  垂直分割當前視窗。
C-x o  切換視窗(當且僅當有一個以上的視窗存在)。注意這裡是字母o。

緩衝區操作:

功能鍵  功能
C-x C-f  開啟(建立)檔案,建立一個新的緩衝區。
C-x C-s  儲存當前緩衝區到檔案。
C-x C-w  儲存當前緩衝區到其他檔案(檔案另存為)。
C-x k  關閉當前緩衝區。
C-x C-b  緩衝區列表。你可以用方向鍵來選擇要切換的緩衝區。
C-x C-c  關閉所有的緩衝區,退出Emacs。

-------------------------------------------------------------------------------------------------------

10.2、模式
  接下來我們看看Emacs裡的模式(Mode)。
  在Emacs裡,無論何時編輯一個檔案,都要使用一個特定的模式(Mode)。Emacs裡的“模式”不同於vi裡的“模式”。vi裡分“命令”和“編輯”兩種模式,而Emacs裡只有一種模式,就是編輯模式,Emacs裡的命令全靠功能鍵完成。但是我說的“模式”不是指這個模式,而是指Emacs裡的各種輔助環境。當我們編輯普通文字時,用的是“文字模式(Txt Mode)”,而當我們寫程式時,比如前面的Bash指令碼,用的則是“Shell(bash)模式”。
  當我們啟動某一檔案時,Emacs會判斷檔案的型別,從而自動選擇相應的模式。當然,我們也可以手動啟動各種模式。先按M-x,然後輸入模式的名稱。比如啟動“C模式”,就是M-x c-mode。直接按下M-x,然後按兩下Tab鍵,你將得到所有可的命令,這裡面當然包括所有的模式。因此,你要想不起來某個命令的名稱,就用這個方法。

10.2.1、C模式
  在強大的C模式下,我們擁有“自動縮排”、“註釋”、“預處理擴充套件”、“自動狀態”等強大功能。
  當我們在“C模式”下編輯程式碼的時候,可以用Tab鍵自動的將當前行的程式碼產生適當的縮排,使程式碼結構清晰、美觀。我們也可以指定縮排的規則。Emacs支援的縮排規則有:、cc-mode、ellemtel、gnu、、k&r、linux、、stroustrup、user、whitesmith,透過M-x c-set-style命令指定。
  要有良好可讀性,必須要有良好的註釋。用M-;可以產生一條右縮排的註釋。C模式下是“/* comments */”形式的註釋,C++模式下是“// comments”形式的註釋。當我們高亮選定某段文字,然後按C-c C-c,就可以把這段文字給註釋掉。
  Emacs可以使用C預處理其執行程式碼的一部分,以便讓程式設計師檢測宏、條件編譯以及include語句的效果。比如想象下面的這種情況:
  1、在頂層視窗輸入看到的程式碼。
  2、高亮顯示一個區域。
  3、按C-c C-e宏擴充套件。也可以從選單C中選擇 Macro Expand Region。
  Emacs將創間諜熱視窗,顯示宏擴充套件的結果。
  Emacs中的C環境還有許多特性,可以幫助程式設計師加速開發過程。執行在自動狀態下的時候,且程式設計師輸入程式碼的時候,C環境會自動地插入新行、處理縮排並完成其他相關任務。在許多情況下,時都不用按EnteAr鍵,系統會自動處理。
  按C-c C-a或者執行M-x c-toggle-auto-stat,就可以開啟自動模式。在這種模式下敲擊鍵盤時,程式設計師會注意到無論何時,只要輸入分號,編輯器就會自動把游標定位到下一行,並自動縮排。最終程式碼看起來好像沒有使用自動模式一樣;它只是減少了程式設計師建立檔案敲擊鍵盤的次數。
  如果想要關閉自動模式,只需要按C-c C-a或者執行M-x c-toggle-auto-state,系統將恢復一般狀態。

10.2.2、編譯程式
  Emacs可以讓程式設計師在Emacs環境裡編譯自己的軟體。這樣做的時候,編輯器把的輸出和程式程式碼連線起來。這意味著程式設計師只需要單擊出錯的命令(按個回車),就可以立刻定位那些警告和錯誤資訊。
  可以在Tools選單裡找到這些選項。在從選單中選擇Compile時,Emacs要求輸入編譯命令。如果有一個Make檔案,可以接受預設設定。否則,程式設計師必須為正確編譯程式而填寫編譯命令列。
  如果在編譯時遇到錯誤或警告,Emacs將在分開的視窗中顯示它們。
  此時用Enter單擊錯誤資訊,就可以直接跳到發生錯誤的原始碼處。有時,在輸出視窗重將有幾百條警告資訊;直接跳到出錯的地方,可大量的節省時間。
  正如你看到的,預設的編輯命令是對一個make的呼叫。Emacs可以完美使用make並處理大量檔案,對Emacs是否能支援大的工程專案的擔心,是完全沒有必要的。

10.2.3、
  許多整合的開發環境提供一個偵錯程式。雖然多數只是一個有限的偵錯程式,但是Emacs為g偵錯程式提供了一個功能齊全的藉口。
  在Emacs中使用gdb的時候,程式設計師能獲得gdb在其他任何方式執行時所具有的全部標準特性。但是還是包括了一些透過介面增強而獲得的其他。
  在Emacs中使用gdb除錯程式,可以觀察自己的程式碼是如何從頭到尾執行的。這個選項比預設的gdb操作更容易使用,預設的操作只是顯示的指令。
  此外,由於可以直接在Emacs中重新編譯偵錯程式執行在緩衝器內的程式碼,在偵錯程式內對程式碼進行改動、重新編譯和執行是簡單的方法。
  為了在Emacs裡呼叫偵錯程式,在Tools選單中選擇gdb,會出現系統提示,要求輸入可執行檔案以便進行除錯。當輸入了名字時,gdb被呼叫。最初將看到一個和標準gdb一樣的視窗。在程式的適當地方設定斷點後執行程式,原始碼視窗將會有=>標記指向斷點位置的程式碼並高亮顯示。gdb視窗將不再顯示程式碼。
  在gdb視窗中,可以使用所有的常用gdb命令。在Emacs中使用gdb,程式設計師必須要學習任何新的命令。
10.2.3、使用標記
  Emacs的另外一個強大的功能是使用標記(tag)的能力。根據標記,編輯器可以區分哪些檔案屬於同一個專案。更重要的是,標記還能準確指出每個檔案都包含了什麼。比如在C程式中,標記指出那個檔案包含了特定的。當編譯檔案的時候,可以直接跳到任何函式所在——而不管檔案的路徑。此外,可以對一組檔案而不僅僅對當前檔案使用命令。比如,一個搜尋命令可以對一組檔案起作用。
  為了提供這個功能,Emacs需要分析檔案,並且儲存將要被使用到的標記資訊。一般而言,實現這種功能要使用一個叫TAGS的檔案。在命令列中執行etags程式建立這個檔案,並且給它需要的檔名字。例如:
  $etags *.c
  etags程式分析原始碼,併產生一個TAGS檔案,便於以後在Emacs中使用。
  現在,可以在Tools選單中使用Tags選項,對檔案進行操作。可以使用Find Tag(M-.)來看看到底發生了些什麼。比如,輸入一個函式的名字,Emacs將直接跳到包含該函式的檔案,如果需要則帶開該檔案,並且定位游標於該函式的第一行;如果該函式在一個以上的檔案中出現,就可以使用M-,繼續搜尋其他的檔案。
10.3、在Emacs裡用Shell
  Emacs獨一無二的地方就在於它可以在內部執行shell。Emacs裡的Shell與普通的Shell沒有區別,我們編寫的shell指令碼可以直接執行測試,而不必退出Emacs。但是,在Emacs的shell環境下,不能執行某些需要對控制檯進行控制的程式,比如mc。這是我們可以用term模式代替,只需執行M-x term-mode命令。
  我們已經在前面體驗過Emacs裡的shell了,我就不再重複了。
10.4、其他,但不是雞肋
  Emacs整合了全球資訊網、閱讀器、、、新聞組閱讀器、版本控制系統等等。實在是太多了,我在這裡肯定無法一一談到。學習Emacs的最好方法就是“看書+實踐”,我就是這麼學習Emacs的。多多摸索,你也可以成為Emacs高手。征服Emacs並不是“不可完成的使命”。
10.5、累了,玩玩遊戲吧
  F10->Tools->Games,盡情娛樂吧,我們的宗旨是——勞逸結合。

【GNU/Linux實戰手記】到此就全部結束了。我希望這短短的五篇文章能起到點作用,這樣也不妄費我痛苦的敲鍵盤。感謝大家的閱讀。:)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-960899/,如需轉載,請註明出處,否則將追究法律責任。

相關文章