Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
emacs-在emacs Lisp模式下自动完成_Emacs - Fatal编程技术网

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从来都不是一件好事。