在我的~/.emacs.d/init.el
中,我只有三行:
(push (expand-file-name "lisp" user-emacs-directory) load-path)
(require 'init-vars)
(provide 'init)
在我的~/.emacs.d/lisp/init-vars.el
中,我有以下三行内容:
(require 'dired)
(setq dired-use-ls-dired nil)
(provide 'init-vars)
Flycheck 在line 2 of ~/.emacs.d/init.el
报告错误:
Cannot open load file: No such file or directory, init-vars
我在这里想念什么?
如果我将行更改为(require 'init-vars (expand-file-name "lisp/init-vars.el" user-emacs-directory))
,则错误消失了。我不明白为什么load-path
无法正常工作。
答案 0 :(得分:1)
Flycheck不会运行代码,而是对其进行编译(以获取编译器的警告)。当编译器处理(require 'init-vars)
时,它将尝试从“当前” init-vars
加载load-path
,但是由于第一行是编译而不是执行的,因此仍在编译文件的Emacs会话中具有默认的load-path
值,并添加了额外的~/.emacs.d/lisp
目录。
解决问题的一种方法是使用eval-when-compile
:
(eval-when-compile
(push (expand-file-name "lisp" user-emacs-directory) load-path))
顺便说一句,我建议您在此处使用add-to-list
而不是push
(否则,请使用cl-pushnew
),以便重复执行该代码不会继续添加该目录的冗余副本到您的load-path
。