首页 > IDE, 初级, 自动补全 > auto complete和yasnippet的区别

auto complete和yasnippet的区别

2009年11月27日 ahei 发表评论 阅读评论

auto-complete和yasnippet是Emacs下两款非常强悍的补全插件,那么auto-complete和yasnippet是否就是一对竞争者呢?有你没我,有我没你?

其实不是这样的,它们两个完全能融洽的相处,并且合作的非常愉快。

本质上来说,auto complete只是一个补全界面,它用来展示其他补全引擎的结果,它支持好多补全引擎,包括补全全路径文件名的backend,补全单独文件名的backend,补全当前buffer下单词的backend,补全所有buffer下的单词的backend,补全Elisp语法的引擎,补全yasnippet片段的引擎,补全缩写的引擎,等等等等,当然也包括yasnippet,它会把所有的补全引擎的补全结果一起展示出来,当然是根据你定义的补全引擎的顺序。

那么我们为什么不直接使用yasnippet,而去使用auto complete呢?

除了auto complete可以同时利用其他补全引擎的结果,还使得使用yasnippet起来更方便。比如在yasnippet中你看不到当前光标出单词是否有它的片段定义,你要补全它的时候,要按tab,而auto complete加了yasnippet的引擎后,可以自动提示出当前光标处单词是否有yasnippet的片段定义,yasnippet引擎的结果会用特殊的颜色标注,这里有代码证明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(defface ac-yasnippet-candidate-face
  '((t (:background "sandybrown" :foreground "black")))
  "Face for yasnippet candidate.")
 
(defface ac-yasnippet-selection-face
  '((t (:background "coral3" :foreground "white")))
  "Face for the yasnippet selected candidate.")
 
(defvar ac-source-yasnippet
  '((candidates . ac-yasnippet-candidate)
    (action . yas/expand)
    (candidate-face . ac-yasnippet-candidate-face)
    (selection-face . ac-yasnippet-selection-face))
  "Source for Yasnippet.")

上述代码中的candidate-face表示补全结果的颜色,而selection-face表示当你把光标移到这个补全结果上的时候的颜色,如下图所示:

在auto complete使用yasnippet引擎

在auto complete使用yasnippet引擎


上图中,defun和dired都是yasnippet引擎给出来的补全结果,其他的则是其他引擎的补全结果,yasnippet的补全结果用其他颜色标注,而当前所选的yasnippet引擎的补全候选则是用另外一种颜色标注,一目了然。
还有,比如你有个for的yasnippet片段定义,你输入fo的时候,在yasnippet中这时候你并不能按tab进行补全,但是在auto complete中,你加了yasnippet引擎后,auto complete会提示出yasnippet的补全结果for,就像下面这样:
在auto complete使用yasnippet引擎

在auto complete使用yasnippet引擎


这时候,你按回车的话,会自动扩展yasnippet的for片段的定义,变成下面这样:
Emacs的超级补全yasnippet

Emacs的超级补全yasnippet


那么auto complete是怎么做到不需要完整输入yasnippet的片段, 只需要输入部分就能补全yasnippet的片段呢? 很简单,大家看到上面代码中ac-source-yasnippet的定义就明白了,里面有一个(action . yas/expand),你应该猜到了吧,它的意思就是当你选中yasnippet的candidate并且按下回车的时候,auto complete会去执行那个yas/expand,而它正是yasnippet的补全命令。
经上所述,通过auto complete,你用yasnippet更方便了。

现在你该明白了,auto complete和yasnippet的区别了吧。

分享家:Addthis中国
GD Star Rating
loading...
auto complete和yasnippet的区别, 8.0 out of 10 based on 4 ratings 标签:buffer, Elisp, Emacs, face, lightbox, lisp, screenshot, snippet, yasnippet, 光标, 扩展, 插件, 自动提示, 自动补全, 补全, 颜色

相关日志

分类: IDE, 初级, 自动补全
  1. 阅读中
    2011年2月19日11:42 | #1

    补全全路径文件名的backend,补全单独文件名的backend.这两个怎么用啊.

    [回复]

    ahei 回复:

    @阅读中, 加到ac-sources里面就行了

    [回复]

  2. 学习中
    2011年2月28日14:22 | #2

    刚入门,还得折腾,支持一下,学习到了ahei的很多东西

    [回复]

  3. 学习中
    2011年2月28日14:24 | #3

    ahei是百度员工吗?用什么开发?你的 DEA很强大咧

    [回复]

    ahei 回复:

    @学习中, :-) ,是的,当然用Emacs了,呵呵

    [回复]

  4. 过路客的钝刀
    2011年4月10日20:19 | #4

    想问一下,auto complete能否和yasnippet结合起来使用呢?用什么样的配置能让它们共同工作呢?

    [回复]

    ahei 回复:

    @过路客的钝刀, 文中不是说了吗?yasnippet可以作为auto complete的backend

    [回复]

  5. 匿名
    2011年11月17日21:16 | #5

    貌似我装上yasnippet之后,emacs启动速度立马慢了很多
    有没有办法能让速度快一点呢?

    [回复]

  6. 阅读中
    2011年12月25日22:14 | #6

    我同时开了auto complete和yasnippet.但auto-complete不会提示yas的补全啊

    [回复]

    阅读中 回复:

    @阅读中, 能补全,但不会在小缓冲提示补全结果

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: