46

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

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

たとえば、コードsmexを使用するための拡張機能を提供するというパッケージを使用します。M-xのキーを定義する必要があるので、ファイルM-xに追加しました。しかし、emacsを起動した後、コードを押すと、 「シンボルの関数定義は無効です:smex」というメッセージが表示されます... init.elファイルも入力すると、 「ファイルエラー:ファイルの読み込みができません、smex」というエラーメッセージが表示されます。 「」(global-set-key (kbd "M-x") 'smex)init.elM-x(require 'smex)

smexの場所をload-path変数に追加すると、期待どおりに機能しますが、そもそもパッケージシステムを使用するという目的全体が無効になっているようです...

何かご意見は?より良い方法はありますか、それとも今のところこの制限を守っていますか?

4

2 に答える 2

79

Emacsがパッケージの初期化を延期する理由は注目に値します。

を参照C-hig (emacs) Package Installation RETしてください。特に、以下を参照してください。

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

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

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

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

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

YMMV。

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

1 M-x customize-group RET package RET

于 2013-09-13T09:44:39.763 に答える
44

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

(setq package-enable-at-startup nil)
(package-initialize)
于 2012-06-21T14:41:38.583 に答える