emacs - Emacs Lisp模式下的自动完成

时间:2011-08-11 08:25:40

标签: emacs

最近我发现了M-x ielm(Emacs自我REPL)并且惊喜地发现在该模式下有一个工作制表符完成。说,我可以开始输入ecb-,然后点击TAB,ielm将显示ECB公开的功能。非常方便探索!

但是,当我开始编辑我的*.el文件之一(在Emacs Lisp主模式下)时,TAB不再作为自动完成工作并执行缩进,我觉得这很糟糕。

我试图找出自动填充如何在ielm内工作,以便可能将其移植到Emacs Lisp模式。但是,显然,ielm中的自动完成使用comint-dynamic-complete,据我所知,这只适用于基于comint的缓冲区。我猜,这意味着我在这里运气不好。

那么,我如何为Emacs Lisp启用自动完成功能?

2 个答案:

答案 0 :(得分:31)

在最新版本的Emacs中,您可以使用一些鲜为人知的内置功能来启用TAB:

(setq tab-always-indent 'complete)
(add-to-list 'completion-styles 'initials t)

通过此设置,TAB - 通常绑定到indent-for-tab-command - 首先尝试根据模式的设置调整缩进,但如果缩进已经正确,则触发完成。这通常是理想的行为,恕我直言的效果比第三方插件smart-tab更好。

但请注意,在某些模式下,TAB未绑定到indent-for-tab-command,因此这些模式需要进一步重新绑定,例如与smart-tab。此外,当模式具有“弹跳缩进”(例如python-mode)时,此技术也将无效。

答案 1 :(得分:2)

我发现有时候缩进和完成都很有用,所以我有一个函数可以根据我做的最后一件事是否插入文本来选择:

(global-set-key [tab] 'indent-or-expand)
(defun indent-or-expand ()
  "Either indent according to mode, or expand the word preceding point."
  (interactive)
  (if (or
       (eq last-command 'self-insert-command)
       (eq last-command 'dabbrev-expand))
      (progn
        (setq this-command 'dabbrev-expand)
        (dabbrev-expand nil))
    (indent-according-to-mode)))

如果您愿意,您可以使用comint-dynamic-complete代替dabbrev,但我发现dabbrev适用于emacs lisp - 特别是与completer.el结合使用时将f-f-r-o扩展为find-file-read-only