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...
无意间点入这个网站,胖总V5!
[回复]
ahei 回复:
十一月 25th, 2010 at 10:07 上午
@ks, 呵呵, crackcell,胖总?
[回复]
crackcell 回复:
十二月 25th, 2010 at 8:17 下午
@ks, -_-!!!,大哥你哪位啊?用个小马甲来留了个言阿~~~
[回复]
为什么我的找不到ac-complete-gccsense
[回复]
ahei 回复:
十二月 14th, 2010 at 10:59 下午
@lionbo, 在gccsense包里面
[回复]
lionbo 回复:
十二月 15th, 2010 at 9:30 上午
@ahei,
恩,我看过源码了,但是为什么我掉不出ac-complete-gccsense,另外gccsense-diagnose也是找不到的。。。是没加载进去么?方便给我留个qq号之类的么?我想问问
[回复]
ahei 回复:
十二月 16th, 2010 at 5:29 下午
@lionbo, ….175行:
[回复]
你好,autocomplete+gccsense我配置成功了,在java环境下也能自动补全,不过我后来配置了jdee,好像这里用的是cedit,然后编辑java的时候就不能用gccsense的补全功能了,这个可以兼得不?用了下cedit的补全,不知道是不是配置的问题,我觉得那补全不爽~
[回复]
linuxer 回复:
十二月 23rd, 2010 at 8:27 下午
我又发现了一个问题,为什么我的自动补全只是一些常用的数据类型和修饰词啊,对于变量的属性什么的都不会自动显示额,晕了晕了。。。。。。
[回复]
zzzzzzyyy 回复:
二月 13th, 2011 at 3:50 上午
@linuxer,
1.java来说jdee自带的(jde-complete)补全是最好的,不过我比较喜欢用(jde-complete-minibuf),绑个快捷键和eclipse/netbeans的补全用起来完全一样。
不过要注意设好(jde-global-classpath),否则无法支持标准库,如java.io, java.util等。
2.cedet用semantic用来做语法分析+补全,主要是(semantic-complete-…)和 (semantic-ia-complete …)。对java没有c/c++那么好用,主要我不知道怎么让semantic去索引java标准库。不过一定要选的话,(semantic-complete-analyze-and-replace)最像我们常见的补全功能。
从代码来看jdee的几个补全函数都是自己写的,并没有调用semantic,所以如果你之前用的是”cedet的补全”的话,可以再试试jdee补全。
3.autocomplete本身没有语法分析,它的补全很像emacs自己的dabbrev-expand,直接字符串补全,所以需要gccsense的支持(做语法分析),但是gccsense貌似不支持java吧,于是就没有输入’.'补出”变量的属性”这样的功能了。
不过我没有用过gccsense,只用过autocomplete,所以只能这样猜。
4.遇到问题多C-h f 看代码,这几个工具的代码及注释都是相当漂亮的。往往看下函数需要什么参数,再c-h v看下相关变量的值,问题就一目了然了。
[回复]
请问如何在fedora系统中安装 manual中没有redhat系列的安装方法 需要什么Requirements呢?
[回复]
好文!转!
[回复]
你好,我是學了兩天emacs的windows emacs 新手,我看了Menglong Tan大的文章有幾個疑問想請教一下
1.就我目前所學的,應該是(require ‘auto-complete)啊,怎麼會是(require ‘auto-complete-config)
請問兩者有什麼差別嗎?因為我使用的配置是ahei大給的auto-complete+配置檔裡面也是(require ‘auto-
complete)所以才有此一問
2.因為require後還不能用所以我找到了啟動的指令打到配置文件裡(global-auto-complete-mode 1)←雖然
我不懂這是什麼意思,為何前後都會多了一些字(應該都是打跟檔名有關後面加個mode才對…),Menglong
Tan大用的(ac-config-default)指令又是什麼呢?請幫忙小弟解開這困擾很久的問題,好不容易有點光明了,
現在又遶進去了…emacs真的很是折騰人的東西。
[回复]
ahei 回复:
四月 30th, 2011 at 3:24 下午
@emacs菜鳥不具名, auto-complete-config里面已经require auto-comple了,一开始不懂的话,照着做就可以了,想懂的话,要简单学点elisp
[回复]
你好,我的.emacs文件中有这么一句:
(define-key c-mode-base-map [(return)] ‘newline-and-indent),导致自动补全时,我按enter键直接就换行了,并没有把我选择的自动补全代码打印出来。请问如何解决这一冲突?
[回复]
ahei 回复:
五月 21st, 2011 at 4:08 下午
@cody, try (define-key c-mode-base-map (kbd “RET”) ‘newline-and-indent)
[回复]
其实,为了找一个精确的自动补全功能,从sematic 到 gccsense, 一路惊喜不断,
直至 clang + auto complete, 我释然了:
http://mike.struct.cn/blogs/entry/15/
http://v.youku.com/v_show/id_XMjY1ODI4NTQw.html
http://swik.net/clang+Emacs
—————————————————————————————
[回复]
chenshu 回复:
五月 23rd, 2011 at 4:08 下午
@xxo|oxx, 我非常关心的是还能用CMake编译工程么,是不是必须使用clang编译呢?
[回复]
xxo|oxx 回复:
五月 23rd, 2011 at 9:40 下午
@chenshu,
clang旨在提供编辑时的自动补全,与你用什么工具来编译工程没有关系。
可以随时使用clang来补全,不必先使用clang编译。
[回复]
chenshu 回复:
六月 23rd, 2011 at 5:27 下午
@xxo|oxx,
非常希望你能介绍一下你如何配置clang的。我从clang站点下载了clang_completion_mode.el
都不知道怎么用它。
[回复]
chenshu 回复:
六月 24th, 2011 at 1:51 下午
@chenshu,
自问自答:我已经搞定clang了。下面是我在作者网站上的帖子,或许对后来者有帮助。
https://github.com/brianjcj/auto-complete-clang/issues/2#issuecomment-1424963
[回复]
通过是通过了,但是加到AC的backend上面,会发生错误,不能识别类中的东西。。
在shell下试一下,发现原来是include下子文件夹的头文件识别不了阿。。。。
- -。难道还需要hack in才行?
@xxo|oxx
[回复]
我一直使用vim cpponmicomplate 语法补全。请问有没有和它类似的补全方案。
总觉得emacs 下的补全不是慢,就是不准确.
帮帮忙啊。。
[回复]
ahei 回复:
五月 28th, 2011 at 7:02 下午
@xcwen, auto complete就够用了,补全不是关键
[回复]
Richard 回复:
六月 2nd, 2011 at 9:58 上午
@ahei, auto complete (AC)的命中在C++中的. 和->之后不行阿。是有相关信息,但是提供了巨多废物信息。影响很大阿。
ahei,你在C++或者C中使用AC是怎么解决的?
有的时候AC不知道为什么就退出了。。这个很奇怪。。。
要知道AssistX是相当强力而且稳定的。而据我所知,emacs应该是更加强劲的。
我的配置是在你的配置上面迭代的。哈哈。。。。不要鄙视我。省力阿。在这里感激你一下先。
[回复]
ahei 回复:
六月 6th, 2011 at 5:06 下午
@Richard, emacs的前辈们不太关注自动补全, 更关注其他东西,所以emacs的补全确实没有其他的ide好, 但是我用ac感觉就足够了,等你用熟了,就知道更重要的有其他东西,现在的dea的ac确实是有时候莫名其妙的退出了,….,暂时还没时间跟进
[回复]