2010-01-20 57 views
27

似乎有许多可选的Emacs自动完成机制。没有详尽的搜索,就会想到以下内容:ido,自动完成,冰柱,缓冲区完成,minibuffer完成和标准开箱即用完成。然后是代码完成。很多。其中很大一部分依赖于语言。拥有一个Emacs guru(或三个)可以非常有用地总结主要参与者在代码和非代码自动完成方面的优势。这就是堆栈溢出,不言而喻,确定最适合Emacs IDE类机制的自动完成模式将是一件好事。理解Emacs完成模式选项

更新:我刚刚发现the Emacs Wiki completion page,放大我的基本问题:所有这些选择,什么是好,什么是不太好的,如果你只能用2-3打,你会建议?

回答

7

我通常使用两个完成包(除了minibuffer和comint缓冲区中的内置TAB完成之外)。 (提示TAB)接受。通过查看词频来做出选择。我喜欢这个,因为它可以完成什么的视觉指示 - 但它大多只适用于一个完成。

hippie-expand - 它通常绑定到M-/代替dabbrev,因为它可以完成所有的dabbrev和更多功能。当你可能需要循环一些选择,或者如果你想完成一个文件名或其他的东西时,这很有效。

我喜欢这两个,因为它们不需要任何鼠标移动并且可以快速工作。

4

我在minibuffer中使用文件名的标准选项卡完成,M-x命令和其他东西。

我还经常使用M-/ keystroke(dabbrev-expand)动态完成任何Emacs缓冲区中的任何单词。这太棒了,特别是对于长变量名称。下面是文档:

 
M-/ runs the command dabbrev-expand, which is an interactive 
autoloaded Lisp function in `dabbrev.el'. 

It is bound to M-/. 

(dabbrev-expand ARG) 

Expand previous word "dynamically". 

Expands to the most recent, preceding word for which this is a prefix. 
If no suitable preceding word is found, words following point are 
considered. If still no suitable word is found, then look in the 
buffers accepted by the function pointed out by variable 
`dabbrev-friend-buffer-function'. 

A positive prefix argument, N, says to take the Nth backward *distinct* 
possibility. A negative argument says search forward. 

If the cursor has not moved from the end of the previous expansion and 
no argument is given, replace the previously-made expansion 
with the next possible expansion not yet tried. 

The variable `dabbrev-backward-only' may be used to limit the 
direction of search to backward if set non-nil. 

See also `dabbrev-abbrev-char-regexp' and C-M-/. 
4

你可以看一下公司的模式或自动完成包,可能使用不同的完成源,包括CEDET,而且他们还允许定义新建成的来源...... 对于一些编程语言,你可以直接使用CEDET ...

+2

你可能是指http://cx4a.org/software/auto-complete/index.html,奇怪的是没有人提到它。这是我的经验中最好的。 – VitoshKa 2012-01-20 14:36:05

+0

是的,我的意思是这个软件包 - 我总是忘记哪个包含' - '符号而不是;-) – 2012-01-20 18:42:27

8

WRT Icicles -

在大多数情况下,冰柱大约小缓冲区完成。有几种情况提供了缓冲区内(例如代码)完成的功能,但主要是关于小型缓冲区的完成。

当大多数人想到minibuffer完成时,他们会考虑文件名完成,缓冲区名称完成和命令名完成。但它更多的是lot

作为一名Emacs-Lisp编程人员,您可以在任何想要以交互方式向用户提供选择的地方使用完成功能。这很一般!

完成实际上是关于模式匹配来定义集合,然后您可以操作。大多数人认为minibuffer完成的唯一目的是选择一个名称(文件,缓冲区,命令,变量,...)。但是完成的力量实际上是以不同的方式过滤并且可能对整套文件名,缓冲区名称等进行排序,然后让用户对结果设置(不一定是单个对象) 。

这就是冰柱大概是:让你动态(增量)使用定义设置模式匹配,然后在选定的成员还是那些集的所有成员采取行动。

这与其说的目的或其它完成封装,头盔(任何)可能是个例外。

不像Helm (Anything),其权限对象在对象类型和行动为出发点,在冰柱你通常调用命令做一些到给定类型的一个或多个对象(例如,缓冲区),然后然后您缩小这些对象的集合,通常通过名称匹配。在冰柱中经常出现这种情况,您可以在同一命令中以多种但相关的方式处理这些对象。

头盔(任何),在一般的输入是通过对象名称第一个匹配的对所有类型的对象的整个宇宙,后来你缩小挑选一些操作(一个或多个)来执行。

最后,请记住,各种完成方法都为最终用户提供了某些内容(例如命令),并为程序员提供了某些内容(例如完成功能)。

如果你正在做代码完成那么你一般只想完成名称。有关代码完成的主要问题是确定合适的候选人是什么。为此,文本(例如代码)上下文通常是非常重要的。为了提供明智的选择,完成功能需要分析上下文(代码),包括任何包含的上下文(例如项目代码)。

另一方面,Minibuffer完成可用于任何种类的选择和操作,包括具有多个操作的多项选择。在这里,所有的部分都很有趣:提供什么候选人,你可以用他们做什么等等。

不知道是否有帮助,但这是我的反应。