Was bedeutet (erfordert 'Paket) für Emacs und wie unterscheidet es sich von der Ladedatei?

10

Ich habe erst vor ein paar Tagen angefangen, Emacs zu verwenden, und ich habe irgendwo gelesen, (require 'package-name)was nicht benötigt wird, wenn das besagte Paket mit package-install installiert wird. Aber warum, was macht (require 'package-name)eigentlich und wie unterscheidet es sich von load-fileoder loadVerfahren?

Chakravarthy Raghunandan
quelle
7
Eines der ersten Dinge, die wir alle in Emacs lernen mussten, ist M-x describe-functiondas Lesen des Doc-Strings. aka C-h fGeben M-x describe-function RET require RETSie die Dokumentzeichenfolge ein und lesen Sie sie. Geben M-x describe-function RET load-file RETSie dann die Dokumentzeichenfolge ein und lesen Sie sie. Geben M-x describe-function RET load RETSie dann die Dokumentzeichenfolge ein und lesen Sie sie. Nachdem Sie alle drei Dokumentzeichenfolgen gelesen haben, bearbeiten Sie bitte Ihre Frage, um alle drei Funktionen zu vergleichen und gegenüberzustellen, und klären Sie, was Sie in Bezug darauf noch nicht verstehen. Wir verwenden das gleiche Verfahren für Variablen - dh M-x describe-variable.
Lawlist

Antworten:

13

Wenn Sie loadeine Bibliothek wiederholt haben, wird diese Datei gelesen und ihr Code wiederholt ausgewertet (jedes Mal, wenn Sie sie laden).

Wenn Sie requireeine Bibliothek wiederholt haben, wird loaddie Bibliothek einmal (höchstens - und überhaupt nicht, wenn die Bibliothek bereits geladen wurde).

requirebietet diese Effizienz, auch wenn sie requireursprünglich nicht zum Laden der Bibliothek verwendet wurde, da (die überwiegende Mehrheit) Bibliotheken den Code (provide 'FEATURE)für ihren jeweiligen FEATURENamen enthalten. Dieser Code wird beim Laden der Bibliothek ausgewertet, unabhängig davon, wie sie geladen wurde, und aktualisiert zu diesem Zeitpunkt die Daten, die requirebei der Entscheidung, ob etwas getan werden muss, überprüft werden.

Meistens möchten Sie requirein Ihrem eigenen Code verwenden, wenn Sie sicherstellen müssen, dass eine bestimmte Bibliothek geladen wurde.

Der Grund, warum Sie dies bei ELPA-Paketen häufig nicht tun müssen, besteht darin, dass der Paketmanager automatisch alle Autoload-Cookies im Paket verarbeitet und eine Datei mit Autoloads für dieses Paket generiert. Wenn das Paketsystem beim Starten von Emacs initialisiert wird, wird die Autoload-Datei für jedes Paket ausgewertet, die alle automatisch geladenen Funktionen identifiziert. Wenn eine automatisch geladene Funktion aufgerufen wird, wird automatisch die Bibliothek geladen , die die eigentliche Definition der Funktion enthält .

Paketautoren können jeder Funktion, die der Benutzer möglicherweise direkt aufruft, ein Autoload-Cookie hinzufügen. Sofern ihre Erwartungen korrekt waren, müssen Sie requiredas Paket nicht aufrufen oder anderweitig explizit laden, um es zu verwenden.

Beachten Sie, dass Sie auch Ihre eigenen benutzerdefinierten Autoloads definieren können. Siehe C-hig (elisp) Autoload RETund auch, (elisp) Hooks for Loadingwenn Sie das benutzerdefinierte verzögerte Laden und die verzögerte Konfiguration von Bibliotheken in Ihrer eigenen Konfiguration verwenden möchten. (Letztere sagen: "Bewerten Sie diesen Code erst, wenn diese Bibliothek geladen wurde". Dies passt gut zum Autoload-Mechanismus "Laden Sie diese Bibliothek erst, wenn sie benötigt wird".)

Phils
quelle
2
Da Sie bereits auf das Elisp-Handbuch verweisen, ist meiner Meinung nach ein weiterer relevanter Knoten (elisp) Named Features.
Basil