我的emacs init.el文件存在问题,这让我很疯狂。
我的init.el将load-path设置为一堆加载项,然后调用一些需求。
Emacs加载正常并且一切正常但是elche的flycheck标记了init.el中的第一个 require 语句,而#34;无法打开加载文件"如果我进行字节编译,它也会给我同样的错误。
我创建了最简单的示例,可以重新创建问题,并使用emacs 24.3(9.0)在MacOs X和Ubuntu上测试它。两个测试都给我同样的错误。
这是一个例子:
;; init.el --- entry point for configuration
(add-to-list 'load-path "~/.emacs.d/.")
(add-to-list 'load-path "~/.emacs.d/exec-path-from-shell")
(require 'test)
(require 'exec-path-from-shell)
;; test.el --- test lives in "~/.emacs.d"
(defvar test-var "this is test")
(provide 'test)
错误:
vagrant@elsa:~/.emacs.d$ pwd
/home/vagrant/.emacs.d
vagrant@elsa:~/.emacs.d$ sudo make
emacs --batch --eval "(byte-recompile-directory \".\" 0)"
Loading 00debian-vars...
Loading /etc/emacs/site-start.d/50autoconf.el (source)...
Checking /home/vagrant/.emacs.d...
Compiling /home/vagrant/.emacs.d/init.el...
In toplevel form:
init.el:5:1:Error: Cannot open load file: test
Checking /home/vagrant/.emacs.d/auto-save-list...
Checking /home/vagrant/.emacs.d/bin...
Checking /home/vagrant/.emacs.d/exec-path-from-shell...
Done (Total of 0 files compiled, 1 failed, 2 skipped in 2 directories)
vagrant@elsa:~/.emacs.d$
如果我更改require语句的顺序()
(require 'exec-path-from-shell)
(require 'test)
错误将变为:
In toplevel form:
init.el:5:1:Error: Cannot open load file: exec-path-from-shell
发生了什么事?我做错了什么?
问候,罗马
答案 0 :(得分:7)
字节编译器不会正常评估顶级表单。 require
是一种特殊情况,但扩展add-to-list
的{{1}}调用对字节编译器不可见。
您需要将它们包装在load-path
:
eval-and-compile
这会强制字节编译器评估这些调用,因此(eval-and-compile
(add-to-list 'load-path "~/.emacs.d/.")
(add-to-list 'load-path "~/.emacs.d/exec-path-from-shell"))
在编译时正确扩展。
请注意,您不应将load-path
添加到~/.emacs.d
,如果您这样做,字节编译器会发出警告。
您应该只使用package.el来安装软件包。它会自动处理所有这些。