Emacs补全利器:auto-complete+gccsense
作者: Menglong Tan
1 前言
2 简介
auto-complete提供一个补全的前端,通过不同的后端,支持ctags等。
gccsense是补全的后端,能提供符合语义的补全。因为它是直接利用gcc的代码,使用了编译器内在的分析器。它是一个独立的程序,目前通过插件可以被用到emacs和vim的补全上。因为是用的gcc的代码,理论上可以补全所有gcc支持的语言。
auto-complete和gccsense是一家出的。
3 安装
3.1 配置auto-complete
下载:http://cx4a.org/software/auto-complete/
配置.emacs,我的auto-complete在/mydoc/lib/emacs-plugins/下
; auto complete (add-to-list 'load-path "/mydoc/lib/emacs-plugins/auto-complete") (require 'auto-complete-config) (add-to-list 'ac-dictionary-directories "/mydoc/lib/emacs-plugins/auto-complete/ac-dict") (ac-config-default) |
3.2 配置gcc-code-assist
gcc-code-assist就是在gcc代码基础上改的,主要用来从代码中提取补全信息
-
下载:http://cx4a.org/software/gccsense/#Downloads
编译安装之前,准备好环境,debian系统如下:sudo apt-get install build-essential libgmp3-dev libmpfr-dev flex ruby rubygems libsqlite3-ruby
其它系统,如freebsd、macos请自行参考用户手册。
-
配置安装:
$ tar xvjf gcc-code-assist-*.tar.bz2 $ cd gcc-code-assist-* $ ./configure --program-suffix=-code-assist --enable-languages=c,c++ --disable-bootstrap --disable-multilib $ make # -j2 $ sudo make install
安装成功之后执行下,如果有正常输出,就说明安装成功:
$ gcc-code-assist --version $ g++-code-assist --version
3.3 安装配置gccsense
gccsense这个包包含一些辅助函数,以及编辑器的插件
-
解压缩之后,执行:
$ cd gccsense-* $ sudo cp bin/* /usr/local/bin/
-
执行一下命令,确保安装成功:
$ gccrec --version $ autopch --version
-
emacs的插件文件为etc/gccsense.el,放到插件目录然后,在.emacs里面加入
(require 'gccsense)
即可。
由于我的gccsense.el放到了。/mydoc/lib/emacs-plugins/c下,并且把auto-complete的补全命令绑定到了M+/上,所以这部分配置如下:(add-to-list 'load-path "/mydoc/lib/emacs-plugins/c") (require 'gccsense) (global-set-key "\257" (quote ac-complete-gccsense))
ok,搞定。
4 主要模块介绍
在介绍使用前,简单介绍下几个主要模块的作用
-
gcc-code-assist
gcc4.4代码基础上改的那位,用来从被补全代码中分析出补全信息 -
gccrec
编译一个文件,往往要加上编译参数的,比如自定义的include地址。但是编辑器在补全的时候,是不知道这些的,硬生生地调用gcc-code-assist来“模拟编译”,参数补全造成的错误会扰乱补全信息的获取。
gccrec就是为了解决这个问题,在使用编辑器补全之前,需要执行一次gccrec,它会将编译参数信息存到~/.gccrec这个sqlite3的数据库中。具体用法参见下一节的示例。 -
autopch
用来启用预编译头,来提高速度。
autopch的相关部分请各位看官自行参考用户手册吧,后面的示例代码简单,不需要这个东西。
5 实例
-
准备一个测试cpp文件,test.cpp:
#include <string> using namespace std; int main() { string s; }
-
使用gccrec记录编译命令
gccrec g++-code-assist test.cpp
这里可以认为g++-code-assist就是g++,参数一样的,比如-I -l之类的。
-
用emacs打开test.cpp,享受补全吧
在string s;后面接着输入s.,然后按M-x ac-complete-gccsense,就可以利用auto-complete和它的gccsense后端来补全了。
6 附录
7 参考
gccsense用户手册,http://cx4a.org/software/gccsense/manual.html

GD Star Rating
loading...
该日志未加标签。
loading...
如果需要php语言的补全,在编译GCC时enable,enable languages=c,c++,php吗?
[回复]
@hello,world
这个还真没试过,我不会写php。兄台实践一下,把结论给大伙儿分享一下?呵呵。
[回复]
tubo 回复:
七月 6th, 2011 at 4:03 下午
@crackcell,
php 不用编译, 和 gcc 没关系, gcc 的配置选项中也没有 enable languages=php 这个选项。
不过,用 emacs 写 php 的话, auto-complete + yas/snippet 就应该足够了。
[回复]
crackcell 回复:
七月 6th, 2011 at 4:18 下午
@tubo, ac能做语意的补全么?我记得ac还需要语意的后端吧。比如semantic啥的。
[回复]
tubo 回复:
七月 6th, 2011 at 5:31 下午
@crackcell,
php 不需要基于语义的补全吧。
一些一般意义上的补全就应该足够了,比如 ac 自带的 ac-source-words-in-buffer ac-source-dictionary 等等。
我自己没写过 php ,之前简单的看过同事写的,应该还没复杂到需要基于语义的补全。
[回复]
请问我是用的opnesuse 想装gccsense 的话该怎么办阿?
[回复]
我如果有很多项目,我怎么改变存储地址,然后补全的时候指定不同的.gccrec文件呢?
[回复]
为什么样我的POPUP窗口,没图片上显示的那么整齐呀(我的不规则)?
[回复]
gccrec g++-code-assist test.cpp
只是针对单个文件。
如果是大工程的话,在makefile 里调用gccrec g++-code-assist ?
[回复]