eval-when-compile不被尊重?

时间:2012-04-11 11:36:45

标签: emacs elisp

我正在尝试为emacs 24.1.50.1安装ace-jump-mode。

我已经安装了M-x package-install,并且调用M-x ace-jump-mode激活它并提示输入一封信,但在输入信件时,我收到错误:

Symbol's function definition is void: every

运行emacs -q(然后像我在.emacs文件中一样运行(add-to-list 'load-path "~/.emacs.d/elpa"))允许我加载ace-jump-mode并且它的功能没有问题。假设我的.emacs中存在错误,我在.emacs中注释掉了所有内容,并定期重新打开emacs,但仍然会收到错误。

从一些搜索中,我认为问题是ace-jump-mode.el

中的代码
(eval-when-compile
  (require 'cl))
当我不使用emacs -q时,

无法正常工作。当我M-x加载库cl时,一切正常。

我想,因为我在网上找不到任何引用,它不是常见的bug,所以它一定是我配置的问题。我知道我可以在我的.emacs中加载cl,但我认为不需要为一个函数加载整个包。

有谁知道如何解决这个问题?或者,如何只从cl?

加载一个函数

感谢。

2 个答案:

答案 0 :(得分:4)

Emacs是自我记录, C-h f每个会告诉你这个 函数在cl-extra而非cl中定义,但加载cl会自动加载,因此 它确实可用。

加载cl如何加载的一些事情可能已经改变了Emacs 24,其中 打破这个图书馆,我不确定。就像你发现的那样,最容易解决的问题是 只是

(require 'cl)

在你的init文件中。这并不像你说的那么重要。一个很多 您可能会使用的库无论如何都会这样做,所以很可能你就是这样 改变订单加载的顺序。

另一种方法是向ace-jump-mode的作者提交补丁 避免使用every,这更不方便。

最后,如果你让ace-jump-mode工作,那是因为你加载了。{ 未编译的“.el”文件,而不是编译后的“.elc”文件 运行(require 'cl),意味着已加载clcl-seq 一路上的某个地方。所以没有任何魔法可以使这项工作 没有加载这些文件。

答案 1 :(得分:3)

(eval-when-compile <foo>)表示<foo>仅在编译文件时执行(或在未编译时运行)。因此,如果您编译文件,生成的文件将不会加载cl,这是一个问题,因为every仅在加载cl时定义。 (eval-when-compile <foo>)用于加载(例如ignore-errors),因为这些仅在编译期间需要,但every不是宏,因此是您的问题。