Vorteile des Setzens von Variablen mit setq anstelle von custom.el?

69

Ich sehe viele Leute (Erweiterungsautoren und andere), die Konfigurationsbeispiele geben mit setq:

(setq foo 'bar)

Diese Parameter werden häufig mit definiert defcustomund stehen zur Anpassung zur Verfügung custom.el.

Ich benutze normalerweise custom.el, um sie einzustellen. Wäre es von Vorteil, setqstattdessen zwei Methoden zu verwenden, oder sind sie in etwa gleichwertig?

J David Smith
quelle

Antworten:

86

Einige Leute denken vielleicht, dass es einfacher zu bedienen ist setq. Einige Leute denken vielleicht, dass es lispy ist. In Wirklichkeit ist es im allgemeinen Fall naiv.

Es ist wahr, dass es für einige Benutzeroptionen keine Rolle spielt. Aber für andere ist es wichtig und setqder falsche Ansatz für diese Optionen. Ist also in der Regel setqder falsche Ansatz.

Wenn Sie custom-set-variablesoder customize-set-variableanstelle von verwenden setqoder wenn Sie die Benutzeroberfläche anpassen (z. B. M-x customize-option) verwenden, sind Sie sicher, dass der für den Optionswert erforderliche Initialisierungs- oder Aktualisierungscode automatisch ausgelöst und nach Bedarf ausgeführt wird. Wenn Sie verwenden setq, wird dies nicht durchgeführt.

Nun ist es auch so, dass die meisten Benutzeroptionen, insbesondere viele von ihnen, die für Bibliotheken von Drittanbietern geschrieben wurden, die defcustomSchlüsselwörter :setund nicht verwenden :initializeund die Verwendung setqfür sie keine Rolle spielt. Aber viele Vanille-Emacs-Optionen verwenden solche Schlüsselwörter, und für diejenigen, die dies tun, setqist es nicht das Richtige. Wenn Sie also Lisp-Code verwenden möchten und nicht die Benutzeroberfläche anpassen, um Ihre Optionen festzulegen, sollten Sie stattdessen custom-set-variablesoder customize-set-variableverwenden setq. Es tut nie weh und hilft manchmal (sehr).

Ich empfehle jedoch, beides zu tun:

  • Verwenden Sie dazu die Benutzeroberfläche zum Anpassen, anstatt Lisp-Code zu schreiben.

  • Definieren Sie eine Variablecustom-file , damit Customize Anpassungen in diese Datei und nicht in Ihre Init-Datei ( ~/.emacs) schreibt . IOW, halten Sie Ihren handgeschriebenen Initialisierungscode von dem von Customize geschriebenen automatischen Code getrennt.

Drew
quelle
1
Diese Antwort ist großartig und ich denke, sie ist wirklich sehr nützlich für Anfänger. Gibt es eine Möglichkeit, diese Art von Fragen / Antworten zu bewerben?
Willyfrog
5
Ich denke, es ist erwähnenswert, dass setq auch mit den Parametern: set und: initialize funktioniert, wenn es vor dem Laden des Pakets gelesen wird.
Malabarba
2
@Willyfrog Du kannst es befürworten!
Zane Shelby
17
Da bin ich mir nicht sicher, Drew. Die ganze Sache anpassen ist ziemlich komplex. Ohne das ist das Emacs-System viel einfacher. Das Anpassen ist eine Ebene, die nicht genau mit elisp zusammenpasst. Zum einen werden alle Variablen alphabetisch sortiert. Bei vielen Anpassungen geht es nicht um Variablen (z. B. Hooks, Schlüssel), daher kann nicht angepasst werden. Sie haben also sowieso eine Situation mit manuellem Elisp-Code.
Xah Lee
4
@XahLee. Ich bin mir sicher. ;-) Aber ja, Anpassen ist was es ist. Es ist nicht das Beste für Schlüssel, Hooks, Schlüsselwörter mit Schriftsperre, Anzeigetabellen usw. Aber für das, was es tut (Optionen und Gesichter), ist es ziemlich gut. Nicht, dass die Benutzeroberfläche wunderbar ist, aber die Handhabung von Triggern, Typüberprüfungen usw. sind hilfreich. Ich wünschte sogar, Programmierer könnten (optional) Dinge wie :typemit verwenden defvar- ich denke nicht, dass dies auf Benutzeroptionen beschränkt sein sollte. Leider sind viele Programmierer faul im Umgang mit :typeund das Ergebnis ist nicht sehr hilfreich (das liegt nicht an Customize).
Drew
37

Ich ziehe es setqüber customizeaus mehreren Gründen:

  1. In erster Linie erlaubt es das programmatische Setzen von Variablen (wie in, (setq foo (calculate-foo))). Ich benutze diese Kraft die ganze Zeit in meiner Konfiguration, um die Dinge trocken zu halten. Der springende Punkt bei der Verwendung von Emacs ist für mich die Programmierbarkeit, und die customizeBenutzeroberfläche stellt sich nur in den Weg.
  2. setqeignet sich besser für die Versionskontrolle und Code-Organisation. Ich habe meine Initialisierung auf Dutzende von Dateien aufgeteilt. Wenn alles in einer großen custom.elDatei wäre, wäre es viel schwieriger, Einstellungen schnell zu finden und zu bearbeiten.
  3. Das ist subjektiv, aber für mich customizefühlt sich die gesamte Oberfläche wie ein schreckliches Relikt der schlimmsten Benutzeroberflächen der 90er an. Ich würde es vorziehen, jeden Tag Text mit der Kraft von Emacs zu bearbeiten.

@Drew macht einige gute Punkte über einige Feinheiten mit :setund :initialize. Ich benutze Emacs seit Jahren und bin selten auf solche Probleme gestoßen. Wenn ich das tue, ist es einfach zu tauschen setqfür custom-set-variablein bestimmten Fällen.

