最近我发现了M-x ielm
(Emacs自我REPL)并且惊喜地发现在该模式下有一个工作制表符完成。说,我可以开始输入ecb-
,然后点击TAB,ielm
将显示ECB公开的功能。非常方便探索!
但是,当我开始编辑我的*.el
文件之一(在Emacs Lisp主模式下)时,TAB不再作为自动完成工作并执行缩进,我觉得这很糟糕。
我试图找出自动填充如何在ielm
内工作,以便可能将其移植到Emacs Lisp模式。但是,显然,ielm
中的自动完成使用comint-dynamic-complete
,据我所知,这只适用于基于comint
的缓冲区。我猜,这意味着我在这里运气不好。
那么,我如何为Emacs Lisp启用自动完成功能?
答案 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
。