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-file
oder load
Verfahren?
10
M-x describe-function
das Lesen des Doc-Strings. akaC-h f
GebenM-x describe-function RET require RET
Sie die Dokumentzeichenfolge ein und lesen Sie sie. GebenM-x describe-function RET load-file RET
Sie dann die Dokumentzeichenfolge ein und lesen Sie sie. GebenM-x describe-function RET load RET
Sie 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 - dhM-x describe-variable
.Antworten:
Wenn Sie
load
eine Bibliothek wiederholt haben, wird diese Datei gelesen und ihr Code wiederholt ausgewertet (jedes Mal, wenn Sie sie laden).Wenn Sie
require
eine Bibliothek wiederholt haben, wirdload
die Bibliothek einmal (höchstens - und überhaupt nicht, wenn die Bibliothek bereits geladen wurde).require
bietet diese Effizienz, auch wenn sierequire
ursprünglich nicht zum Laden der Bibliothek verwendet wurde, da (die überwiegende Mehrheit) Bibliotheken den Code(provide 'FEATURE)
für ihren jeweiligenFEATURE
Namen enthalten. Dieser Code wird beim Laden der Bibliothek ausgewertet, unabhängig davon, wie sie geladen wurde, und aktualisiert zu diesem Zeitpunkt die Daten, dierequire
bei der Entscheidung, ob etwas getan werden muss, überprüft werden.Meistens möchten Sie
require
in 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
require
das 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 Loading
wenn 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".)quelle
(elisp) Named Features
.