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.el
scheint zu verwenden defcustom
, defgroup
etc. Dies scheint eine Schattenwelt von global definierten Variablen , dass die elisp Code Verwendungen zu sein. Eine Frage wäre also: Ist die Verwendung einer defcustom
anderen 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.
customize
werden 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 wiedefcustom
und dergleichen benutzen .Antworten:
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
(oderOptions > 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
.defcustom
Dies ist ein Wrapper für die Emacs Lisp-Funktionalität auf niedrigerer Ebenedefvar
, 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.defgroup
ist 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:
Das
defgroup
schafft eine neue Gruppe innerhalb der Anpassungsschnittstelle unter dem Top-Level -convenience
Elemente. Ich brauchte dann eine Variable, um die möglichen Checkbox-Zustände zu speichern. Ich hätte verwenden könnendefvar
, aber da ich möchte, dass dies einfach anpassbar ist, habe ich mich für die Verwendung entschiedendefcustom
. Der:group
Abschnitt gibt an, dass er zur zuvor definierten Gruppe gehört, und der Abschnitt gibt an,:type
dass 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 RET
und navigiereConvenience > Checkbox
, sehe ich Folgendes: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-states
intern) gibt. Es zeigt die aktuellen Zeichenfolgenwerte zusammen mit den SchaltflächenINS
(Einfügen) undDEL
(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.quelle
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 Verfasserdefcustom
hat sich bemüht, einen vernünftigen Typ bereitzustellen check), (2) initialization (:initialize
) und update ctions (ausgelöst) (:set
).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.
Die Handbuchseite für defcustom enthält weitere Erläuterungen . Das Thema "Anpassungen" im Handbuch enthält vollständige Details.
Ich persönlich finde defcustom während der Entwicklung weniger umständlich, da ich mich nicht mit Nachladeproblemen mit defvar und setq befassen muss.
quelle