27

似乎有许多替代的 Emacs 自动完成机制。如果没有详尽的搜索,就会想到以下内容:ido、自动完成、icicles、缓冲区内完成、迷你缓冲区完成和开箱即用的标准完成。然后是代码完成。很多。而且很大程度上取决于语言。让一个或三个 Emacs 专家总结主要参与者在代码和非代码自动完成方面的好处将非常有用。这就是 Stack Overflow,不言而喻,最好确定最适合 Emacs 的类似 IDE 机制的自动完成模式。

更新:我刚刚发现了 Emacs Wiki 完成页面,它放大了我的基本问题:在所有这些选择中,什么是好的,什么是不太好的,如果你只能玩 2-3,你会推荐哪个?

4

4 回答 4

8

冰柱—— _

在大多数情况下,Icicles 是关于minibuffer的完成。在少数情况下,它为缓冲区内(例如代码)完成提供了一些东西,但主要是关于小缓冲区完成。

当大多数人想到 minibuffer 完成时,他们会想到文件名完成、缓冲区名完成和命令名完成。但还有很多

作为一个 Emacs-Lisp 程序员,你可以在任何你想给用户交互选择的地方使用完成。这很一般!

完成实际上是关于定义集合的模式匹配,然后您可以对其进行操作。

大多数人认为 minibuffer 补全的唯一目的是选择一个名称(文件、缓冲区、命令、变量……)。但是完成的力量实际上是以不同的方式过滤并可能对完整的文件名、缓冲区名等进行排序,然后让用户对结果(不一定是单个对象)做一些事情。

这就是Icicles的意义所在:让您使用模式匹配动态(增量)定义集合,然后作用于选定的成员或这些集合的所有成员。

这不是Ido或其他完成包的目标,可能除了Helm (Anything)

Helm (Anything)不同,它将对象名称优先于对象类型和操作作为其起点,在Icicles中,您通常调用命令对给定类型的一个或多个对象(例如缓冲区)执行某些操作,然后缩小范围这些对象的集合,通常通过名称匹配。在Icicles中,您通常可以在同一命令中以多种但相关的方式对这些对象进行操作。

Helm (Anything)中,通常您的输入首先通过对象名称与所有类型对象的整个世界进行匹配,然后您缩小范围以选择一些要执行的操作。

最后,请记住,各种补全方法中的每一种都为最终用户提供了一些东西(例如命令),也为程序员提供了一些东西(例如完成功能)。

如果您正在执行代码完成,那么您通常只想在 point 处完成名称。代码完成的主要有趣之处在于确定合适的候选者是什么。为此,文本(例如代码)上下文通常是最重要的。为了提供明智的选择,完成功能需要分析上下文(代码),包括任何包含上下文(例如项目代码)。

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

不知道这是否有帮助,但无论如何这是我的看法。

于 2011-08-21T23:52:01.243 回答
7

我通常使用两个完成包(除了 minibuffer 和 comint 缓冲区中的内置 TAB 完成)。

pabbrev.el - 在光标处提供建议(按TAB)接受。通过查看词频做出选择。我喜欢这个,因为视觉指示将完成什么 - 但它主要只适用于一个完成。

hippie-expand - 它通常会M-/代替 dabbrev,因为它完成了 dabbrev 所做的一切,甚至更多。当您可能需要循环通过一些替代方案,或者如果您想要完成文件名或其他内容时,这很有效。

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

于 2010-01-20T22:35:53.417 回答
4

我在 minibuffer 中对文件名、M-x命令和其他内容使用标准制表符完成。

我还经常使用M-/击键 ( dabbrev-expand) 来动态完成任何 Emacs 缓冲区中的任何单词。这太棒了,尤其是对于长变量名。这是文档:

M-/ 运行命令 dabbrev-expand,这是一个交互式
`dabbrev.el' 中自动加载的 Lisp 函数。

它绑定到 M-/。

(dabbrev-expand ARG)

展开前面的单词“动态”。

扩展至以 this 为前缀的最近的、前面的单词。
如果没有找到合适的前面的词,点后面的词是
经过考虑的。如果仍然没有找到合适的词,那么在
变量所指向的函数所接受的缓冲区
`dabbrev-friend-buffer-function'。

一个正前缀参数 N 表示将第 N 个向后 *distinct*
可能性。一个否定的论点说向前搜索。

如果光标没有从前一个展开的末尾移动,并且
没有给出参数,替换之前的扩展
下一个可能的扩展尚未尝试。

变量 `dabbrev-backward-only' 可用于限制
如果设置为非零,则搜索方向向后。

另见 `dabbrev-abbrev-char-regexp' 和 CM-/。
于 2010-01-20T09:28:20.463 回答
4

您可以查看公司模式或自动完成包,它可以使用不同的完成源,包括 CEDET,它们还允许定义新的完成源...对于某些编程语言,您可以直接使用 CEDET...

于 2010-01-20T09:45:05.727 回答