Nachdem use-package
ich kürzlich davon erfahren hatte, entschied ich mich, meine Konfiguration darauf zu portieren, wollte aber nicht auf die Bequemlichkeit verzichten package.el
, Pakete zu installieren und sie auf dem neuesten Stand zu halten. Ich fand es ein wenig schwierig, use-package
und zu kombinieren package.el
.
Ich bin im Allgemeinen daran interessiert zu lernen, wie sich Menschen use-package
mit dem package.el
System verbinden, aber für eine genauere Frage lesen Sie weiter.
Folgendes möchte ich:
- Um Pakete vom Paketmanager installieren zu lassen, kann ich einfach nach Paketen suchen und diese auf dem neuesten Stand halten
list-packages
. - Um Pakete ausschließlich über zu konfigurieren und zu laden
use-package
, kann ich in meiner Init-Datei leicht sehen, was ich lade und wie es konfiguriert ist. - Optional möchte ich auch Pakete über
use-package
das:ensure
Schlüsselwort von installieren können .
Wenn ich richtig verstehe, möchte ich sehr wenig von dem, was package-initialize
tut, im Grunde nur so, wie es das einrichtet load-path
. Derzeit habe ich dies in meiner Konfiguration:
;(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)
Die erste, kommentierte, Zeile ist so, dass Emacs 25 (package-initialize)
meiner Init-Datei nicht hilfreich ein hinzufügt . Das Bit mit normal-top-level-add-subdirs-to-load-path
ist eine Annäherung an das, was package-initialize
das machen würde load-path
, eine Annäherung, die gut genug zu sein scheint.
Dies scheint meine Wünsche 1 und 2, aber nicht 3 zu erfüllen. Wenn ich versuche, es zu verwenden :ensure
, erhalte ich eine Fehlermeldung, die besagt, dass package.el
es nicht initialisiert ist. Ein Anruf package-initialize
würde das beheben, aber ich möchte das vermeiden, da a) ich nicht alle unzähligen Autoloads laden möchte (ich bevorzuge use-package
es, genau die Autoloads zu erstellen, die ich benötige) und b) ich in der Lage sein möchte, einfach zu sein Vermeiden Sie es, bestimmte installierte Pakete zu laden, wann immer ich möchte (was einfach zu bewerkstelligen ist use-package
).
Hat jemand eine Empfehlung, wie das geht?
quelle
package-initialize
was meine Frage in Frage stellt.Mit Ihrer aktuellen Konfiguration haben Sie package.el effektiv deaktiviert , da Sie den Paketmanager nicht initialisieren und Emacs daran hindern, ihn automatisch zu initialisieren. Im Gegenzug müssen Sie nur ELPA hinzufügen
load-path
, aber das ist nur ein kleiner Teil dessen, was package.el tut. Ich bin nicht sicher, warum Sie das tun, aber es ist kein Setup, das ich empfehlen würde.Insbesondere erhalten Sie bei Ihrem Ansatz keine automatischen Paketladevorgänge. Dies bedeutet, dass zunächst keine Befehle von einem Paket verfügbar sind.
Mit anderen Worten, es
M-x
werden nur eingebaute Befehle angeboten. Um Befehle aus Ihren Paketen hinzuzufügen:commands
, müssen Sie allen Ihrenuse-package
Deklarationen explizite Definitionen hinzufügen. Dies bedeutet einen hohen Wartungsaufwand, insbesondere für große Pakete wie Magit. Bei package.el erhalten Sie Autoloads kostenlos .Das Kombinieren
use-package
mit package.el ist eigentlich sehr einfach - das gesamte Setup basiert auf dieser Kombination -, aber es ist viel besser, package.el tatsächlich seinem Job zu überlassen. Initialisieren Sie einfach package.el ganz am Anfang Ihrer Init-Datei:Aus Bequemlichkeitsgründen möchten Sie möglicherweise später ein Bootstrap durchführen
use-package
, sofern es nicht bereits installiert ist:Damit können Sie eine Emacs-Sitzung auf einem neuen System starten, und Ihr init.el wird automatisch installiert
use-package
.Letztendlich müssen Sie laden
use-package
:Jetzt können Sie
use-package
Pakete installieren und konfigurieren:Wenn Emacs dieses Formular jetzt beim Start auswertet,
use-package
wird geprüft, ob Magit bereits installiert ist, und es wird bei Bedarf automatisch installiert.quelle
package-initialize
dauert einige Zeit, den Pfad zu füllen, Autoloads zu definieren und den Rest der Dinge zu erledigen. Ich glaube, ich habe irgendwo gelesen, dass Jon Wiegley selbst (der Autor vonuse-package
) es vorzieht, alle automatisch geladenen Befehle inuse-package
Strophen zu deklarieren, anstatt sich darauf zu verlassenpackage.el
.load-path
In beiden Fällen müssen Sie die füllen und Autoloads hinzufügen, entweder überuse-package
oder überpackage.el
. Ich bezweifle, dass es einen messbaren Unterschied gibt, besonders wenn Sie ein modernes System mit einer schnellen Festplatte haben.package-initialize
als bei einer benutzerdefinierten Liste inload-path
. Ich schreibe dies der "Erforschung" des Dateisystems zu, das diespackage.el
tut. Ich habe jedoch nie einen signifikanten Unterschied in der Leistung zwischen dem Laden vonautoload
Definitionen aus Dateien und deren Verwendung inuse-package
Zeilengruppen gemessen .package.el
, ich würde sagen, dass ich nur deaktiviert habepackage-initialize
! Der Grund ist, dass ich, obwohl ich gernelist-packages
nach neuen Paketen suche und speziell alle meine derzeit installierten Pakete aktualisiere, das gezielte Laden von bevorzugeuse-package
. Für mich ist es eine gute Sache, Autoloads nur für Befehle zu haben, die ich verwende!