package.elを使用してインストールおよび更新しますが、ロードおよび構成にはuse-packageを使用します


15

最近のことを知った後use-package、設定を移植することにしましたが、package.elパッケージのインストールと更新の維持に使用する利便性を放棄することに消極的でした。私は結合することは少しトリッキーなことがわかりましたuse-packagepackage.el

私は一般的に人々がシステムuse-packageとどのように結合するかを学ぶことに興味package.elがありますが、より具体的な質問については、読み続けてください。

私が欲しいものは次のとおりです。

  1. パッケージマネージャーでパッケージをインストールして、パッケージを簡単に参照し、を通じて更新できるようにするlist-packages
  2. パッケージを排他的に構成およびロードuse-packageするには、initファイルで、ロードする内容とその構成を正確に簡単に確認できます。
  3. オプションで、use-package:ensureキーワードを使用してパッケージをインストールすることもできます。

私が正しく理解している場合、私はpackage-initialize基本的にそれが設定する方法だけで、何をするかを非常に望んでいませんload-path。現在、私の構成にはこれがあります:

;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
  (normal-top-level-add-subdirs-to-load-path))
(require 'use-package)

最初のコメント行は、Emacs 25が(package-initialize)initファイルにa を有益に追加しないようにするためです。を持つビットnormal-top-level-add-subdirs-to-load-pathは、package-initializeを作成するものの近似であり、load-path十分に良いと思われる近似です。

これは私の欲望1と2を達成しているようですが、3ではありません。使用しようとすると:ensurepackage.el初期化されていないというエラーメッセージが表示されます。呼び出しpackage-initializeはそれを修正しますが、a)無数のオートロードをすべてロードしたくない(use-package必要なオートロードを正確に作成するために使用することを好む)、およびb)簡単にできるようにしたいので、それを避けたい特定のインストール済みパッケージを必要なときにロードしないようにします(これは簡単ですuse-package)。

誰もこれを行う方法についての推奨事項がありますか?

回答:


11

IIUCの目的は次のとおりです。

(package-initialize t)

なお、tすべてのインストール済みパッケージを起動することなく、それがする(またはすべきで、少なくとも)初期package.elので、ここであなたの幸福への鍵である引数を、。


1
これは私の質問に答えますが、今package-initializeでは私は質問を意味のないものにする使用に傾いています。
オマー

15

現在の設定では、package.elを無効にしています。これは、パッケージマネージャーを初期化せず、Emacsが自動的に初期化するのを防ぐためです。代わりにELPAをに追加するload-pathだけですが、それはpackage.elが行うことのほんの一部です。なぜそうするのかはわかりませんが、推奨するセットアップではありません。

具体的には、アプローチではパッケージの自動ロードを取得しません。つまり、最初はどのパッケージのコマンドも使用できません。

つまり、M-x組み込みコマンドのみを提供します。パッケージからコマンドを追加するには:commandsすべてuse-package宣言に明示的な定義を追加する必要があります。これは、特にMagitなどの大きなパッケージの場合、本質的にゼロゲインのために多くのメンテナンス作業になります。 。


use-packagepackage.elとの組み合わせは実際には非常に簡単です(セットアップ全体がこの組み合わせに基づいています)が、package.elを実際にその仕事に任せる方がはるかに優れています。initファイルの最初にあるpackage.elを初期化します。

(require 'package)
(setq package-enable-at-startup nil)   ; To prevent initialising twice
(add-to-list 'package-archives '("melpa" . "https://stable.melpa.org/packages/"))

(package-initialize)

便宜上use-package、まだインストールされていない場合は、後でbootstrapすることができます。

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

これにより、新しいシステムでEmacsセッションを開始でき、init.elが自動的にインストールされuse-packageます。

最終的にロードする必要がありますuse-package

(eval-when-compile
  (require 'use-package))

これでuse-package、パッケージのインストールと構成に使用できます。

(use-package magit                      ; The one and only Git frontend
  :ensure t
  :bind (("C-c v c" . magit-clone)
         ("C-c v v" . magit-status)
         ("C-c v g" . magit-blame)
         ("C-c v l" . magit-log-buffer-file)
         ("C-c v p" . magit-pull))
   :config (setq magit-save-repository-buffers 'dontask))

Emacsが起動時にこのフォームを評価use-packageすると、Magitがすでにインストールされているかどうかを確認し、必要に応じて自動的にインストールします。


3
「なぜそうするのかわかりません」:私が見ることができる唯一の理由は、起動時間についてです:package-initializeパスを埋め、オートロードを定義し、残りのことをするのに時間がかかります。Jon Wiegley自身(の著者use-package)はuse-package、依存するよりもスタンザ内のすべての自動ロードされたコマンドを宣言することを好むことをどこかで読んだと思いますpackage.el
フランソワフェヴォット

前回、私は彼がpackage.elをまったく使用していないのを見ましたが、いずれにしても、あなたが多くを得るとは思いません。load-pathvia use-packageまたはviaのいずれの場合でも、オートロードを追加して追加する必要がありpackage.elます。特に高速ディスクを備えた最新のシステムを使用している場合は、測定可能な違いがあるとは思いません。
lunaryorn

3
同意した。タイミングは自分でやった。高速ディスクでは、実質的に大きな違いは見られません。遅いディスクの場合、起動はpackage-initializeのカスタムリストよりも著しく遅くなります(0.2秒など)load-path。これは、ファイルシステムの「調査」に起因package.elします。ただし、autoloadファイルから定義をロードし、use-packageスタンザ内に定義する場合のパフォーマンスの大きな違いを測定したことはありません。
フランソワフェヴォット

まあ、私は私がしました言わないだろう無効にpackage.elシステムを、私は私だけ無効に言うと思いますpackage-initialize!その理由は、list-packages新しいパッケージを閲覧したり、現在インストールされているすべてのパッケージを更新したりするのが好きなのに、のターゲットを絞った読み込みを好むからuse-packageです。コマンドに対してのみオートロードを使用している私にとっては、良いことのように聞こえます!
オマー

1
@OmarAntolín-Camarenaどうして?オートロードは基本的にユーザー向けのパッケージのパブリックインターフェイスであり、package.elがパッケージを配布する標準的な方法になったため、その存在に依存できます。
lunaryorn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.