理解 Emacs 完成模式选择

Posted

技术标签:

【中文标题】理解 Emacs 完成模式选择【英文标题】:Making sense out of Emacs completion mode choices 【发布时间】:2011-01-07 04:40:54 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

我在 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' 和 C-M-/。

【讨论】:

【参考方案2】:

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

【讨论】:

你的意思可能是cx4a.org/software/auto-complete/index.html,奇怪的是没有人提到它。这是我的经验中最好的。 是的,我的意思是这个包——我总是忘记哪个包含'-'符号而哪个不是;-)【参考方案3】:

我一般使用两个补全包(除了minibuffer和comint buffers中内置的TAB补全)。

pabbrev.el - 在光标处提供建议(按 TAB)接受。通过查看词频做出选择。我喜欢这个,因为它可以直观地显示要完成的内容 - 但它通常只适用于一次完成。

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

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

【讨论】:

【参考方案4】:

Icicles --

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

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

作为 Emacs-Lisp 程序员,您可以在任何您希望以交互方式为用户提供选择的地方使用完成。很笼统!

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

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

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

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

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

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

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

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

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

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

【讨论】:

以上是关于理解 Emacs 完成模式选择的主要内容,如果未能解决你的问题,请参考以下文章

Emacs,自动完成模式,CSS,痛苦。 (插图!)

使自动完成和 yasnippet 模式协同工作以在 GNU/Emacs 中编辑特定文件

Emacs shell 模式中的 Bash 自动完成

Emacs 补全:自动补全还是公司? [关闭]

Emacs术语模式:通过双击鼠标选择单词

默认情况下,使emacs以控制台模式(-nw)运行