各パッケージをload-pathに追加する必要があるのはなぜですか?(またはrequire '私のinitファイルのパッケージに関する問題)


17

パッケージメニューからパッケージをインストールするたびrequireに、initファイルでパッケージを試みると、ロードパスに手動で追加しない限りエラーが発生します。

(add-to-list 'load-path "/home/nick/.emacs.d/elpa/use-package-20141220.1645")

(require 'use-package-autoloads)
(require 'use-package)

それは退屈です。通常、パッケージパスにはバージョン番号が含まれています。パッケージが更新された場合、ロードパスを手動で編集する必要があります。

これを自動化する方法はありますか?

回答:


23

TL; DR:

initファイルの先頭(.emacs.d/init.elまたは.emacs)に次の行を追加します。

(package-initialize)

説明

Emacsが使用する可能性のあるファイルをさらに作成することは、user-init-file間違いなく正しいアプローチではありません。マニュアルには、少なくとも引用した部分ではなく、競合がある場合にどちらが好ましいかが示されていないため、これは混乱を追加することです-実際にどれがuser-init-file(あなたが望むかもしれない値調べるために検査する)。

だから~/.emacs.d/init.el、それは不浄な混乱には寄与せず$HOME、最も重要なものを含むすべてのEmacs構成ファイルを、リポジトリを使用してバージョン管理下に保つことができるため、一般に(ユーザーが)好むものを除くすべての候補を削除することから始めますEmacs。

デフォルトでは、Emacsはユーザーの初期化ファイルがロードされたpackage-initialize に呼び出します。それはそう、すべてで、今日ので、ほとんどのユーザーが使用してパッケージをインストールしpackage.el、彼らはこれらのパッケージが利用できるようにするために何もする必要はありませんので- 。

一方、誰もがそうするわけではないので、を呼び出さないことも可能package-initializeです。その関数が呼び出されないようにする(setq package-enable-at-startup nil)には、ユーザーの初期化ファイルに追加します(他の場所に配置できますか?)。

package-initializeユーザーがEmacsに変更しないように変更する前に呼び出すことはできないため、initファイルをロードしたに実行する必要があります。ユーザーがパッケージのみをインストールしてからそのまま使用するか、正常に機能するカスタムインターフェイスを使用してカスタマイズする限り。ただし、elispを使用してパッケージをカスタマイズする場合はload-path、定義する関数を使用する前に、パッケージが実際に有効になっていることを確認する必要があります。

それは非常に簡単で適切に文書化されています(最初に調べていれば、上記のほとんどを書く必要はありませんでした:-/

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

そう:

;;; .emacs.d/init.el -- the `user-init-file'

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

(require 'use-package)

(use-package some-package
  :init (setq some-package-variable "foobar")

    ...

;;; .emacs.d/init.el ends here

もちろん、問題(または追加の問題)は、入力ミスがSymbol's function definition is void: use-packgeinitファイルにあり、emacs.seに入力するまで発生しなかった可能性もあります。



(require 'use-package)前に使用しても大丈夫(package-initialize)ですか?
陳力


0

以下は、すべての~/.emacs.d/site-lispディレクトリをロードパスに追加するためrequire、パッケージだけで完了です。

(let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
       (default-directory my-lisp-dir)
       (orig-load-path load-path))
  (setq load-path (cons my-lisp-dir nil))
  (normal-top-level-add-subdirs-to-load-path)
  (nconc load-path orig-load-path))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.