emacs-在emacs Lisp模式下自动完成
最近,我发现了emacs-在emacs Lisp模式下自动完成,emacs,Emacs,最近,我发现了M-x ielm(Emacs self-REPL),并惊喜地发现在该模式下有一个工作标签完成。比如说,我可以开始键入ecb-,然后点击TAB键,ielm将显示ecb公开了哪些函数。非常方便探索 然而,当我开始编辑一个*.el文件(在Emacs Lisp主模式下)时,TAB不再作为自动完成并执行缩进,我发现这很不幸 我试图弄清楚自动补全在ielm中是如何工作的,以便有可能将其移植到Emacs Lisp模式中。然而,显然,ielm中的自动完成使用了comint dynamic comp
M-x ielm
(Emacs self-REPL),并惊喜地发现在该模式下有一个工作标签完成。比如说,我可以开始键入ecb-
,然后点击TAB键,ielm
将显示ecb公开了哪些函数。非常方便探索
然而,当我开始编辑一个*.el
文件(在Emacs Lisp主模式下)时,TAB不再作为自动完成并执行缩进,我发现这很不幸
我试图弄清楚自动补全在ielm
中是如何工作的,以便有可能将其移植到Emacs Lisp模式中。然而,显然,ielm
中的自动完成使用了comint dynamic complete
,据我所知,它只在基于comint
的缓冲区中工作。我想,这意味着我在这里运气不好
那么,如何为Emacs Lisp启用自动补全功能呢?我发现缩进和补全有时都很有用,所以我有一个函数,可以根据我最后做的事情是否插入文本来选择:
(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
扩展为查找文件只读
,在emacs的最新版本中,您可以使用一项鲜为人知的内置功能来实现选项卡完成:
(setq tab-always-indent 'complete)
(add-to-list 'completion-styles 'initials t)
使用此设置,TAB
(通常绑定到indent for TAB命令
)首先尝试根据模式设置调整缩进,但如果缩进已经正确,则触发完成。这通常是所期望的行为,并且IMHO比第三方插件(如)工作得更好
但是,请注意,在某些模式中,
选项卡
未绑定到选项卡命令的缩进,因此这些模式需要进一步重新绑定,例如使用智能选项卡
。此外,当模式具有“反弹缩进”(例如,python模式
)时,此技术也将不起作用。Smart idea。当您只是想缩进时意外地调用completion从来都不是一件好事。