理解Emacs完成模式选择

paj*_*to0 27 emacs autocomplete code-completion icicles

There appears to be many alternative Emacs auto completion mechanisms. Without an exhaustive search, the following come to mind: ido, auto-complete, icicles, in buffer completion, minibuffer completion and standard out of the box completion. And then there is code completion. Lots of it. And much of it language dependent. It would be very useful to have an Emacs guru, or three, summarize the benefits of the major players in both code and non-code auto-completion. And this being Stack Overflow, it goes without saying that it would be good to identify the auto completion modes that work best for Emacs's IDE-like mechanisms.

Update: I just discovered the Emacs Wiki completion page which amplifies my basic question: of all these choices, what's good, what's less good and if you could only play with 2-3 which would you recommend?

Dre*_*rew 8

Wrt 冰柱 -

在大多数情况下,冰柱是关于迷你缓冲区的完成.在一些情况下,它提供了缓冲区内(例如代码)完成的东西,但它主要是关于迷你缓冲区完成.

当大多数人想到迷你缓冲区完成时,他们会想到文件名完成,缓冲区名称完成和命令名称完成.但是有一个很多更给它.

作为Emacs-Lisp程序员,您可以在任何地方使用完成,以便用户以交互方式进行选择.这很普遍!

完成实际上是关于模式匹配来定义集合,然后您可以操作它们.

大多数人认为迷你缓冲区完成的唯一目的是选择一个名称(文件,缓冲区,命令,变量......).但是,完成的强大功能实际上是以不同的方式过滤并可能对整套文件名,缓冲区名称等进行排序,然后让用户对结果(或不一定是单个对象)执行某些操作.

这就是Icicles的用法:让你动态(逐步)使用模式匹配来定义集合,然后对选定的成员或这些集合的所有成员进行操作.

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

不像头盔(任何),其权限对象名称在对象类型,并为出发点的动作,在冰柱您通常调用命令做一些事情,以给定的一个或多个对象类型(例如缓存),并且然后您缩小这些对象的集合,通常通过名称匹配.在Icicles中通常情况下,您可以在同一命令中以多种但相关的方式对这些对象进行操作.

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

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

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

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

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


Tre*_*son 7

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

pabbrev.el - 在光标处提供建议(按TAB)接受.通过查看单词频率来做出选择.我喜欢这个,因为可以看到完成的内容 - 但它主要适用于一次完成.

嬉皮 - 扩展 - 这通常必然M-/代替dabbrev,因为它完成了dabbrev所做的所有事情.当您可能需要循环使用某些替代方法,或者您想要完成文件名或其他内容时,这种方法很有效.

我喜欢这两个因为它们不需要任何鼠标移动并且工作很快.


Pau*_*son 5

我在迷你缓冲区中使用标准制表符补全来表示文件名、M-x命令和其他内容。

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

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

它与M-/绑定。

(dabbrev-展开 ARG)

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

扩展到以此为前缀的最近的前一个单词。
如果没有找到合适的前面的单词,则点后面的单词
经过考虑的。如果仍然没有找到合适的单词,则查看
变量指定的函数接受的缓冲区
`dabbrev-friend-buffer-function'。

正前缀参数 N 表示向后取第 N 个*不同*
可能性。否定参数表示向前搜索。

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

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

另请参见“dabbrev-abbrev-char-regexp”和 CM-/。