配置Emacs为C/C++开发环境:安装配置cedet


犯罪动机

刚开始使用Emacs时,也有找过cedet的相关资料,只是当时还不怎么用Emacs来写C/C++代码,所以只是浅尝辄止,也可以说几乎就没弄。渐渐熟悉了Emacs,在上面写代码的频率也高了,于是又重新拾起cedet。

由于使用的是Emacs24,里面已经自带了cedet,起初认为自带了更好,不用折腾。等到真正查资料要配置时,才发现根本不是那么回事。比如网上配置cedet的帖子中,常常会提到semantic-load-enable-minimum-features等设置函数,可是无论我怎么搞(加require ‘cedet,加semantic/canned-configs等),就是不行,一直出错。实在不行了,就跑到/usr/local/share/emacs/(我是用brew装的Emacs)下用find命令去抓semantic-load-enable-minimum-features这个串,结果还是没抓着,于是确定是Emacs内置的cedet并不包含这部分实现。起初还以为是OSX下的Emacs的问题,后来跑到Ubuntu下试,一样一样的!于是找啊找啊,总算找到为什么:semantic-load-enable-minimum-features这种设置方式,不符合minor-mode的规范,因此去掉了。邮件中还提到其他的几点改动,包括部分去除调试功能,使用的cedet版本较老等。

考虑了一下,还是觉得内置的版本不爽,于是决定折腾折腾自己,到官网上下载来编译安装。

源代码下载

这个很简单,Google一下,马上知道。到cedet的官网源码下载页上找到下载地址,使用bzr或者git下载即可:

bzr checkout bzr://cedet.bzr.sourceforge.net/bzrroot/cedet/code/trunk cedet

为了方便,我在.emacs.d中建了一个3rd-party的文件夹,将cedet的源码直接下载到了这个目录下。

编译cedet

编译过程相对简单,也很顺利:

# cd cedet
make EMACS=/usr/local/bin/emacs-24.3

# optional to compile cedet/contrib:
cd contirb
make EMACS=/usr/local/bin/emacs-24.3

上面脚本首先进入cedet目录中编译cedet的标准模块,而后(可选)进入contrib子目录,编译其他不符合FSF协议的模块。

配置

替换内置的cedet

由于Emacs24内置了cedet,因此要尽早载入外部的版本(比如在.emacs的开头),避免由于Emacs已载入内置的eieio(cedet中的基础模块)而导致我们的cedet无法载入的问题。

;; load cedet. It is very important to load cedet early, before Emacs loads the builtin cedet-eieio.
(load-file "~/.emacs.d/3rd-party/cedet/cedet-devel-load.el")

使用.emacs作为配置文件的,应该直接将上面的代码放到.emacs开始处即可。我使用的是Purcell的环境,尝试过将载入脚本放到init-local.el开头处,但是仍然无法载入,于是干脆放到init.el最开始的地方了。

其他的配置

具体的配置项蛮多,需要慢慢仔细地研究,这里就没法给出一个详细配置了。网上找了下,发现这篇文章很不错,值得参考。下面是我目前的简单配置:

; load other programs that work with cedet but not copyright compliant with FSF
(load-file "~/.emacs.d/3rd-party/cedet/contrib/cedet-contrib-load.el")

; enable semantic
(semantic-mode 1)
(semantic-load-enable-minimum-features)
(semantic-load-enable-code-helpers)

; I'm not using ede currently
;(global-ede-mode t)

注意:上面虽然载入乐cedet-contrib,但实际上并没有配置使用,可以用cedet-version查看,我这里看到的是cogre和cedet=contrib都是“Not Loaded”状态。因为暂时还没用到,所以也没有去深究,以后用到时再添加详细配置吧。

上面还有一句是开启ede的,但是被我注释掉了。ede是何方神圣?——项目管理工具是也。这两天粗浅用了一下,基本感觉是:难用+麻烦+少人用(文档资料少),当然也不是说这东西就是不好,Emacs的东西都是这样的,只有潜心研磨,才能打磨出属于自己的利剑。暂时还用不着,就先放着吧。

安装配置ecb

安装很简单,ELPA上就有,直接安装了就可以了。使用上也挺简单,我都是在需要是使用ecb-activate来激活窗口的,不需要时就用ecb-deactivate来关闭。目前的配置是:

(require 'ecb-autoloads)
; disable the tip-of-the-day window, it is annoying and most importantly, it will hang my emacs
(setq ecb-tip-of-the-day nil)

; defualt value is 'mouse-2--C-mouse-2, so that I can't open file by clicking.
; Change to 'mouse-1--C-mouse-1 to enable click-to-open.
(setq ecb-primary-secondary-mouse-buttons 'mouse-1--C-mouse-1)

上面的配置中,将tip-of-the-day窗口去掉了,默认每次开始ecb时都会弹出来,提示一条使用帮助等信息,每次弹太烦了,而且在我这,这个模态框一弹出来,就没法关闭了,点了模态框上的按钮都不行,只有强制杀掉Emacs重启才能恢复使用,于是果断把它禁用掉。另外一条是设置鼠标的,默认情况下,ecb上的文件等需要用鼠标中键或者键盘回车键才能打开,鼠标左键只起到设置焦点的作用;一个是觉得这种设定不符合平常的使用习惯,更重要的是,Mac上压根就没有鼠标中键这种东西,所以就把它改成用鼠标左键了。顺便说一下,GNU Emacs中,mouse-1代表左键,mouse-2代表中键,mouse-3代表右键,我原来一直以为mouse-2是右键的,大概是早已习惯了没有中键,人有点犯傻了吧。。。

使用过程中遇到的问题

鼠标,又见鼠标

上面在说ecb时,提到过鼠标问题,不幸的是,在cedet中又遇到了,更不幸的是,这回没有可以设置的项。具体问题是:当查找一个函数或者变量的引用时(菜单Development->Navigate Tags->Find Tag References,或者键盘“C-c , g”),会弹出一个symref的buffer,在这个buffer上,跟ecb一样,鼠标左键只是用来设置焦点,需要用键盘上的回车键或鼠标中键才能打开。花了老半天时间还是没有找到可用的设置项,悲剧了!不过也不是完全没有办法,就是这些方法让我比较鄙视我自己而已。。。

  • 在Emacs中,将按键事件进行转换

    基本思路是将特定的按键(比如C-mouse-1)转换成能够实现打开功能的事件(为什么不直接转成打开的方法呢?因为使用的那些我似懂非懂的方法,似乎都得要额外的事件参数。。。)。因为最后也没采用,所以这里无法提供最终解决方案,仅提供基本思路:

    (define-key key-translation-map (kbd "<S-mouse-1>") (kbd "<mouse-2>"))
    ; (define-key key-translation-map (kbd "<S-mouse-1>") (kbd "<mouse-1> <mouse-2>"))
    

    这种转换挺恶心的,需要先用左键点击一次要打开的链接,然后用Shift-左键(不用Ctrl是因为C-mouse-1默认是弹出菜单)再点击一次才能打开。试过将按键转换成上面被注释掉的这种方式,但是不行,因为点击鼠标左键时绑定的函数需要传参数进去。

  • 使用第三方的工具,在系统层面上触发鼠标中键事件

    查找资料过程中,发现BetterTouchTool(官网,可能需要翻墙)这个工具比较受推崇,我想应该可以解决这个问题吧,没去尝试,实在是不喜欢这种引入第三方软件的解决方案。

Author: Rex Shen

Created: 2014-07-17 Thu 14:33

Emacs 24.3.1 (Org mode 8.2.7b)

Validate

Leave a comment

Your email address will not be published. Required fields are marked *