2

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

我已经用 Mx package-install 安装了它,调用 Mx ace-jump-mode 会激活它并提示输入字母,但是在输入字母时,我收到错误:

Symbol's function definition is void: every

运行emacs -q(然后(add-to-list 'load-path "~/.emacs.d/elpa")像我在 .emacs 文件中一样运行)允许我加载 ace-jump-mode 并且它可以正常运行。因此假设错误存在于我的 .emacs 中,我将 .emacs 中的所有内容都注释掉,并定期重新打开 emacs,但仍然出现错误。

通过一些搜索,我认为问题出在 ace-jump-mode.el 中的代码

(eval-when-compile
  (require 'cl))

不使用时无法正常工作emacs -q。当我 Mx 加载库 cl 时,一切正常。

我想,由于我在网上找不到任何对此的参考,这不是一个常见的错误,所以它一定是我的配置有问题。我知道我可以在我的 .emacs 中加载 cl,但我认为不需要为一个函数加载整个包。

有谁知道如何解决这一问题?或者,如何从 cl 中只加载一个函数?

谢谢。

4

2 回答 2

4

Emacs 是自我记录的,C-h f every会告诉你这个函数是在cl-extranot中定义的cl,但是加载cl会自动加载它,所以它确实可用。

Emacs 24 的加载方式可能发生了一些cl变化,这破坏了这个库,我不确定。就像您发现的那样,最简单的解决方法就是

(require 'cl)

在你的初始化文件中。这并不像你说的那么重要。无论如何,您可能使用的许多库都会这样做,因此您可能只是在更改加载内容的顺序。

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

最后,如果您开始ace-jump-mode工作,那是因为您加载了未编译的“.el”文件而不是已编译的“.elc”文件,后者本来可以运行(require 'cl),这意味着两者都clcl-seq被加载到某个地方。所以没有任何魔法可以在不加载这些文件的情况下完成这项工作。

于 2012-04-11T13:40:58.803 回答
3

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

于 2012-04-11T14:10:14.267 回答