* first * require语句中的emacs字节编译错误

时间:2014-04-27 14:42:55

标签: emacs elisp

我的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

发生了什么事?我做错了什么?

问候,罗马

1 个答案:

答案 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来安装软件包。它会自动处理所有这些。