使用 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-1
在startup.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 时将钩子添加到默认模式的主要内容,如果未能解决你的问题,请参考以下文章