Wann sollte ich Autoload verwenden, anstatt zu erfordern?

30

Soweit ich requireweiß , wird es verwendet, um große Codestücke (so etwas wie Module) zu laden, obwohl es auch einzelne Funktionen laden kann.

Autoload hingegen registriert nur Funktionen und verschiebt das Laden auf die Ausführungszeit.

Ich habe kürzlich einen Artikel gelesen, in dem die autoloadausschließliche Verwendung von befürwortet wird .

Ist es besser zu autoloadals zu require? Was sind einige typische Anwendungsfälle für diese?

caisah
quelle
3
@ Gilles: FWIW, ich bin nicht einverstanden damit, dass Sie Tags entfernt autoloadund requireaus dieser Frage entfernt haben. Das Hinzufügen eines Tags librarieswar in Ordnung, aber jetzt kann jeder, der nach Fragen zu diesem Tag sucht autoloadoder requireihn nicht findet , ihn mithilfe von Tags verwenden . Das sind beide wichtige Emacs-Lisp-Funktionen, nach denen die Leute suchen werden. Schade. Und denken Sie darüber nach, wie hilfreich elispund libraries(besonders elisp) praktisch eine Emacs-Site sein wird: Ich fürchte, in Emacsland gibt es kaum Unterschiede. (Aber nein, ich bin nicht dagegen, sie zu haben und zu benutzen.)
Drew
@Drew Ich gehe mal auf die zutreffende Metadiskussion ein . Wenn Sie der Meinung sind, dass dieses allgemeine Prinzip hier nicht zutrifft, stellen Sie es bitte auf Meta.
Gilles 'SO- hör auf böse zu sein'
1
@ Gilles: Fertig . Ja, ich habe das gelesen und mir gedacht, dass das vielleicht die Motivation für dich war. Ich bin mit vielen allgemeinen Grundsätzen nicht einverstanden. Das bedeutet nicht, dass es immer TRT ist, ihnen pauschal zu folgen.
Drew
2
Ich stimme Drew zu, da es bei dieser Frage speziell um die Unterscheidung der Anwendungsfälle geht autoloadund requireich denke, dass diese Tags gerechtfertigt sind. Tatsächlich ist die Bezeichnung dieser Frage [nur] mit librariesübermäßig verallgemeinernd. Ich verwende zum einen require, um das Laden von "my-foobar-cfg" auszulösen, das, wie der Name schon sagt, nur meine Konfiguration enthält, keine Bibliothek.
Paprika

Antworten:

28

autoloadist kein Ersatz für require. In der Regel requirewird verwendet, um sicherzustellen, dass eine bestimmte Datei geladen ist. autoloadAndererseits gibt Emacs einen Hinweis, in welcher Datei eine bestimmte Funktion zu finden ist, ohne die Datei sofort zu laden. Erst beim Aufruf der Funktion Autoloaded wird die entsprechende Datei geladen.

Grundsätzlich autoloadkönnen Sie das Laden einer ganzen Datei auf den Zeitpunkt verschieben, an dem Sie sie tatsächlich benötigen. Aus diesem Grund definieren (besonders große) Pakete ihre Eingabefunktionen normalerweise als autoloads.

Wenn Sie umfangreiche Anpassungen für ein Paket vornehmen möchten, haben Sie normalerweise Pech autoload. Wenn Sie dennoch vermeiden möchten, requirekönnen Sie Ihre Anpassungen verschieben, bis die Datei mithilfe von geladen wurde eval-after-load.

Das Emacs-Handbuch behandelt dieses Thema in den folgenden Abschnitten:

Paprika
quelle
2
Erwähnenswert autoloadist vielleicht auch: Es geht (mehr oder weniger) darum, Befehlsdefinitionen bereitzustellen, damit Sie diese Befehle verwenden können. requiregeht es darum, alles in einer Bibliothek (und in Bibliotheken, die diese Bibliothek rekursiv benötigt) verfügbar zu machen. Emacs bietet mehr als nur Befehle. (Aber ja, natürlich wird die gesamte Bibliothek geladen, sobald ein automatisch geladener Befehl aufgerufen wird.)
Drew,
4

Treffen Sie in Bezug auf die Emacs-Initialisierung keine der beiden Entscheidungen. GitHub-Benutzer jwiegley verfügt über das ausgezeichnete Deklarationsmakro use-package , das ein Paket nach Bedarf erfordert oder automatisch lädt . Wird am besten verwendet, um das Laden von Paketen zu verschieben, die bei Bedarf geladen werden können.

Andy
quelle
3

Wenn Sie möchten, dass eine bestimmte Funktion direkt beim Start Ihres Emacs geladen wird und verfügbar ist, verwenden Sie require, andernfalls verwenden Sie autoload. Ich persönlich schätze die Startzeit sehr (ich starte Emacs tatsächlich ein paarmal pro Woche, manchmal mehrmals pro Tag neu), daher akzeptiere ich, dass es ein bisschen Zeit in Anspruch nimmt, wenn Emacs eine bestimmte Funktion automatisch lädt, wenn ich sie benötige. Überlegen Sie sich also, was direkt nach dem Start von Emacs verfügbar sein soll und was bei Bedarf geladen werden kann.

Mathias Dahl
quelle