首页 > IDE, 中级, 自动补全 > Emacs补全利器:auto-complete+gccsense

Emacs补全利器:auto-complete+gccsense

2010年11月8日 ahei 发表评论 阅读评论

作者: Menglong Tan

1 前言

搜索引擎上关于emacs代码补全的文章一大堆,大多讲的是cedet、semantic、ctags之类的。我自己也尝试过一些“主流”的组合,奈何都不来感啊。用得最长的也就auto-complete了,但是用的也仅仅是它自带的buffer内内容的补全,基本不涉及语义的补全。偶然发现了gccsense这个东西,简单配置了下,比较满意。有图有真相

Emacs gccsense


我绑定的补全键到M+/,这样,遇到要补全的地方,按下M+/就出现了补全菜单,旁边是提示。

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代码基础上改的,主要用来从代码中提取补全信息

  1. 下载:http://cx4a.org/software/gccsense/#Downloads
    编译安装之前,准备好环境,debian系统如下:

    sudo apt-get install build-essential libgmp3-dev libmpfr-dev flex ruby rubygems libsqlite3-ruby

    其它系统,如freebsd、macos请自行参考用户手册。

  2. 配置安装:

    $ 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这个包包含一些辅助函数,以及编辑器的插件

  1. 解压缩之后,执行:

    $ cd gccsense-*
    $ sudo cp bin/* /usr/local/bin/
  2. 执行一下命令,确保安装成功:

    $ gccrec --version 
    $ autopch --version
  3. 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 实例

  1. 准备一个测试cpp文件,test.cpp:

    #include <string>  
    using namespace std;  
    int main()  
    {  
        string s;
    }
  2. 使用gccrec记录编译命令

    gccrec g++-code-assist test.cpp

    这里可以认为g++-code-assist就是g++,参数一样的,比如-I -l之类的。

  3. 用emacs打开test.cpp,享受补全吧
    在string s;后面接着输入s.,然后按M-x ac-complete-gccsense,就可以利用auto-complete和它的gccsense后端来补全了。

6 附录

这里贴上我的emacs相关部分的配置文件。
我把补全的命令绑定到了M-/上面,
gccsense.el放到了/mydoc/lib/emacs-plugins/c/下面,所以这样写:

(add-to-list 'load-path "/mydoc/lib/emacs-plugins/c")  
(require 'gccsense)  
(global-set-key "\257" (quote ac-complete-gccsense))

7 参考

分享家:Addthis中国
GD Star Rating
loading...
Emacs补全利器:auto-complete+gccsense , 7.9 out of 10 based on 19 ratings 该日志未加标签。
分类: IDE, 中级, 自动补全
  1. ks
    2010年11月25日09:08 | #1

    无意间点入这个网站,胖总V5!

    [回复]

    ahei 回复:

    @ks, 呵呵, crackcell,胖总?

    [回复]

    crackcell 回复:

    @ks, -_-!!!,大哥你哪位啊?用个小马甲来留了个言阿~~~

    [回复]

  2. lionbo
    2010年12月14日20:07 | #2

    为什么我的找不到ac-complete-gccsense

    [回复]

    ahei 回复:

    @lionbo, 在gccsense包里面

    [回复]

    lionbo 回复:

    @ahei,
    恩,我看过源码了,但是为什么我掉不出ac-complete-gccsense,另外gccsense-diagnose也是找不到的。。。是没加载进去么?方便给我留个qq号之类的么?我想问问

    [回复]

    ahei 回复:

    @lionbo, ….175行:

    (defun ac-complete-gccsense ()
      (interactive)
      (auto-complete '(ac-source-gccsense-member ac-source-gccsense-static-member)))

    [回复]

  3. linuxer
    2010年12月23日19:37 | #3

    你好,autocomplete+gccsense我配置成功了,在java环境下也能自动补全,不过我后来配置了jdee,好像这里用的是cedit,然后编辑java的时候就不能用gccsense的补全功能了,这个可以兼得不?用了下cedit的补全,不知道是不是配置的问题,我觉得那补全不爽~

    [回复]

    linuxer 回复:

    我又发现了一个问题,为什么我的自动补全只是一些常用的数据类型和修饰词啊,对于变量的属性什么的都不会自动显示额,晕了晕了。。。。。。

    [回复]

    zzzzzzyyy 回复:

    @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看下相关变量的值,问题就一目了然了。

    [回复]

  4. visaya
    2011年2月6日00:47 | #4

    请问如何在fedora系统中安装 manual中没有redhat系列的安装方法 需要什么Requirements呢?

    [回复]

  5. 2011年3月19日23:33 | #5

    好文!转!

    [回复]

  6. emacs菜鳥不具名
    2011年4月13日09:50 | #6

    你好,我是學了兩天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 回复:

    @emacs菜鳥不具名, auto-complete-config里面已经require auto-comple了,一开始不懂的话,照着做就可以了,想懂的话,要简单学点elisp

    [回复]

  7. 2011年5月20日20:12 | #7

    你好,我的.emacs文件中有这么一句:
    (define-key c-mode-base-map [(return)] ‘newline-and-indent),导致自动补全时,我按enter键直接就换行了,并没有把我选择的自动补全代码打印出来。请问如何解决这一冲突?

    [回复]

    ahei 回复:

    @cody, try (define-key c-mode-base-map (kbd “RET”) ‘newline-and-indent)

    [回复]

  8. xxo|oxx
    2011年5月21日01:32 | #8

    其实,为了找一个精确的自动补全功能,从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 回复:

    @xxo|oxx, 我非常关心的是还能用CMake编译工程么,是不是必须使用clang编译呢?

    [回复]

    xxo|oxx 回复:

    @chenshu,
    clang旨在提供编辑时的自动补全,与你用什么工具来编译工程没有关系。
    可以随时使用clang来补全,不必先使用clang编译。

    [回复]

    chenshu 回复:

    @xxo|oxx,
    非常希望你能介绍一下你如何配置clang的。我从clang站点下载了clang_completion_mode.el
    都不知道怎么用它。

    [回复]

    chenshu 回复:

    @chenshu,
    自问自答:我已经搞定clang了。下面是我在作者网站上的帖子,或许对后来者有帮助。
    https://github.com/brianjcj/auto-complete-clang/issues/2#issuecomment-1424963

    [回复]

  9. Richard
    2011年5月24日09:53 | #9

    通过是通过了,但是加到AC的backend上面,会发生错误,不能识别类中的东西。。
    在shell下试一下,发现原来是include下子文件夹的头文件识别不了阿。。。。
    - -。难道还需要hack in才行?
    @xxo|oxx

    [回复]

  10. xcwen
    2011年5月24日12:01 | #10

    我一直使用vim cpponmicomplate 语法补全。请问有没有和它类似的补全方案。
    总觉得emacs 下的补全不是慢,就是不准确.
    帮帮忙啊。。

    [回复]

    ahei 回复:

    @xcwen, auto complete就够用了,补全不是关键

    [回复]

    Richard 回复:

    @ahei, auto complete (AC)的命中在C++中的. 和->之后不行阿。是有相关信息,但是提供了巨多废物信息。影响很大阿。
    ahei,你在C++或者C中使用AC是怎么解决的?
    有的时候AC不知道为什么就退出了。。这个很奇怪。。。

    要知道AssistX是相当强力而且稳定的。而据我所知,emacs应该是更加强劲的。
    我的配置是在你的配置上面迭代的。哈哈。。。。不要鄙视我。省力阿。在这里感激你一下先。

    [回复]

    ahei 回复:

    @Richard, emacs的前辈们不太关注自动补全, 更关注其他东西,所以emacs的补全确实没有其他的ide好, 但是我用ac感觉就足够了,等你用熟了,就知道更重要的有其他东西,现在的dea的ac确实是有时候莫名其妙的退出了,….,暂时还没时间跟进

    [回复]

评论分页
  1. 2010年11月8日11:39 | #1
  2. 2010年11月10日08:04 | #2
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: