[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