Wie benutze ich defcustom richtig?

16

Wie die meisten Emacs-Benutzer habe ich einen Modus durch Ändern der Variablen angepasst. Was mir nie in den Sinn gekommen ist, ist die ganze Programmiermentalität, die dahinter steckt, das und das anpassbar zu machen. Dies wurde mir klar, als ich anfing, nach Eshell im Quellcode zu suchen. Ich bin kein elisp Programmierer, aber speziell em-ls.elscheint zu verwenden defcustom, defgroupetc. Dies scheint eine Schattenwelt von global definierten Variablen , dass die elisp Code Verwendungen zu sein. Eine Frage wäre also: Ist die Verwendung einer defcustomanderen Methode, um (anpassbare) globale Variablen zu erstellen ?

Kann jemand mich darauf hinweisen, wie man die Idee dahinter richtig benutzt (zuerst versteht) defcustom, wann man sie benutzt, warum, wann nicht? Vielleicht ein Anfängerbeispiel für einen Elisp-Anfänger.

147pm
quelle
Könnten Sie klarstellen, was Sie fragen? Möchten Sie wissen, wann die Funktionen verwendet customizewerden müssen und wann sie von Hand angepasst werden müssen? Oder möchten Sie einen Modus schreiben? Letzteres ist die Situation, in der Sie tatsächlich Dinge wie defcustomund dergleichen benutzen .
Dan

Antworten:

20

Das Anpassungssystem ist eine integrierte Funktion von Emacs, mit der genau das von Ihnen beschriebene Problem gelöst werden kann. Die Programmierung ist möglicherweise nicht die ideale Methode für den Durchschnittsbenutzer, um seinen Editor zu konfigurieren.

Der primäre Einstiegspunkt für die Anpassungsfunktionalität ist M-x customize RET(oder Options > Customize Emacs > Top-level Customization Groupüber das Menü). Von dort aus sehen Sie ein interaktives Menüsystem zum Anpassen von Einstellungen. Diese Schnittstelle erzwingt, dass alle Einstellungen vom richtigen Typ sind (Zahl, Zeichenfolge, Farbe usw.), wodurch eine Hauptfehlerquelle vermieden wird, die bei der programmgesteuerten Konfiguration von Emacs auftritt. Wenn der Benutzer Änderungen, die er über die Benutzeroberfläche vornimmt, beibehalten möchte, werden die Einstellungen in einem speziellen Abschnitt in der Initialisierungsdatei des Benutzers gespeichert (read:) .emacs.

defcustomDies ist ein Wrapper für die Emacs Lisp-Funktionalität auf niedrigerer Ebene defvar, der die Variable deklariert und in der Anpassungsschnittstelle sichtbar macht. Außerdem kann der Entwickler zusätzliche Metadaten bereitstellen, die für die Anzeige eines geeigneten interaktiven Steuerelements erforderlich sind - dh welche Art von Wert ist in dieser Variablen gespeichert? Eine beliebige Zeichenfolge? Eine Zahl? Eine Auswahl aus einer festen Auswahl? etc. defgroupist ein Gruppierungskonstrukt für diese anpassbaren Optionen, damit sie in einer schönen Hierarchie angeordnet werden können.

Diese Funktion sollte immer dann verwendet werden, wenn ein Datenelement als konfigurierbare Option für den Benutzer und nicht als internes Detail der Bibliothek betrachtet werden soll.

Hier ist ein einfaches Beispiel aus einer kleinen Bibliothek von mir:

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

Das defgroupschafft eine neue Gruppe innerhalb der Anpassungsschnittstelle unter dem Top-Level - convenienceElemente. Ich brauchte dann eine Variable, um die möglichen Checkbox-Zustände zu speichern. Ich hätte verwenden können defvar, aber da ich möchte, dass dies einfach anpassbar ist, habe ich mich für die Verwendung entschieden defcustom. Der :groupAbschnitt gibt an, dass er zur zuvor definierten Gruppe gehört, und der Abschnitt gibt an, :typedass es sich um eine Folge von Zeichenfolgen handelt. Es gibt auch einen Standardwert und eine Beschreibung. Es gibt auch zusätzliche Möglichkeiten (hier nicht gezeigt), um vom Benutzer eingegebene Werte zu transformieren.

Wenn ich jetzt renne M-x customize RETund navigiere Convenience > Checkbox, sehe ich Folgendes:

Anpassungsschnittstelle

Es ist nicht die schönste Benutzeroberfläche der Welt, aber beachten Sie, dass es interaktive Tools zum Anpassen des Werts von "Checkbox States" ( checkbox-statesintern) gibt. Es zeigt die aktuellen Zeichenfolgenwerte zusammen mit den Schaltflächen INS(Einfügen) und DEL(Löschen) an und ermöglicht es uns, die Zeichenfolgenwerte in Bearbeitungsfeldern zu bearbeiten. Wenn wir fertig sind, können wir entscheiden, ob wir unsere Änderungen übernehmen, zurücksetzen oder für zukünftige Sitzungen übernehmen und speichern möchten.

camdez
quelle
2
Guter Post! Die wichtigsten Vorteile des Customizings (und defcustom) sind, dass es sich automatisch um Folgendes kümmert : (1) Typprüfung , um zu verhindern, dass Sie einer Variablen einen falschen Wert zuweisen (vorausgesetzt, der Verfasser defcustomhat sich bemüht, einen vernünftigen Typ bereitzustellen check), (2) initialization ( :initialize) und update ctions (ausgelöst) ( :set).
Drew
Vielen Dank! Ich habe den Beitrag aktualisiert, um Ihre Vorschläge widerzuspiegeln.
Camdez
7

Ist die Verwendung von defcustom eine andere Möglichkeit (anpassbare) globale Variablen zu erstellen?

Ja. Insbesondere, wenn Sie möchten, dass Benutzer Ihres Codes Variablen einfach über die Mx- Benutzeroberfläche ändern können .

defcustom bietet Ihren Benutzern zwei wichtige Vorteile: Dokumentation und Typensicherheit . Dokumentation ist schön, genau dort zu haben. Mit der Typensicherheit kann angegeben werden, welche Arten von gültigen Werten Ihre Variablen annehmen können.

Natürlich ist defvar in Ordnung, wenn Sie sich nur anpassen und keine weitere Verwendung erwarten. Einige würden jedoch sagen, dass es eine gute Angewohnheit ist, sich durch und durch an Gewohnheiten zu halten.

Kann mir jemand sagen, wie man es richtig benutzt ...

Die Handbuchseite für defcustom enthält weitere Erläuterungen . Das Thema "Anpassungen" im Handbuch enthält vollständige Details.

... wann, warum, wann nicht?

Ich persönlich finde defcustom während der Entwicklung weniger umständlich, da ich mich nicht mit Nachladeproblemen mit defvar und setq befassen muss.

Emacs-Benutzer
quelle