在Emacs中用C/C++编程[原创 by
lertsau]
有些图片没法转过来,大家可以到我的主页去看。 主要是给emacs入门程序员的文章,欢迎拍砖。 文章链接:http://www./diary/emacs_write_cpp.html 下面是无图片版。 ------------------------------------- 在Emacs下用C/C++编程 版权说明和参考文献 按照惯例,我写的文章在最开始处放版权说明和参考文献。 参考文献: * hhuu @ newsmth 的《Emacs的日常生活》 * emacs 的文档 * emacs 相关插件的文档 版权说明: 转载请注明转自曹乐的个人主页 www.,请保证全文转载,尤其不可省略这一部分。 序 用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./ (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-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) 这样,我们在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 寻找正则表达式 C-c s f 寻找文件 C-c s i 看看指定的文件被哪些文件include 上面这些快捷键其实我自己也常常记不全,没关系,抬头看看上面的菜单栏,有一栏就是Cscope,这些命令里头都有:) 贴一个cscope的效果图吧: 写完了。希望这篇文章对您能有一些用处。有问题或建议可以和我联系。 在Emacs下编辑C++ 做为嵌入式软件开发者,我想许多人会和我一样,在选择开发工具时徘徊过。因为嵌入式软件的开发和PC上的软件开发很不一样。特别是
Windows软件开发时,可以有许许多多的集成开发环境可以选择。有时候甚至是不需要思考的选择。比如你要开发MFC程序,那么你的选择只有VC++。
嵌入式开发还有一个特点,就是开发环境经常会发生改变。这个项目在windows下开发,下一个项目可能就转向Linux了。因此,我这里要选
择的是一个在Windows和Linux下使用方式保持一致的开发工具。因为你一旦熟悉了一种开发环境,你就可以高效的进行代码开发。
摆在眼前的,有两个非常优秀的IDE:eclipse和emacs。这两者都是跨平台的。而且这两者在世界范围内有着十分广泛的使用者。我的选择是emacs。当然,并不是说eclipse不好。因为我不是很了解eclipse,也暂时没有时间去学。
本文主要教你一步步搭建强大而方便的emacs开发环境,针对C/C++语言和Windows操作系统。Linux下搭建方法类似,并且更为方便,因为一般的Linux发行版都带有emacs。
获得emacs
emacs有两种主流版本,一个是Gnu emacs,一个是Xemacs。其中Gnu emacs使用者较多,我们一般说的emacs就是GNU
emacs。以下说到的emacs就默认是Gnu emacs了。
emacs的官方网站是:http://www./software/emacs/ 在这个网站上,你可以下载到各个平台的最新稳定版的emacs,包括windows和linux。在我写这段文字的时候,emacs最新稳定版
是21.4。然而,正在开发中的cvs版中有许多我们非常感兴趣的新特性。一个是我们期待已久的unicode的支持,一个是我们同样期待已久的GTK2
的支持。而且就我使用而言,最新的CVS版已经相当的稳定。那么我们是不是必须用CVS工具提取CVS代码然后自己编译生成emacs可执行程序呢?不
用!有一个叫做ntemacs的项目已经帮我们做了这个工作了。
ntemacs的官方网站是:http://www.ntemacs.
下载最新的ntemacs,将其解压到任意一个目录就可以使用了。运行emacs的脚本是
bin/runemacs.bat。你可以将这个脚本创建一个快捷方式到sendto文件 夹。
还有一个可供选择的emacs的windows版本是winmacs。他的下载地址是http:///projects/winmacs。这个版本有一个问题,你必须设置HOME系统变量,将其设置为c:\
获得辅助插件
纯粹的emacs已经足够强大,借助其cc-mode已经可以进行C/C++开发。但是我们前面说过,要进行高效的开发。那么,我们需要一些辅助的“插件”。
cscope:这是一个可以使emacs实现类似source
insight那种符号查找等功能的软件。它最常用的功能就是找到任何一个变量、函数、结构体等是在哪里被定义,被引用的。cscope的官方网站在http://cscope./。
这里可以下载到cscope的源码,源码中有一个叫做xcscope的目录,将其拷贝到你emacs的site-lisp目录下。xcscope是
lisp脚本,它是与平台无关的语言。然而,这个脚本依赖cscope可执行文件。但cscope是不能直接在windows下运行的。我在网上找了很
久,终于在一个俄罗斯网站上找到了cscope的windows编译。这个网站是:http://iamphet./cscope/index.html。下载后将cscope.exe解压到emacs的bin目录下即可。
cedet+ecb:这两个“插件”无比强大,专门为emacs作为IDE而设计的。我现在只使用了其中很小一部分功能,就领略到了它带给我的高效。官方网站:http://ecb./ ; http://cedet./。下载这两个插件,和xcscope一样,复制到site-lisp目录。 session : 这个插件可以让你的emacs显示最近编辑和最近访问的文件。官方网站是:http:///projects/emacs-session
doxymacs : 这是一个按照doxy风格生成注释的工具。使代码可以更方便的生成文档。官方网站是:http:///projects/doxymacs
配置emacs
一切就绪后,就需要配置emacs了。在C盘根目录下建立一个.emacs文本文件,输入配置内容。以下是我的配置文件内容:
(require 'xcscope) ;;加载xcscope (require 'cedet) ;;加载cedet (require 'ecb) ;;加载ecb (require 'session) ;;加载session (add-hook 'after-init-hook 'session-initialize) ;; 启动时初始化session (require 'doxymacs) ;; 启动doxymacs (add-hook 'c-mode-common-hook 'doxymacs-mode) ;;
启动doxymacs-mode
(add-hook 'c++-mode-common-hook 'doxymacs-mode) ;; 启动doxymacs-mode (desktop-load-default) ;;读取默认desktop设置
(desktop-read) ;;读取当前目录保存的desktop设置 (set-face-background 'default "LightCyan3") ;;设置背景色为 浅青色3
(set-face-font 'default "-outline-新宋体-normal-r-normal-normal-*-*-96-96-c-*-iso8859-1") ;;设置字体为新宋体 ( Only for windows ) (global-set-key [f12] 'ecb-activate) ;;定义F12键为激活ecb
(global-set-key [C-f12] 'ecb-deactivate) ;;定义Ctrl+F12为停止ecb (global-set-key [f11] 'delete-other-windows) ;;设置F11为删除其它窗口 (global-set-key [(meta return)] 'semantic-ia-complete-symbol-menu) ;;设置Alt+Enter为自动补全菜单 (global-set-key [C-\;] 'ecb-goto-window-edit-last)
;;切换到编辑窗口
(global-set-key [C-\'] 'ecb-goto-window-methods) ;;切换到函数窗口 (global-set-key [C-.] 'cscope-find-global-definition) ;;搜索定义 (global-set-key [C-,] 'cscope-pop-mark) ;; 跳出转向 (enable-visual-studio-bookmarks) ;; 启动VS书签子程序
;;(setq semanticdb-project-roots (list "d:/work")) ;; 设置cemanticdb的扫描根目录 (add-hook 'c-mode-common-hook ( lambda() ( c-set-style "k&r" ) ) )
;;设置C语言默认格式 (add-hook 'c++-mode-common-hook ( lambda() ( c-set-style "k&r" ) ) ) ;;设置C++语言默认格式 |
|
来自: bigyellowdoc > 《计算机使用》