在Emacs下用C/C++編程

來源:互聯網
上載者:User
文章目錄
  • 參考文獻:
  • 著作權說明:
  • 編輯環境配置
  • 自動補齊

-->

在Emacs下用C/C++編程著作權說明和參考文獻

按照慣例,我寫的文章在最開始處放著作權說明和參考文獻。

參考文獻:
  • hhuu @ newsmth 的《Emacs的日常生活》
  • emacs 的文檔
  • emacs 相關外掛程式的文檔
著作權說明:

轉載請註明轉自曹樂的個人首頁
www.caole.net,請保證全文轉載,尤其不可省略這一部分。

用emacs寫程式也有5個年頭了,深切地體會到Emacs的強大。程式員有三種,一種是用vi的,一種是用emacs的,還有一種是其他。或許有些誇張,但也頗能體現出emacs在程式員中的地位。

emacs最大的問題在於入門門檻較高。它看起來和多數人想象中的IDE相差甚遠,很多人看到emacs的第一眼就覺得它是個記事本(還是個非常難用的記事本),稍微好些的往往覺得emacs也就是個ultraEditor而已,真是暴殄天物了。

我是個懶人,不喜歡記太多的快速鍵,相信很多人和我一樣。所以從我後面的敘述可以看出來,除了常用的命令都是快速鍵外,其他命令多數都是用M-x執行或者用滑鼠點菜單。這僅僅是個人風格問題,先說明一下。

我的基本編程環境是:

  • Debian GNU/Linux sid 作業系統
  • Gnome 2.10.0 案頭環境
  • GUN Emacs 23.0.0.1 for debian
  • 使用 Gnu tool chains(gcc,make,gdb等等)

後面的敘述都基於上述環境。另外,本文主要針對C/C++程式開發,對其他語言有些也適用,從難度上說,本文主要針對入門者。

本文肯定會有很多錯誤,請指正
,謝謝。

基本流程

寫C++程式基本上是這麼幾個步驟:

  1. 編輯代碼
  2. 編寫Makefile
  3. 編譯代碼,修改編譯錯誤
  4. 調試代碼,修改邏輯錯誤

當然,往往還需要閱讀別人的代碼。

根據上述步驟,本文主要針對以下幾個方面:

  • 配置Emacs,建立便利的代碼編輯環境和Makefile編寫環境。
  • 在Emacs中編譯代碼,並修改編譯錯誤。
  • 在Emacs中配合GDB偵錯工具。
  • 利用cscope和ecb在emacs中閱讀代碼。
基本環境設定編輯環境配置

要寫C++程式,當然要用到cc-mode外掛程式。CC-Mode原本是支援C語言的,但現在也能支援很多語言,比如
C++,Java,Objective-C,CORBA,AWK,Pike等等。CC-Mode是gnu-emacs的標準外掛程式。如果您要求不高,那麼默
認的配置或許就能滿足。CC-Mode的各種行為都可以自由地定製,您可以參考這裡的文檔:CC-Mode參考文檔

這裡是我的.emacs檔案中關於CC-Mode配置的部分,僅供參考:

