web-dev-qa-db-ja.com

Emacs 24パッケージシステムの初期化の問題

Emacs 24に組み込まれている新しいパッケージシステムには、インストールされたパッケージを適切にロードして初期化することに関して、いくつかの欠陥があるようです。

最近、2012年6月10日に実現したEmacs 24.1.1にアップグレードし、組み込みのパッケージシステムを使用しようとして、それを使用していくつかのパッケージをインストールしましたが、オートロードおよび初期化。

たとえば、M-xコードを使用するための拡張機能を提供するsmexというパッケージを使用します。 M-xのキーを定義する必要があるため、(global-set-key (kbd "M-x") 'smex)ファイルにinit.elを追加しました。しかし、emacsを開始した後、M-xコードを押すと、メッセージ"Symbol's function definition is void:smex" ...も[(require 'smex)をinitに挿入した場合。 el fileエラーメッセージが表示される"File error:Ca n't open load file、smex"

Smexの場所をload-path変数に追加すると、期待どおりに機能しますが、これは、最初からパッケージシステムを使用するという目的全体を損なうようです...

何かご意見は?より良い方法はありますか、または今のところこの制限に耐えますか?

45

package.elを使用してインストールするパッケージは、デフォルトでアクティブ化されますafter.emacsがロードされます。 .emacsが終了する前にそれらを使用できるようにするには、次のコマンドを使用してそれらをアクティブにする必要があります。

(setq package-enable-at-startup nil)
(package-initialize)
42

注目に値するwhy Emacsはパッケージの初期化を延期します:

見る C-hig(emacs) Package Installation RET、特に:

Initファイルのロード後にパッケージの自動ロードが発生する理由は、パッケージングシステムに影響するユーザーオプションを含め、ユーザーオプションはinitファイルのロード後にのみカスタマイズされた値を受け取るためです。状況によっては、パッケージをinitファイルに明示的にロードする必要がある場合があります(通常、initファイル内の他のコードがパッケージに依存しているため)。その場合、initファイルは関数package-initializeを呼び出す必要があります。 package-load-listを呼び出す前に、package-initialize(以下を参照)などの関連するユーザーオプションが設定されていることを確認する必要があります。また、package-enable-at-startupnilに設定して、initファイルの処理後にパッケージが再度読み込まれないようにする必要があります。または、起動時にパッケージの読み込みを完全に禁止し、M-x package-initializeコマンドを呼び出してパッケージを手動で読み込むこともできます。

したがって、packageカスタマイズグループの変数に必要なデフォルト以外の値がinitファイルで処理されることを確認してください1package-initializeを呼び出す前に-そして、パッケージライブラリの構成をカスタマイズするときは常にこのアプローチを維持します-これを行っても大丈夫です。

または、after-init-hookは標準パッケージの初期化が完了した後に実行されるため、これを使用して、パッケージに依存する初期化コードを評価できます。したがって、init [el]でpackage-initializeを直接呼び出す代わりに、次のように書くことができます。

(add-hook 'after-init-hook 'my-after-init-hook)
(defun my-after-init-hook ()
  ;; do things after package initialization
  )

初期化されたパッケージシステムを必要とするコードをその関数内に配置します。

YMMV。

(n.b.実際にはpackage.elを使用していないため、私はafter-initアプローチをテストしていません。ただし、起動コードでイベントのシーケンスを確認したので、説明どおりに機能すると思います。)

1M-xcustomize-group RETpackage RET

79
phils