理解Emacs的补全模式选择

29

似乎有很多不同的 Emacs 自动完成机制。以下是我能想到的一些,而没有进行详尽的搜索:ido、auto-complete、icicles、缓冲区补全、迷你缓冲区补全和默认补全。此外还有代码补全。很多代码补全功能都与语言相关。如果有三个 Emacs 大师总结主要的代码和非代码自动完成方案的优点将会非常有用。由于这里是 Stack Overflow,无需多言,最好能确定哪些自动完成模式最适合 Emacs 的 IDE 类型机制。

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

4个回答

10

关于 Icicles --

大部分情况下,Icicles 是关于 迷你缓冲区 完成的。虽然有一些情况下它提供了一些针对缓冲区(例如代码)的完成,但它主要是关于迷你缓冲区的完成。

当大多数人想到迷你缓冲区完成时,他们会想到文件名完成、缓冲区名完成和命令名完成。但实际上它还有很多其他用途。

作为 Emacs-Lisp 程序员,您可以在任何需要与用户交互选择的地方使用完成。这非常通用!

完成真正关乎的是 模式匹配以定义集合,然后您可以操纵这些集合。

大多数人认为迷你缓冲区完成的唯一目的是选择单个名称(文件、缓冲区、命令、变量等)。但完成的强大之处在于以不同方式过滤和可能排序完整的文件名、缓冲区名等集合,然后让用户对结果的 集合(而不一定是单个对象)进行一些操作。

这就是 Icicles 的目的:让您使用模式匹配来 动态(增量地)定义集合,然后对所选成员或所有成员执行操作。

这不是 Ido 或其他完成包的主要目的,可能例外的是 Helm (Anything)

Helm (Anything) 不同的是,在 Icicles 中,您通常会调用一个 命令以执行某些操作,并且针对给定的 类型(例如缓冲区)的一个或多个对象,然后通过名称匹配来缩小这些对象的集合。在 Icicles 中,通常情况下您可以在同一命令中以多种但相关的方式对这些对象进行操作。

Helm (Anything) 中,通常情况下,您的输入首先是根据对象名称与所有类型的对象的整个宇宙相匹配,之后再缩小选择一些操作。

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

如果你正在做代码补全,通常只需要在光标处完成名称。代码补全最有趣的事情就是确定适当的候选对象。为此,文本(例如代码)上下文通常是至关重要的。为了提供智能选择,补全功能需要分析上下文(代码),包括任何涵盖上下文(例如项目代码)。
另一方面,迷你缓冲区完成可以用于任何类型的选择和操作,包括具有多个动作的多个选择。这里,所有部分都很有趣:提供哪些候选项、你可以用它们做什么等等。
不知道这是否有帮助,但这是我的看法。

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

pabbrev.el - 通过查看单词频率,提供在光标处的建议(按下键即可接受)。我喜欢这个因为它能直观地指示会被完成什么 - 不过它主要只适用于一个补全。

hippie-expand - 通常绑定到M-/代替dabbrev,因为它所做的事情比dabbrev多。当你需要循环浏览一些备选项或者想要完成文件名或其他内容时,它的效果很好。

我喜欢两个补全包,因为它们不需要鼠标移动,并且工作速度很快。


5

我在minibuffer中使用标准的tab补全功能来补全文件名、M-x命令和其他内容。

我还经常使用M-/快捷键(dabbrev-expand)来动态补全Emacs缓冲区中任何单词。它非常棒,特别是对于长变量名。以下是说明文档:

M-/运行dabbrev.el中一个交互式autoloaded Lisp函数dabbrev-expand。
绑定到M-/。
(dabbrev-expand ARG)
"动态"扩展前面的单词。
将扩展到最近的前面的单词,该单词为此前缀。如果找不到适当的前置单词,则考虑点后面的单词。如果仍然找不到适当的单词,则查看由变量'dabbrev-friend-buffer-function'指出的函数接受的缓冲区。
正数前缀参数N表示取第N个向后*不同*的可能性。负参数表示向前搜索。
如果光标从上次扩展结束后没有移动,并且没有给出参数,则用尚未尝试过的下一个可能的扩展替换先前的扩展。
如果设置为非nil,则变量'dabbrev-backward-only'可用于将搜索方向限制为向后。
另请参见'dabbrev-abbrev-char-regexp'和C-M-/。

4
你可以使用company-mode或autocomplete包,它们可以使用不同的完成源,包括CEDET,并且它们也允许定义新的完成源...对于一些编程语言,你可以直接使用CEDET。

2
你可能指的是http://cx4a.org/software/auto-complete/index.html,奇怪的是没有人提到它。根据我的经验,这是最好的选择。 - VitoshKa
是的,我指的就是这个包 - 我总是忘记哪个包含'-'符号,哪个不包含;-) - Alex Ott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接