Emacs中的自动完成(Auto Completion)完全指南

  |   Source

作者: 陈斌(redguardtoo)

版本号: 20131106

更新时间: 2013-11-06 Wed 原创时间: 2012-08-21 二

所谓"自动完成",就是emacs智能猜测用户想输入的是什么词,帮助用户自动输入,如果emacs找到多个可选项,也可能弹出下拉菜单让用户来选择.

通常我们所说的IDE中的Intellisense,也可以认为是某种"自动完成".

Emacs的自动完成远比篇普通IDE的Intellisense强大得多,例如Emacs可以自动输入当前打开的文件的名字(带或者不带文件名后缀都可以).

我不是来赞美Emacs的强大的,我是来吐槽的.Emacs中的自动完成框架实在是太多了,很多框架的功能是重叠的,让人实在困扰.

所以本文的目的有两个,

  1. 说明哪些自动完成框架是主流的
  2. 如何配置使用自动完成框架

概述

函数/插件名 快捷键 推荐度 使用频率
complete-symbol C-M-i
auto-complete (结合clang) TAB
company-mode (结合clang) 不需要
hippie-expand M-/
evil-mode C-n/C-p(完成词),C-x C-n/p(完成行)

auto-complete结合clang

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的支持才开始自带.

company-mode

company-mode和auto-complete功能类似,唯一的区别是clang以及其他语言支持已内置,所以不需要安装其他elisp插件或者额外配置.目前我已用company-mode代替了auto-complete.

hippie-expand

hippie-expand是Emacs自带的自动完成框架,其默认的一些自动完成特色功能可作为auto-complete的补充,例如自动完成词/文件名/行的功能.

既然是框架,当然可以扩充,在Emacs Wiki中提供了和ctags结合的方案.

ctags类似clang,对各种语言做语法解析的后端,但是智能程度远不如clang及后文提到的semantic,优点是所有语言通吃(例如javascript),支持所有操作系统,解析速度快(废话,正则表达式当然快).

具体配置请参考我的init-hippie-expand.el.

complete-symbol

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

Evil-mode把Emacs模拟成了Vim,是我最喜欢的第三方插件,其自动完成很简单,就是根据当前文件内容自动完成词或行.

值得推荐是因为我曾是重度Vim用户,Vim的自动完成快捷键已经成为我的本能了.

没什么要配置的,启动evil-mode即可,参见我的init-evil.el.

小结

所谓的自动完成框架,包括前端用户界面和后端语法解析引擎两个部分.

作为前端的用户界面,我认为唯一做得好的就是auto-complete了,其他都很普通.

后端语法解析引擎,clang最优秀.ctags实际上谈不上语法解析,只是玩玩正则表达式罢了,但是因此才能通吃所有语言.semantic支持的语言比clang多一点,性能和稳定性上比较差.

作为一个C++程序员,我过去的首选是auto-complete加上clang,现在我用company-mode加上clang.

如用一些脚本语言(ruby/python/javascript),我会用ctags加hippie-expand.

Comments powered by Disqus