在Emacs下用CC++编程

    技术2022-05-11  78

    -->

    在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++程序基本上是这么几个步骤:

    编辑代码 编写Makefile 编译代码,修改编译错误 调试代码,修改逻辑错误

    当然,往往还需要阅读别人的代码。

    根据上述步骤,本文主要针对以下几个方面:

    配置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-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。

     

    最新回复(0)