[emacs] auto-complete上使用scite的api文件进行补全

巴蛮子 posted @ 2011年2月18日 11:46 in Emacs with tags scite emacs , 14511 阅读

Scite编辑器提供补全功能,备选的函数都由一个外部文件(内容很简单,就是每行一个函数原型)提供,这个文件它称为API文件,每种编程语言可配置一个。

这个机制对于那些非对象化的编程语言来说(比如PHP, Perl, AutoHotKey), 是相当简单方便的,自己可以用一些工具来生成这个文件。即使是对象化语言,有时也很有用,比如Java里面import的时候可以用这种机制来补全包名,或者用全路径方式调用静态函数(比如Python里面os.path.exist())。

以前常用Vim,就怀念这种简单的补全机制。后来用Emacs,也没有看到类似的,一次还发现一个增强的php-mode居然是采用硬编码的方法来提供备选函数的。

于是就想自己写一个,但自己玩Emacs没多久,编码能力不够,一直到了年底,才晃晃悠悠地把这个东西写出来了。这算是我正儿八经写的第一个Emacs包(以前都是在自己的~/.emacs里面折腾各种配置)。

下载: [[file:auto-complete-scite-api.el]] 


 

要使用这个包,需要先安装配置好Auto Complete,它界面漂亮、操作方便、配置简单,自身提供了多种source来进行补全(比如文件名、elisp符号名、Emacs包名、其它buffer中的单词、Semantic、Eclipse(eclim)等),可以根据自己需要来配置每种编程语言需要那些sources。具体配置和使用说明可参见Emacs中文网上的这篇 Emacs补全利器: auto-complete+gccsense (注意: ahei的这篇文章 用auto-complete实现自动补全 是针对老版本auto-complete的(<=0.3),v1.0以上版本变动较大,配置也简单得多了)。

 

使用方法:

  • API文件需要放到/usr/share/scite/api/或者~/.scite/api/两个目录下。如果想放其它目录,可在~/.emacs中设置ac-scite-api-directories。除了SciTE自带的哪些API文件,你还可以到scite-files项目里去找其它人提供的(或者生成工具)。注意每种major-mode会根据如下两种规则读取对应的API文件
    1. major-mode-name - "-mode" + ".api",比如php-mode就会去找php.api
    2. 文件扩展名+.api,比如init.el就会去找el.api和
    3. 如果两个机制都能读取到文件,都会加载(不过目前没处理重复项目),比如编辑functions.pyw文件时会加载python.api 和pyw.api。你可以用这个机制来将区分系统配置和个人配置。
  • 在Emacs中配置:

如果打算在所有使用auto-complete的地方使用这个(推荐),就把ac-source-scite-api添加到ac-sources缺省值里去

(load "auto-complete-config") 
(if (load "auto-complete-scite-api" t)
    (setq-default ac-sources (cons 'ac-source-scite-api ac-sources)))

如果只想在某些模式中使用,还是操作ac-sources(因为ac-sources是每个buffer独立的),不过我提供了一个ac-enable-scite-api-source函数

(if (load "auto-complete-scite-api" t)
     (progn
        (add-hook 'php-mode-hook 'ac-enable-scite-api-source)
        (add-hook 'xahk-mode-hook 'ac-enable-scite-api-source))) 

这个ac-enable-scite-api-source可以交互式调用,即在需要的时候即时打开,M-x ac-enable-scite-api-source。

 

自动补全的效果图 (后面带A的即是由本模块提供的候选项),黄色部分是用Auto Complete机制提供的当前候选项的说明(如果API文件里面提供了的话)

 

作为一个顺带的功能,你可以在任何函数上按M-F1来查看该函数的说明(显示在echo area)——如果API文件中提供了的话。

 

补充说明:

  • 在GNU Emacs 23.2/24.0.50和Auto Complete 1.2/1.3上验证过可用。
  • 如果API文件过大,第一次的性能比较慢,最好文件不要超过500k, 建议删除一些不常用的函数(比如我机器上工具生成的python.api里面包含了很多pyqt的包和函数,而我很少用到)

Technorati 标签: , ,

 

 

 

Avatar_small
ownwaterloo 说:
2011年2月18日 19:21

emacs24发布了? 还是lz自己编译的? 强大……

Avatar_small
巴蛮子 说:
2011年2月18日 22:28

@ownwaterloo: 如果发布了,版本号就是24.1了。 我用的是alpha版本,Windows版本可以从这些地方下载到(Linux下就得自己编译了,所以在Linux下我还是用Debian的v23.2)

http://alpha.gnu.org/gnu/emacs/windows/
http://code.google.com/p/emacs-for-windows/downloads/list

Avatar_small
ownwaterloo 说:
2011年2月19日 02:15

@巴蛮子: 好东西, 感谢感谢~

Avatar_small
巴蛮子 说:
2011年4月07日 13:40

前两天发了v0.2,主要是改进了性能(v0.1在加载大一点的文件时就几乎卡死了,这还能忍受,主要是补全时的慢不能接受)。我测试了java160.api (1.4M)和python.api (1.8M),性能都还不错。

http://code.google.com/p/bamanzi-misc/source/browse/trunk/_emacs.d/mylisp/auto-complete-scite-api.el

但目前是用每行前面几个字母做索引来查补全,所以python.api 里这种包含整个包路径的API会造成输入包名时补全项太多,性能上应该还有优化空间,有时间再改进吧。

Avatar_small
巴蛮子 说:
2014年8月30日 09:47

知会: 这个模块现在在 bitbucket 上维护,欢迎反馈问题或者发Merge Request哈

https://bitbucket.org/bamanzi/dotemacs-extra/src/default74023/prog/auto-complete-scite-api.el?at=default


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter