作者: 陈斌(redguardtoo)
版本号: 20120821
原创时间:
所谓"自动完成",就是emacs智能猜测用户想输入的是什么词,帮助用户自动输入,如果emacs找到多个可选项,也可能弹出下拉菜单让用户来选择.
通常我们所说的IDE中的Intellisense,也可以认为是某种"自动完成".
Emacs的自动完成远比篇普通IDE的Intellisense强大得多,例如Emacs可以自动输入当前打开的文件的名字(带或者不带文件名后缀都可以).
我不是来赞美Emacs的强大的,我是来吐槽的.Emacs中的自动完成框架实在是太多了,很多框架的功能是重叠的,让人实在困扰.
所以本文的目的有两个,
函数/插件名 | 快捷键 | 推荐度 |
---|---|---|
complete-symbol | C-M-i | 中 |
auto-complete(结合clang) | TAB | 优 |
hippie-expand | M-/ | 良 |
evil-mode | C-n/C-p(完成词),C-x C-n/p(完成行) | 中 |
这是我强烈推荐的方案,auto-complete是第三方开发的插件,完美提供了自动完成需要的支持(例如在命令行环境下对下拉菜单的模拟).
而clang是苹果公司开发的目前最优秀的C/C++/Objective-C编译器,对C++语法的解析又快又好.
显然,这种方案只适用于clang支持的语言.支持Mac/Linux/Cygwin平台,我不知道是否支持Windows平台.
需要通过elpa(Emacs的AppStore)安装第三方插件auto-complete和auto-complete-clang.
如果你是重度IDE用户,喜欢和IDE一样的Intellisense功能,这就是你需要的了.
具体配置请参考我的init-auto-complete.el.
顺便说一下,关于elpa的配置,可能你需要参考我的init-elpa.el,因现在有多个AppStore,且直到Emacs24对elpa的支持才开始自带.
hippie-expand是Emacs自带的自动完成框架,其默认的一些自动完成特色功能可作为auto-complete的补充,例如自动完成词/文件名/行的功能.
既然是框架,当然可以扩充,在Emacs Wiki中提供了和ctags结合的方案.
ctags类似clang,对各种语言做语法解析的后端,但是智能程度远不如clang及后文提到的semantic,优点是所有语言通吃(例如javascript),支持所有操作系统,解析速度快(废话,正则表达式当然快).
具体配置请参考我的init-hippie-expand.el.
Emacs自带的一个函数,我对这个方案感觉一般,因为在Emacs23中,它默认仅仅调用了后台的ctags而已.
hippie-expand经过调教也可调用ctags,且其默认的特色功能比complete-symbol多,所以我没兴趣配置第三个自动完成框架了.
之所以还值得介绍,是因为我通过阅读Emacs24的changelog,发觉complete-symbol经过配置后可以用semantic作为语法解析后端(我试用后,发觉Emacs23.4也支持,不明白为什么要把该特性放在Emacs24的changelog介绍).
semantic是lisp写的语法解析器,Emacs自带,智能程度介于ctags和clang之间,解析速度比较慢,如果机器配置比较差(例如我的eeepc701上网本),会让emacs很卡.
我个人不是很喜欢这个语法解析器,过去在semantic尚且是开源项目Cedet的一个组件未被集成进Emacs中时,我折腾过Cedet,当时的感觉是速度慢,配置繁琐,不稳定.
也许现在集成进Emacs后的semantic要好很多吧.
Semantic支持多种语言,如C++/Java,如果你是Java程序员,可以考虑complete-symbol加semantic的方案.
具体配置请参考我的init-semantic.el(注意,我不用semantic,所以相应的代码被注释了.如果你要用semantic,取消注释).
Evil-mode把Emacs模拟成了Vim,是我最喜欢的第三方插件,其自动完成很简单,就是根据当前文件内容自动完成词或行.
值得推荐是因为我曾是重度Vim用户,Vim的自动完成快捷键已经成为我的本能了.
没什么要配置的,启动evil-mode即可,参见我的init-evil.el.
所谓的自动完成框架,包括前端用户界面和后端语法解析引擎两个部分.
作为前端的用户界面,我认为唯一做得好的就是auto-complete了,其他都很普通.
后端语法解析引擎,clang最优秀.ctags实际上谈不上语法解析,只是玩玩正则表达式罢了,但是因此才能通吃所有语言.semantic支持的语言比clang多一点,性能和稳定性上比较差.
作为一个C++程序员,我的首选是auto-complete加上clang.
如用一些脚本语言(ruby/python/javascript),我会用ctags加hippie-expand.