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

时间:2016-03-24 02:03:57

标签: emacs dot-emacs

我一直在用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的变体,但似乎都没有效果。

2 个答案:

答案 0 :(得分:3)

以下分析基于主分支的startup.elhttps://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-1command-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函数功能。如果它是一个交互式函数(命令),它将以交互方式读取参数,就像您已使用键序列调用了相同的函数一样。否则,它将调用不带参数的函数。