Linux下各类软件繁多,但目前尚未能有达到source insight一样水准的代码阅读工具(Eclipse应该也比较好用,但对于Emacs用户来说,三个字,不够酷),或许有人要站出来说Emacs blabla,作为Emacs重度用户的经验来说,咱们得承认差距,不做脑残粉。

很早前尝试过CEDET(Collection of Emacs Development Environment Tools)ecb(Emacs Code Browser),ecb主要作用是通过多个Emacs window来提高代码阅读效率,但对于Emacs方便的buffer切换机制而言,实则作用有限,难怪项目最终荒废无人维护,但CEDET确仍然在活跃开发者,邮件列表里也还有人持续讨论,代码更新也较为频繁。

CEDET我个人觉得最重的两个子项目或特性如下:

Semantic

Semantic使用纯Emacs lisp写成,是一个功能比较有效的Lexer和Parser(没错,就是编译器里的Lexer/Parser),因此在代码分析方面,是具有机制上的优势的,在实际的使用中,其Parser虽然并不十分完善,但已经满足大多数的应用了。

EDE

EDE同样使用纯Emacs lisp写成,用来提供IDE环境,包括项目管理,调试、编译等,当然,这些功能除项目管理外,后两者我基本上未使用过,不做评价。

关于CEDET的详细介绍与配置,请参考附注里Alexott的经典文章以及我的Emacs配置,这里就不再过多讲述了;写这篇文章的目的是介绍一下我在使用cscope感到不便之后切换到gnu global之后的惊喜,CEDET或者准确说是EDE与gnu global配合之后,极大的方便了我的代码开发,在公司我需要在可能达十万行的代码基础上开发和维护,CEDET+gnu global使得我基本上可以不再开启source insight了,实是求是的说是不常再开启了,当然我的目标是一个putty会话+emacs+gnu global搞定一切,绝不使用鼠标,目前结果是公司的破开发服务器已经有点跟不上我在Emacs中的操作速度了:(

当然,大多数时候代码浏览与查找我只会使用gtags-mode提供的快捷键,而且它已经足够了,但我喜欢semantic的一个重要功能就是eassist-list-methods(如下图所示):

eassist-methods

该功能依赖于对文件的有效分析,而EDE目前定位项目头文件与源码默认只能采用在创建project时指定的方式,而大多数情况下软件代码布局较为随意,此时EDE提供了一个配置选项,在Emacs配置文件中配置EDE项目使用gnu global做为项目文件定位后端,以方便semantic对于源代码文件的头文件分析,从而使得eassist能从semantic那里获取正确的项目信息。

;; Use gnu-global as locate backend for EDE.        
(setq ede-locate-setup-options '(ede-locate-global ede-locate-base))
;; Sample project.
(ede-cpp-root-project "OVS"
    :name "OVS"
    :file "~/sources/openvswitch/Makefile.am"
    :system-include-path nil)

当然,这里只为eassist这个小功能来就开启cedet有点杀鸡用牛刀的意思;EDE其实还可以让用户自定义定位函数,此时完全可以写一个Emacs lisp函数,通过grep的方式来定位文件,然而这种方式会比较慢,并且由于semantic还在开发过程中,倘若后面其Lexer/Parser强大后,CEDET/EDE完全可以考虑自行支持建立文件索引DB,从而真正的达到与source insight的类似功能,彼时gnu global也应该被抛开了:)

附:

  1. http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html

  2. https://github.com/fortitudezhang/fortitude-home/tree/master/.emrc


Comments

comments powered by Disqus