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

Posted

技术标签:

【中文标题】使用 emacs -q -l 时将钩子添加到默认模式【英文标题】:Add hook to default mode when using emacs -q -l 【发布时间】:2016-03-24 02:03:57 【问题描述】:

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

(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 的变体,但似乎都没有。

【问题讨论】:

lisp-interaction-mode 在启动过程的早期就在*scratch* 中的startup.el 中启动。因此,您需要直接为*scratch* 缓冲区调用所需的函数,而不是依赖已经运行的lisp-interaction-mode-hook。请参阅startup.el(主分支)的第 1350 行:github.com/emacs-mirror/emacs/blob/master/lisp/startup.el 您可以通过在暂存缓冲区中评估 (funcall initial-major-mode) 来测试该理论,然后调用钩子并产生预期的效果。 我看到 after-init-hook 实际上是在主分支 startup.el 的第 1344 行运行的,因此在逻辑上应该通过运行在第 1350 行的代码看到附加到该挂钩的内容。你在运行 Emacs 吗? 我需要自己运行一些测试才能发布答案,也许其他人会在我之前得到它。我目前正在从事另一个与 Emacs 相关的爱好项目。 . .并在 Emacs 构建时检查 ***。 . . 【参考方案1】:

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

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

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

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

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

【讨论】:

with-current-buffer 的建议对我不起作用。【参考方案2】:

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

emacs -f lisp-interaction-mode

参见手册中的Action Arguments:

‘-f函数’

‘--funcall=function’

调用 Lisp 函数函数。如果它是一个交互式函数(一个命令),它会交互式地读取参数,就像您使用按键序列调用相同的函数一样。否则,它会调用不带参数的函数。

【讨论】:

以上是关于使用 emacs -q -l 时将钩子添加到默认模式的主要内容,如果未能解决你的问题,请参考以下文章

使用R会话和并排窗口启动Emacs?

emacs smartscan 更改键绑定

emacs ctrl-space与输入法冲突

删除一个单词而不将其添加到 Emacs 中的 kill-ring

如何在应用安装时将我的应用快捷方式添加到主屏幕? [复制]

如何对 .emacs.d 目录中的所有内容进行字节编译?