2012-04-11 79 views
2

我正在嘗試爲emacs 24.1.50.1安裝ace-jump-mode。eval-when-compile沒有被尊重?

我和包的Mx安裝安裝了它,並調用的Mx王牌跳躍模式激活它並提示函,但在輸入一個字母,我得到的錯誤:

Symbol's function definition is void: every 

運行emacs -q(然後運行(add-to-list 'load-path "~/.emacs.d/elpa")就像我在我的.emacs文件中)允許我加載ace跳轉模式,它的功能沒有問題。假設我的.emacs中存在錯誤,我在.emacs中註釋了所有內容,並定期重新打開emacs,但仍然出現錯誤。

從一些周圍搜索,我認爲這個問題是王牌跳mode.el

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

工作不正常時,我不使用emacs -q代碼。當我M-x加載庫cl,一切工作正常。

我想,因爲我找不到任何對這個在線的引用,它不是一個常見的錯誤,所以它必須是我的配置問題。我知道我可以在我的.emacs中加載cl,但是我不認爲只需要爲一個函數加載整個包即可。

有誰知道如何解決這個問題?或者,如何只從cl加載一個函數?

謝謝。

回答

4

Emacs是自我記錄,C-H F中的任意會告訴你,這 功能在cl-extracl定義,但裝載cl自動加載它,所以 它變得可用。

有些事情與如何加載cl可能已經改變與Emacs 24,其中 打破了這個庫,我不確定。就像你發現了,最簡單的解決方法是 只是

(require 'cl) 
在init文件

。這並不是一個大問題。 A lot of 您可能會使用的庫無論如何都會這樣做,所以很可能您只是更改訂單加載順序的 。

另一種方法是向ace-jump-mode 的作者提交補丁,避免使用every,這樣更加不方便。

最後,如果你得到了ace-jump-mode工作,這是因爲您加載的 未編譯「.el」的文件代替編譯「.elc」的文件,這將有 運行(require 'cl),它意味着:clcl-seq會已經在路上的某處加載了 。所以沒有任何魔法可以使這個工作 沒有加載這些文件。

+0

您還可以在字節編譯'.emacs'時添加'(byte-compile-disable-warning'cl-functions)'以禁用警告。 – Daimrod 2012-04-11 13:48:49

3

(eval-when-compile <foo>)意味着<foo>僅在編譯文件時(或未編譯時)執行。所以如果你編譯你的文件,生成的文件將不會加載cl,這是一個問題,因爲every僅在加載cl時定義。 (eval-when-compile <foo>)用於加載(如ignore-errors),因爲這些僅在編譯期間需要,但every不是宏,因此您的問題。

+0

有沒有一種方法可以在eval-when-compile時使它在這裏工作? – Josh 2012-04-11 15:18:59

+0

@Josh:是的,只是不要在'(require'cl) – Stefan 2012-04-12 15:50:43