久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔

Emacs/在Emacs下用C/C++編程

來自站長百科
Jiaomh討論 | 貢獻(xiàn)2010年11月3日 (三) 11:03的版本
(差異) ←上一版本 | 最后版本 (差異) | 下一版本→ (差異)
跳轉(zhuǎn)至: 導(dǎo)航、? 搜索

Emacs本身的功能非常的強(qiáng)大。程序員有三種,一種是用vi的,一種是用emacs的,還有一種是其他?;蛟S有些夸張,但也頗能體現(xiàn)出emacs在程序員中的地位。

概述[ ]

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

本例基本編程環(huán)境是:

  • Debian GNU/Linux sid 操作系統(tǒng)
  • Gnome 2.10.0 桌面環(huán)境
  • GUN Emacs 23.0.0.1 for debian
  • 使用 Gnu tool chains(gcc,make,gdb等等)

后面的敘述都基于上述環(huán)境。另外,本文主要針對(duì)C/C++程序開發(fā),對(duì)其他語言有些也適用。

基本流程[ ]

寫C++程序基本幾個(gè)步驟:

  • 編輯代碼
  • 編寫Makefile
  • 編譯代碼,修改編譯錯(cuò)誤
  • 調(diào)試代碼,修改邏輯錯(cuò)誤

當(dāng)然,往往還需要閱讀別人的代碼。

根據(jù)上述步驟,本文主要針對(duì)以下幾個(gè)方面:

  • 配置Emacs,建立便利的代碼編輯環(huán)境和Makefile編寫環(huán)境。
  • 在Emacs中編譯代碼,并修改編譯錯(cuò)誤。
  • 在Emacs中配合GDB調(diào)試程序。
  • 利用cscope和ecb在emacs中閱讀代碼。

基本環(huán)境設(shè)置[ ]

編輯環(huán)境配置[ ]

要寫C++程序,當(dāng)然要用到cc-mode插件。CC-Mode原本是支持C語言的,但現(xiàn)在也能支持很多語言,比如 C++,Java,Objective-C,CORBA,AWK,Pike等等。CC-Mode是gnu-emacs的標(biāo)準(zhǔn)插件。如果您要求不高,那么默認(rèn)的配置或許就能滿足。CC-Mode的各種行為都可以自由地定制.

這里本例的.emacs文件中關(guān)于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)

注意一下,上面最后兩行是代碼自動(dòng)補(bǔ)齊的快捷鍵。

;;預(yù)處理設(shè)置
(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)
)

自動(dòng)補(bǔ)齊[ ]

自動(dòng)補(bǔ)齊通常用的都是hippie-expand。不過有時(shí)候會(huì)覺得這個(gè)自動(dòng)補(bǔ)齊“傻”了一點(diǎn),常會(huì)補(bǔ)齊出一些毫不相干的東西,因?yàn)閔ippie-expand是根據(jù)你敲過的詞和kill-ring等進(jìn)行判斷的,并不對(duì)程序語法進(jìn)行分析。

所以你還需要安裝一個(gè)代碼分析工具,然后把它加進(jìn)hippie-expand的擴(kuò)展策略里去。我們可以用semantic。

Semantic是CEDET 中的一個(gè)工具,CEDET是Collection of Emacs Development Environment Tools的縮寫,它包含了好幾個(gè)工具,都挺不錯(cuò)的。

您可以在.emacs中對(duì)Semantic進(jìn)行配置,下面是本例的.emacs相關(guān)的配置,僅供參考:

導(dǎo)入cedet:

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

配置Semantic的檢索范圍:

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

自定義自動(dòng)補(bǔ)齊命令,如果在單詞中間就補(bǔ)齊,否則就是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的自動(dòng)補(bǔ)齊策略,優(yōu)先調(diào)用了senator的分析結(jié)果:

(autoload 'senator-try-expand-semantic "senator")
 
(setq hippie-expand-try-functions-list
      '(
        senator-try-expand-semantic
        try-expand-dabbrev
        try-expand-dabbrev-visible
        try-expand-dabbrev-all-buffers
        try-expand-dabbrev-from-kill
        try-expand-list
        try-expand-list-all-buffers
        try-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)

這樣,我們?cè)贑C-Mode中就可以調(diào)用自定義的hippie補(bǔ)全了,快捷鍵是Tab。

另外還把快捷鍵“Alt + / ”綁定到了semantic-ia-complete-symbol-menu命令上,這是semantic的命令,它會(huì)根據(jù)分析結(jié)果彈出補(bǔ)齊的菜單,效果如下圖顯示:

Thumbs semantic-ia.jpg

CEDET中還有一個(gè)不錯(cuò)的工具是speedbar,你可以用它在多個(gè)文件中快速切換。在本例的.emacs配置文件里,把speedbar關(guān)聯(lián)到了F5上:

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

這樣用F5就可以調(diào)出speedbar,效果如下:

Thumbs speedbar.jpg

編譯和調(diào)試程序[ ]

按上面的配置,寫完程序和Makefile文件后,在Emacs源代碼窗口中按F7就可以進(jìn)行編譯。因?yàn)樵趍y-c-mode-common-hook()函數(shù)里,有這么一行:

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

默認(rèn)情況下,emacs的compile命令是調(diào)用make -k,本例把它改成了make。你也可以把它改成其他的,比如gcc之類的。改下面的“make”就行了。

'(compile-command "make")

Emacs會(huì)劃分一個(gè)窗格顯示編譯的消息,在編譯結(jié)束后,emacs會(huì)自動(dòng)將編譯器的輸出和程序關(guān)聯(lián)起來,告訴你第幾行的程序有問題。直接在出錯(cuò)的行號(hào)上按Enter,就可以跳轉(zhuǎn)到相應(yīng)文件的相應(yīng)行。其實(shí)我通常都是用鼠標(biāo)中鍵去點(diǎn)出錯(cuò)行號(hào):)

搞定了編譯錯(cuò)誤后,接著要和邏輯錯(cuò)誤斗爭了。其實(shí)對(duì)簡單的程序來說,把中間結(jié)果打印到終端是最簡單好用的調(diào)試辦法:)不過稍微復(fù)雜點(diǎn)的程序就會(huì)暈菜了,這時(shí)我們就需要拿gdb跟蹤程序流程了。

你用下面的命令就可以啟動(dòng)gdb了。

M-x gdb

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

下面是本例的gdb效果圖:

Thumbs gdb.jpg

閱讀代碼[ ]

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

etags和ctags一樣,只不過前者是用于emacs的,后者是用于vi的。

使用tags之前要先對(duì)源代碼分析建立tags文件,在代碼所在目錄中運(yùn)行:etags -R 即可。

參考來源[ ]

參考來源

Emacs使用手冊(cè)導(dǎo)航

Emacs安裝

Emacs安裝

Emacs使用

Emacs快捷鍵 | Windows下設(shè)置Emacs的HOME目錄 | 自定義Emacs工具欄 | 在Emacs下用C、C++編程 | Emacs中的TeX排版系統(tǒng) | 智能的啟動(dòng)Emacs

Emacs插件

EDIFF | Eshell | Color-theme | Tabbar | ECB | VisEmacs | Ange-FTP

Emacs其他

Emac定制 | 國際化以及版權(quán)