<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專(zhuān)欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評(píng)論 - 101, 引用 - 0
    數(shù)據(jù)加載中……

    在Emacs下用C/C++編程

    版權(quán)說(shuō)明和參考文獻(xiàn)

    按照慣例,我寫(xiě)的文章在最開(kāi)始處放版權(quán)說(shuō)明和參考文獻(xiàn)。

    參考文獻(xiàn):

    • hhuu @ newsmth 的《Emacs的日常生活》
    • emacs 的文檔
    • emacs 相關(guān)插件的文檔

    版權(quán)說(shuō)明:

    轉(zhuǎn)載請(qǐng)注明轉(zhuǎn)自 曹樂(lè)的個(gè)人主頁(yè) www.caole.net,請(qǐng)保證全文轉(zhuǎn)載,尤其不可省略這一部分。

    用emacs寫(xiě)程序也有5個(gè)年頭了,深切地體會(huì)到Emacs的強(qiáng)大。程序員有三種,一種是用vi的,一種是用emacs的,還有一種是其他。或許有些夸張,但也頗能體現(xiàn)出emacs在程序員中的地位。

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

    我是個(gè)懶人,不喜歡記太多的快捷鍵,相信很多人和我一樣。所以從我后面的敘述可以看出來(lái),除了常用的命令都是快捷鍵外,其他命令多數(shù)都是用M-x執(zhí)行或者用鼠標(biāo)點(diǎn)菜單。這僅僅是個(gè)人風(fēng)格問(wèn)題,先說(shuō)明一下。

    我的基本編程環(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++程序開(kāi)發(fā),對(duì)其他語(yǔ)言有些也適用,從難度上說(shuō),本文主要針對(duì)入門(mén)者。

    本文肯定會(huì)有很多錯(cuò)誤, 請(qǐng)指正 ,謝謝。

    基本流程

    寫(xiě)C++程序基本上是這么幾個(gè)步驟:

    1. 編輯代碼
    2. 編寫(xiě)Makefile
    3. 編譯代碼,修改編譯錯(cuò)誤
    4. 調(diào)試代碼,修改邏輯錯(cuò)誤

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

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

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

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

    編輯環(huán)境配置

    要寫(xiě)C++程序,當(dāng)然要用到cc-mode插件。CC-Mode原本是支持C語(yǔ)言的,但現(xiàn)在也能支持很多語(yǔ)言,比如C++,Java,Objective-C,CORBA,AWK,Pike等等。CC-Mode是gnu-emacs的標(biāo)準(zhǔn)插件。如果您要求不高,那么默認(rèn)的配置或許就能滿(mǎn)足。CC-Mode的各種行為都可以自由地定制,您可以參考這里的文檔: 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++語(yǔ)言編輯策略
    
    (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ǔ)齊的快捷鍵。后面我會(huì)提到代碼自動(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++語(yǔ)言編輯策略
    (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,我也用了很長(zhǎng)時(shí)間。不過(guò)有時(shí)候會(huì)覺(jué)得這個(gè)自動(dòng)補(bǔ)齊“傻”了一點(diǎn),常會(huì)補(bǔ)齊出一些毫不相干的東西,因?yàn)閔ippie-expand是根據(jù)你敲過(guò)的詞和kill-ring等進(jìn)行判斷的,并不對(duì)程序語(yǔ)法進(jìn)行分析。

    所以你還需要安裝一個(gè)代碼分析工具,然后把它加進(jìn)hippie-expand的擴(kuò)展策略里去。我們可以用semantic。實(shí)際上,hippie-expand+semantic是我所發(fā)現(xiàn)的最好的選擇了,如果您有更好的,請(qǐng)您也告訴我一聲:)

    Semantic是 CEDET 中的一個(gè)工具,CEDET是Collection of Emacs Development Environment Tools的縮寫(xiě),它包含了好幾個(gè)工具,都挺不錯(cuò)的。可惜我只會(huì)用其中兩個(gè)。

    您可以在.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ǔ)齊命令,這部分是抄h(huán)huu的,如果在單詞中間就補(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ǔ)齊的菜單,效果如圖顯示:

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

    				(global-set-key [(f5)] 'speedbar)
    
    		
    這樣用F5就可以調(diào)出speedbar,效果如下:

    不過(guò)說(shuō)實(shí)話(huà),我自己很少用到speedbar,我通常都是用dired配合bookmark使用:)

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

    按上面的配置,寫(xiě)完程序和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之類(lèi)的。改下面的“make”就行了。

    				'(compile-command "make")
    
    		

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

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

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

    				M-x gdb
    
    		

    通常我喜歡進(jìn)入gdb-many-windows模式,這樣就會(huì)把一個(gè)Frame劃分為5個(gè)窗格,同時(shí)顯示:gdb命令窗口,當(dāng)前局部變量,程序文本,調(diào)用棧和斷點(diǎn)。

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

    下面是我的gdb效果圖:

    閱讀代碼

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

    etags和ctags一樣,只不過(guò)前者是用于emacs的,后者是用于vi的。我個(gè)人覺(jué)得etags功能稍稍顯得不夠用一點(diǎn),當(dāng)然,也可能是我用的不好:) 歡迎大牛指導(dǎo)。

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

    我常用的就這幾個(gè)命令和快捷鍵:

    				M-x visit-tags-table <RET> FILE <RET>   選擇tags文件
    M-. [TAG] <RET>                         訪問(wèn)標(biāo)簽
    M-*                                     返回
    C-u M-.                                 尋找標(biāo)簽的下一個(gè)定義
    
    		

    ecb據(jù)說(shuō)功能強(qiáng)大,但是太復(fù)雜了,我懶得折騰它。誰(shuí)搞定了教教我吧:) 下面是一張ecb的效果圖。

    cscope是我感覺(jué)比較合適的一個(gè)工具。它其實(shí)是一個(gè)獨(dú)立的軟件,完全可以脫離vi和emacs使用。但是結(jié)合emacs的強(qiáng)大功能,cscope就顯得更加方便了。GNU Emacs默認(rèn)自帶cscope的支持。在使用之前,cscope也需要對(duì)代碼進(jìn)行索引。在emacs中可以這樣做:

    				C-c s a             設(shè)定初始化的目錄,一般是你代碼的根目錄
    C-s s I             對(duì)目錄中的相關(guān)文件建立列表并進(jìn)行索引
    
    		

    建完索引之后,你就可以用cscope在代碼里游蕩了。常用的一些命令如下:

    				C-c s s             序找符號(hào)
    C-c s g             尋找全局的定義
    C-c s c             看看指定函數(shù)被哪些函數(shù)所調(diào)用
    C-c s C             看看指定函數(shù)調(diào)用了哪些函數(shù)
    C-c s e             尋找正則表達(dá)式
    C-c s f             尋找文件
    C-c s i             看看指定的文件被哪些文件include
    
    		

    上面這些快捷鍵其實(shí)我自己也常常記不全,沒(méi)關(guān)系,抬頭看看上面的菜單欄,有一欄就是Cscope,這些命令里頭都有:)

    貼一個(gè)cscope的效果圖吧:

    寫(xiě)完了。希望這篇文章對(duì)您能有一些用處。有問(wèn)題或建議可以和 聯(lián)系。

    posted on 2006-07-28 23:23 weidagang2046 閱讀(879) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Linux

    主站蜘蛛池模板: 在线观看视频免费完整版| 亚洲制服丝袜中文字幕| 青青青国产免费一夜七次郎| a级毛片无码免费真人久久| 亚洲欧美国产精品专区久久| 亚洲视频小说图片| 亚洲国产综合无码一区| 亚洲福利视频一区二区| 免费看少妇作爱视频| 国产人在线成免费视频| 亚洲黄色免费网站| 无码精品一区二区三区免费视频| free哆拍拍免费永久视频| 国产天堂亚洲精品| 国产亚洲欧美日韩亚洲中文色| 亚洲日本国产综合高清| 亚洲香蕉在线观看| 亚洲中文无码a∨在线观看| 亚洲色成人网一二三区| 亚洲伊人tv综合网色| 亚洲最大福利视频网站| 亚洲AV第一页国产精品| 亚洲AV区无码字幕中文色| 久久精品夜色国产亚洲av| 亚洲中文字幕无码一区二区三区| 亚洲成人影院在线观看| 亚洲精品第一国产综合境外资源| 国产又大又长又粗又硬的免费视频| 无码日韩人妻av一区免费| 免费无码A片一区二三区| 日韩毛片免费无码无毒视频观看| 成人免费福利视频| 99热在线精品免费全部my| 一个人免费观看视频www| 久久久久国色AV免费看图片| 国产精品视频免费一区二区| 免费被黄网站在观看| 国产乱色精品成人免费视频| 亚洲AV伊人久久青青草原 | 亚洲中文字幕久久精品无码2021| 亚洲欧洲综合在线|