Shosti
quelle
10
1. Sie können benutzerdefinierte Variablen programmgesteuert mit festlegen. Dies ist customize-set-variable(s)aufgrund der automatisch ausgeführten Trigger besser. 2. Sie können verschiedene Anpassungsbefehle verwenden, um alle Ihre festgelegten und / oder gespeicherten Variablen in verschiedenen Hierarchien anzuzeigen, sodass Sie die Organisation verschiedener Gruppen automatisch erhalten, ohne separate Dateien in der Versionskontrolle verwenden zu müssen. 3. Es ist viel besser geworden. Wenn Ihnen die Benutzeroberfläche nicht gefällt, können Sie das Anpassen dennoch programmgesteuert und über interaktive Befehle, die den Anpassungsmodus umgehen, verwenden, um alle anderen Vorteile der Verwendung des Anpassungsmodus zu nutzen.
Nick McCurdy
23

Ein Vorteil der Verwendung setqanstelle von customizeist die Lesbarkeit. Es steht Ihnen frei, jede Anpassung nach Ihren Wünschen zu kommentieren, wodurch IMO die Lesbarkeit verbessert. Sie können auch zusammengehörige Anpassungen gruppieren, um die Modularität zu verbessern. Schließlich würde ich argumentieren, dass das Navigieren durch einen Elisp-Puffer "einfacher" ist als das Navigieren in benutzerdefinierten Benutzeroberflächen und Widgets.

Andererseits können Sie mit „Anpassen“ ganz einfach auf Standardwerte zurückgreifen, die von unschätzbarem Wert sein können, wenn etwas schief geht.

BEARBEITEN: Drews Antwort bietet einen guten Grund für die Verwendung, customize-set-variablesder alle Vorteile bietet, auf die ich hingewiesen habe. Die Benutzeroberfläche zum Anpassen eignet sich jedoch nicht so einfach für tragbare Konfigurationen auf verschiedenen Plattformen wie Raw Elisp. Wenn Sie für eine Variable eine os-abhängige Einstellung benötigen, müssen Sie in vielen Fällen auf elisp zurückgreifen. Mein Punkt zur einfacheren Navigation in Elisp-Puffern bleibt bestehen.

Vamsi
quelle
Sie können auch mit auf den Standardwert zurücksetzen setq, indem Sie die setqZeile auskommentieren und emacs neu starten.
T. Verron
3
Ja, aber anpassen kann ohne lästigen Neustart zurückgesetzt werden. Sehr nützlich, um neue Einstellungen auszuprobieren.
Vamsi
2
In Bezug auf Anmerkungen können Sie über die Anpassungsschnittstelle zu jeder Variablen, die Sie ändern, einen Kommentar hinzufügen.
Andrew Swann
custom-set-variables ist "raw elisp" und ich benutze es jeden Tag auf mehreren Maschinen. Kopieren Sie es einfach von der Stelle, an der customise es schreibt (wenn Sie es nicht selbst geschrieben haben).
Croad Langshan
Die Schnittstelle <kbd> Mx customize - * </ kbd> verfügt über ein Feld "comment", in dem ein Kommentar zusammen mit einer Variablen gespeichert werden kann.
kdb
-1

Eine weitere Alternative ist John Wiegley zu gebrauchen use-Paket . Dies bietet eine programmgesteuerte Möglichkeit zum Konfigurieren von Paketen, die mit dem Paketinitialisierungsprozess von emacs 24+ problemlos funktioniert. Hier ist ein Anwendungsbeispiel aus der Readme:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

Der Punkt ist, dass use package ein Makro ist und seine Argumente nicht sofort auswertet. Die Parameter :initund :configwerden in verschiedenen Phasen des Initialisierungsprozesses ausgewertet, sodass die Konfiguration jedes Pakets an einem Ort erfolgen kann, wobei jedoch jeder Teil in der entsprechenden Phase der Initialisierung ausgeführt wird.

Ohne so etwas wie use-packagebenötigen einige Pakete einen Teil ihres Initialisierungscodes, um vor (package-initialize)und einen anderen Teil, um nach zu gehen. Wenn Sie so viele Packegas haben, müssten deren Initialisierungen verschachtelt werden.

Ein weiterer Vorteil von use-packageist, dass fehlende Pakete mithilfe von package.el automatisch installiert werden können, wenn Sie .emacs auf einen neuen Computer übertragen oder wenn Sie Ihre Konfiguration für einen anderen Benutzer freigeben und die gesamte Initialisierung aufgeschoben werden kann, bis ein Paket tatsächlich geladen werden muss.

Es gibt auch zusätzliche Schlüsselwortargumente, mit denen Sie den Initialisierungsprozess besser steuern können.

Alles in allem ist ein großer Vorteil des Anpassens, dass es Ihnen zeigt, was in einem bestimmten Paket konfiguriert werden muss. Das ist ein Grund, warum ich es immer noch für viele meiner Pakete benutze.

Daniel Mahler
quelle
2
Das beantwortet die Frage nicht wirklich. In Ihrer eigentlichen Antwort verwenden Sie setq, ohne zu erklären, warum.
J David Smith
3
Ich denke, use-packageselbst bietet die Vorteile einer modularisierten Konfiguration und des Importierens und Konfigurierens von Paketen an einem Ort. Aber ja, das Beispiel verwendet setq. Könnte es hier genauso gut genutzt customize-set-variablehaben? Ich bin mir nicht sicher. Könnten / sollten wir es (oder customize-set-value) für tauschen setq?
Mike
4
Bitte ändern Sie das Beispiel, damit es das :customSchlüsselwort verwendet.
Toon Claes