Flycheck 报告 "Cannot open load file" 尽管 "load-path" 列表正确

Flycheck reports "Cannot open load file" despite proper "load-path" list

在我的 ~/.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 不起作用。

Flycheck 不会 运行 代码,而是对其进行编译(以获取编译器的警告)。当编译器处理 (require 'init-vars) 时,它将尝试从 "current" load-path 加载 init-vars 但是由于第一行是编译而不是执行,文件所在的 Emacs 会话compiled 仍然具有默认的 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.