使用 emacs -q -l 时将钩子添加到默认模式

Add hook to default mode when using emacs -q -l

我一直在用 emacs -q -l "init.el" 加载 emacs 相当多,并试图在我的暂存缓冲区中启用自动完成。我一直在努力弄清楚为什么它不起作用,但意识到它必须与像这样加载 emacs 时的操作顺序有关 - 使用以下初始化文件进行快速测试:

(package-initialize)
(require 'auto-complete)
(ac-config-default)
(add-hook 'lisp-interaction-mode-hook
      '(lambda ()
         (auto-complete-mode t)))

显示从命令行正常调用 emacs 时完成工作如我所愿。但是如果我将其称为 emacs -q -l init.el 则没有下拉完成。

问题:我怎样才能得到这个钩子 运行?

我尝试了 after-init-hook 的变体,但 none 似乎有效。

以下分析基于master分支的startup.elhttps://github.com/emacs-mirror/emacs/blob/master/lisp/startup.el

据我了解这个问题,它寻求关于命令行选项 -l 又名 --load FILE 何时为 运行 与 *scratch* 相比的答案缓冲区使用 initial-major-mode 初始化,默认情况下为 lisp-interaction-mode.

根据 startup.el 中定义的事件顺序,在函数 command-line-1 的第 2381 行考虑了 -l--load 选项。

函数command-line-1 运行s 在startup.el 的第1366 行,它在第1344 行的after-init-hook 之后和*scratch* 之后正在使用第 1350 行的 initial-major-mode 初始化缓冲区。

如果原始发帖者希望使用 -l--load 选项手动加载文件,那么分配给 lisp-interaction-mode-hook 的功能将不会在第 1350 行看到,因为它们在第 1366 行 command-line-1 运行s 之前不存在。原始发布者可能希望考虑的一个选项如下:(with-current-buffer "*scratch*" (lisp-interaction-mode)) 之后 auto-complete-mode 已添加到 lisp-interaction-mode-hook

如果从命令行启动 Emacs,您可以在加载序列接近尾声时调用函数 运行,如下所示:

emacs -f lisp-interaction-mode

参见手册中的Action Arguments

‘-f function’

‘--funcall=function’

Call Lisp function function. If it is an interactive function (a command), it reads the arguments interactively just as if you had called the same function with a key sequence. Otherwise, it calls the function with no arguments.