;;;; CC-mode配置  http://cc-mode.sourceforge.net/(require 'cc-mode)(c-set-offset 'inline-open 0)(c-set-offset 'friend '-)(c-set-offset 'substatement-open 0)
;;;;我的C/C++語言編輯策略(defun my-c-mode-common-hook()  (setq tab-width 4 indent-tabs-mode nil)  ;;; hungry-delete and auto-newline  (c-toggle-auto-hungry-state 1)  ;;按鍵定義  (define-key c-mode-base-map [(control /`)] 'hs-toggle-hiding)  (define-key c-mode-base-map [(return)] 'newline-and-indent)  (define-key c-mode-base-map [(f7)] 'compile)  (define-key c-mode-base-map [(meta /`)] 'c-indent-command);;  (define-key c-mode-base-map [(tab)] 'hippie-expand)  (define-key c-mode-base-map [(tab)] 'my-indent-or-complete)  (define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)

注意一下,上面最後兩行是代碼自動補齊的快速鍵。後面我會提到代碼自動補齊。

  ;;預先處理設定  (setq c-macro-shrink-window-flag t)  (setq c-macro-preprocessor "cpp")  (setq c-macro-cppflags " ")  (setq c-macro-prompt-flag t)  (setq hs-minor-mode t)  (setq abbrev-mode t))(add-hook 'c-mode-common-hook 'my-c-mode-common-hook);;;;我的C++語言編輯策略(defun my-c++-mode-hook()  (setq tab-width 4 indent-tabs-mode nil)  (c-set-style "stroustrup");;  (define-key c++-mode-map [f3] 'replace-regexp))
自動補齊

自動補齊通常用的都是hippie-expand,我也用了很長時間。不過有時候會覺得這個自動補齊“傻”了一點,常會補齊出一些毫不相干的東西,因為hippie-expand是根據你敲過的詞和kill-ring等進行判斷的,並不對程式文法進行分析。

所以你還需要安裝一個程式碼分析工具,然後把它加進hippie-expand的擴充策略裡去。我們可以用semantic。實際上,hippie-expand+semantic是我所發現的最好的選擇了,如果您有更好的,請您也告訴我一聲:)

Semantic是CEDET
中的一個工具,CEDET是Collection of Emacs Development Environment Tools的縮寫,它包含了好幾個工具,都挺不錯的。可惜我只會用其中兩個。

您可以在.emacs中對Semantic進行配置,下面是我的.emacs相關的配置,僅供參考:

匯入cedet:

(load-file "~/lib/emacs-lisp/cedet-1.0pre3/common/cedet.el")

配置Semantic的檢索範圍:

(setq semanticdb-project-roots   (list        (expand-file-name "/")))

自訂自動補齊命令,這部分是抄hhuu的,如果在單詞中間就補齊,否則就是tab。

(defun my-indent-or-complete ()   (interactive)   (if (looking-at "//>")   (hippie-expand nil)   (indent-for-tab-command)) )(global-set-key [(control tab)] 'my-indent-or-complete)

hippie的自動補齊策略,優先調用了senator的分析結果:

(autoload 'senator-try-expand-semantic "senator")(setq hippie-expand-try-functions-list   '(senator-try-expand-semantictry-expand-dabbrevtry-expand-dabbrev-visibletry-expand-dabbrev-all-bufferstry-expand-dabbrev-from-killtry-expand-listtry-expand-list-all-bufferstry-expand-line        try-expand-line-all-buffers        try-complete-file-name-partially        try-complete-file-name        try-expand-whole-kill        ))

注意一下我前面CC-Mode配置中有這麼兩行:

  (define-key c-mode-base-map [(tab)] 'my-indent-or-complete)  (define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)

這樣,我們在CC-Mode中就可以調用自訂的hippie補全了,快速鍵是Tab。

另外,我還把快速鍵“Alt + / ”綁定到了semantic-ia-complete-symbol-menu命令上,這是semantic的命令,它會根據分析結果彈出補齊的菜單,效果顯示:

CEDET中還有一個不錯的工具是speedbar,你可以用它在多個檔案中快速切換。在我的.emacs設定檔裡,我把speedbar關聯到了F5上:

(global-set-key [(f5)] 'speedbar)

這樣用F5就可以調出speedbar,效果如下:

不過說實話,我自己很少用到speedbar,我通常都是用dired配合bookmark使用:)

編譯和偵錯工具

按上面的配置,寫完程式和Makefile檔案後,在Emacs原始碼視窗中按F7就可以進行編譯。因為在my-c-mode-common-hook()函數裡,有這麼一行:

 (define-key c-mode-base-map [(f7)] 'compile)

預設情況下,emacs的compile命令是調用make -k,我把它改成了make。你也可以把它改成其他的,比如gcc之類的。改下面的“make”就行了。

'(compile-command "make")

Emacs會劃分一個窗格顯示編譯的訊息,在編譯結束後,emacs會自動將編譯器的輸出和程式關聯起來,告訴你第幾行的程式有問題。直接在出錯的行號上按Enter,就可以跳轉到相應檔案的相應行。其實我通常都是用滑鼠中鍵去點出錯行號:)

搞定了編譯錯誤後,接著要和邏輯錯誤鬥爭了。其實對簡單的程式來說,把中間結果列印到終端是最簡單好用的調試辦法:)不過稍微複雜點的程式就會暈菜了,這時我們就需要拿gdb跟蹤程式流程了。

你用下面的命令就可以啟動gdb了。

M-x gdb

通常我喜歡進入gdb-many-windows模式,這樣就會把一個Frame劃分為5個窗格,同時顯示:gdb命令視窗,當前局部變數,程式文本,調用棧和斷點。

gdb的命令就不在這裡說了,它的文檔幾乎到處都是。emacs把gdb的命令和快速鍵做了綁定,對於常用的命令,還是輸入快速鍵比較方便。比如,C-c C-n是Next line,C-c C-s是step in,其實用的最多的快速鍵也就是這兩個。

下面是我的gdb:

閱讀代碼

在emacs下讀代碼通常有三種工具,最簡單的是etags,最複雜的是ecb(emacs code browser),位於中間的是cscope。

etags和ctags一樣,只不過前者是用於emacs的,後者是用於vi的。我個人覺得etags功能稍稍顯得不夠用一點,當然,也可能是我用的不好:) 歡迎大牛指導。

使用tags之前要先對原始碼分析建立tags檔案,在代碼所在目錄中運行:etags -R 即可。

我常用的就這幾個命令和快速鍵:

M-x visit-tags-table <RET> FILE <RET>   選擇tags檔案M-. [TAG] <RET>                         訪問標籤M-*                                     返回C-u M-.                                 尋找標籤的下一個定義

ecb據說功能強大,但是太複雜了,我懶得折騰它。誰搞定了教教我吧:) 下面是一張ecb的。

cscope是我感覺比較合適的一個工具。它其實是一個獨立的軟體,完全可以脫離vi和emacs使用。但是結合emacs的強大功能,cscope就顯
得更加方便了。GNU Emacs預設內建cscope的支援。在使用之前,cscope也需要對代碼進行索引。在emacs中可以這樣做:

C-c s a             設定初始化的目錄,一般是你代碼的根目錄C-s s I             對目錄中的相關檔案建立列表並進行索引

建完索引之後,你就可以用cscope在代碼裡遊盪了。常用的一些命令如下:

C-c s s             序找符號C-c s g             尋找全域的定義C-c s c             看看指定函數被哪些函數所調用C-c s C             看看指定函數調用了哪些函數C-c s e             尋找RegexC-c s f             尋找檔案C-c s i             看看指定的檔案被哪些檔案include

上面這些快速鍵其實我自己也常常記不全,沒關係,抬頭看看上面的功能表列,有一欄就是Cscope,這些命令裡頭都有:)

貼一個cscope的吧:

寫完了。希望這篇文章對您能有一些用處。有問題或建議可以和我
聯絡。

Updated: 2006-12-26
Index

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.