Autoloads und Variablen

8

Ich verstehe, was das automatische Laden für Funktionen bewirkt (Registerdatei, die geladen werden soll, wenn eine solche Funktion aufgerufen oder ihre Dokumentationszeichenfolge abgerufen wird). Es ist jedoch nicht klar, wie die Autoload-Funktion in Verbindung mit Variablen und Makros verwendet wird.

Ich habe zwei Fragen:

  1. Was passiert, wenn das Paket einen Parameter hat, der als Variable implementiert ist, die der Benutzer festlegen kann, der jedoch nicht automatisch geladen wird? Sollten solche Variablen automatisch geladen werden? Wenn dies nicht der Fall ist, stellt sich heraus, dass solche Variablen nicht vorhanden sind. Die Lisp-Umgebung weiß nichts über sie, einschließlich ihrer Standardwerte, bis eine automatisch geladene Funktion aus dem Paket verwendet wird (normalerweise nach dem Laden von Konfigurationsdateien). Wenn der Benutzer sie in seiner festlegt In ihrer Konfigurationsdatei wird eine nicht vorhandene Variable festgelegt. Was passiert genau, wenn der Wert der Variablen eine nicht leere Liste ist und der Benutzer den Wert verwendet pushoder add-to-liständert? Gehen Standardwerte verloren?

  2. Was passiert, wenn ein Makro automatisch geladen wird? Wann sollten wir ein Makro automatisch laden?

Mark Karpov
quelle

Antworten:

5

Das automatische Laden gilt nur für den Funktionswertschlitz eines Symbols. Insbesondere gibt es kein automatisches Laden einer Variablen.

Es ist wahrscheinlich eine schlechte Form für ein Paket, Variablen für die Benutzeranpassung zu enthalten, deren Standardwert eine nicht leere Liste ist, gerade weil es in diesem Fall schwierig wird, die Variable anzupassen. Schlimmer noch, wenn sich der Standardwert ändern sollte, sollte sich wahrscheinlich auch der benutzerdefinierte Wert ändern, der Benutzer wird sich dessen jedoch nicht bewusst sein. Wenn ein Paket solche Variablen enthält, ist es möglicherweise am besten, sie nach dem Laden des Pakets mit zu ändern eval-after-load.

Die meisten Anpassungsvariablen haben den Standardwert nil. In diesem Fall legen Sie sie einfach mit setqin Ihrer Init-Datei fest (oder verwenden die Anpassungsoberfläche). Angenommen, das Paket verwendet defvaroder defcustomsetzt die Variable wie vorgesehen, überschreibt es Ihre Einstellung nicht.

Autoloading-Makros: Legen Sie das fünfte Argument fest autoload, um dies zu erreichen. Dies sollte wie Funktionen erfolgen, wenn Sie das Makro wahrscheinlich verwenden möchten, ohne das Paket zuerst zu laden - entweder explizit oder implizit, indem Sie zuerst andere automatisch geladene Symbole aus dem Paket aufrufen.

Nachtrag: Wie das OP in den Kommentaren hervorhob, kopiert ein magischer ;;;###autoloadKommentar auch eine defvar(in der Tat jede elisp Form) in die Autoload-Datei. Weitere Informationen finden Sie im Abschnitt Autoload im elisp-Handbuch.

Harald Hanche-Olsen
quelle
Variablen, die nur setqbearbeitet werden können (dh es spielt keine Rolle, welche Werte sie zuvor hatten), können standardmäßig in defvaroder in defcustomForm angegeben werden. Bei Listen, die vom Benutzer erweitert werden können, ist es jedoch am besten, sie eval-after-loadrichtig zu verwenden . Manchmal sind auch gute Standardeinstellungen gut, auch wenn sie die Form einer Liste haben ;-)
Mark Karpov
Das stimmt. Ich würde argumentieren, dass eine allgemeine Anpassung eval-after-loadeinen Fehler in der Paketimplementierung darstellt. Typischerweise eval-after-loadwerden sollte für Fehlerbehebung oder höchst ungewöhnliche Anpassungen verwendet. Übrigens ist es möglicherweise besser, einen Haken zu verwenden, wenn das Paket einen zur Verfügung stellt.
Harald Hanche-Olsen
Das Problem ist, dass ich eine Variable haben wollte, die an eine Liste von drei Elementen gebunden ist (Standardeinstellungen). Ich bin mir sicher, dass die meisten Benutzer die Standardeinstellungen wünschen. Aber wenn ich weit gehe eval-after-load, können Benutzer immer noch keine Elemente aus der Liste entfernen! Ich frage mich daher, ob ich die Standardeinstellungen überhaupt aufgeben sollte.
Mark Karpov
1
Ich bin nicht der Meinung, dass eval-after-loaddies nur für ungewöhnliche Situationen erforderlich sein sollte. Es ist eines der Standardwerkzeuge im Toolkit für verzögertes Laden. Wenn die Leute solche Tools nicht verwenden möchten, können sie requiredie Bibliothek im Voraus nutzen (was Neulingen in der Tat ausnahmslos empfohlen wird - wenn sie zu dem Gedanken kommen, "Ich wünschte, Emacs würde etwas schneller starten", ' Ich habe wahrscheinlich genug gelernt, um
mich
1
@Drew: Ihr Punkt, customize-set-variableeher zu verwenden als zu sein, ist setqvielleicht ein guter. Aber ich habe jetzt nicht die Zeit für das sorgfältige Studium, das erforderlich ist, um meine Antwort in dieser Hinsicht zu verbessern. Wenn Sie dies für wichtig halten, warum schreiben Sie dann nicht Ihre eigene Antwort? Es wird sichtbarer sein als dieser lange Kommentarthread.
Harald Hanche-Olsen