我一直在用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
的变体,但似乎都没有效果。
答案 0 :(得分:3)
以下分析基于主分支的startup.el
:https://github.com/emacs-mirror/emacs/blob/master/lisp/startup.el
正如我理解这个问题,它寻求一个答案,关于何时运行命令行选项-l
aka --load
FILE与使用{初始化*scratch*
缓冲区的时间相比较{1}}默认情况下为initial-major-mode
。
根据lisp-interaction-mode
中定义的事件顺序,startup.el
或-l
选项在函数--load
的第2381行被考虑。
函数command-line-1
在command-line-1
的第1366行运行,该行位于第{13}行的startup.el
之后,after-init-hook
缓冲区之后使用{{初始化*scratch*
缓冲区1}}在第1350行。
如果原始海报希望依赖于使用initial-major-mode
或-l
选项手动加载文件,那么分配给--load
的功能将不会在第1350行,因为它们在lisp-interaction-mode-hook
在第1366行运行之前不存在。原始海报可能希望考虑的一个选项如下:command-line-1
在之后{{1}已添加到(with-current-buffer "*scratch*" (lisp-interaction-mode))
。
答案 1 :(得分:0)
如果从命令行启动Emacs,则可以调用该函数以在加载序列即将结束时运行,如下所示:
emacs -f lisp-interaction-mode
请参见手册中的Action Arguments:
“-f功能”
‘-funcall = function’
调用Lisp函数功能。如果它是一个交互式函数(命令),它将以交互方式读取参数,就像您已使用键序列调用了相同的函数一样。否则,它将调用不带参数的函数。