[emacs] auto-complete上使用scite的api文件进行补全
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文件
- major-mode-name - "-mode" + ".api",比如php-mode就会去找php.api
- 文件扩展名+.api,比如init.el就会去找el.api和
- 如果两个机制都能读取到文件,都会加载(不过目前没处理重复项目),比如编辑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 标签: emacs, completion, scite
2011年2月18日 19:21
emacs24发布了? 还是lz自己编译的? 强大……
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
2011年2月19日 02:15
@巴蛮子: 好东西, 感谢感谢~
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会造成输入包名时补全项太多,性能上应该还有优化空间,有时间再改进吧。
2014年8月30日 09:47
知会: 这个模块现在在 bitbucket 上维护,欢迎反馈问题或者发Merge Request哈
https://bitbucket.org/bamanzi/dotemacs-extra/src/default74023/prog/auto-complete-scite-api.el?at=default