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。load-library cl を Mx すると、すべて正常に動作します。

このオンラインへの参照が見つからないため、一般的なバグではないため、構成の問題であるに違いないと思います。cl を .emacs にロードするだけでよいことはわかっていますが、1 つの関数のためだけにパッケージ全体をロードする必要があるとは思いません。

これを修正する方法を知っている人はいますか?または、cl から関数を 1 つだけロードする方法は?

ありがとう。

4

2 に答える 2

4

Emacs は自己文書化C-h f everyされており、この関数がcl-extranotclで定義されていることが示されますが、ロードclすると自動ロードされるため、使用可能になります。

Emacs 24 でロード方法clが変更され、このライブラリが壊れた可能性がありますが、確かではありません。あなたが知ったように、最も簡単な修正はただ

(require 'cl)

あなたの初期化ファイルで。これはあなたが理解するほど大したことではありません。とにかく、使用する可能性のある多くのライブラリがこれを行うため、ロードされる順序を変更しているだけの可能性があります。

ace-jump-mode 別の方法は、 の作成者に の使用を避けるパッチを提出することですeveryが、これはより不便です。

最後に、ace-jump-mode作業に取り掛かることができたのは、コンパイル済みの「.elc」ファイルではなく、コンパイルされていない「.el」ファイルをロードしたためでした。これは、とが途中でロードされたことを(require 'cl)意味します。したがって、これらのファイルをロードせずにこれを機能させる魔法はありません。clcl-seq

于 2012-04-11T13:40:58.803 に答える
3

(eval-when-compile <foo>)<foo>ファイルをコンパイルするとき (またはコンパイルせずに実行するとき) にのみ実行されることを意味します。そのため、ファイルをコンパイルすると、結果のファイルは ロードされません。これは、 がロードされたときにのみ定義されるclため、問題です。 これらはコンパイル中にのみ必要ですが、マクロではないため、マクロ( など)をロードするために使用されます。everycl(eval-when-compile <foo>)ignore-errorsevery

于 2012-04-11T14:10:14.267 に答える