我正在尝试为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?
加载一个函数感谢。
答案 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)
,意味着已加载cl
和cl-seq
一路上的某个地方。所以没有任何魔法可以使这项工作
没有加载这些文件。
答案 1 :(得分:3)
(eval-when-compile <foo>)
表示<foo>
仅在编译文件时执行(或在未编译时运行)。因此,如果您编译文件,生成的文件将不会加载cl
,这是一个问题,因为every
仅在加载cl
时定义。 (eval-when-compile <foo>)
用于加载宏(例如ignore-errors
),因为这些仅在编译期间需要,但every
不是宏,因此是您的问题。