Gibt es Bibliotheken für Eingabefelder in Emacs?

10

Nicht wenige Emacs-Modi verwenden (so etwas wie) Formulare: Die Anpassungsoberfläche ist eine davon, der Nachrichtenmodus (sprich: sein Header-Teil) ist eine andere; es gibt mehr von ihnen, leider nicht immer sehr ähnlich. Mit "Formular" meine ich hier einen Puffer mit schreibgeschützten Teilen und Stellen, die zur Eingabe von Text bestimmt sind. Es kann Schaltflächen enthalten oder nicht (es sollte wahrscheinlich C-c C-cals Bestätigungs- / Festschreibungsschlüssel akzeptiert werden , unabhängig davon, ob eine OK- Schaltfläche vorhanden ist).

Ich bin besonders an der automatischen Vervollständigung in den Feldern interessiert (und insbesondere an der Aktivierung von Feldern mit Wertelisten aus einer bestimmten Menge, z. B. durch Kommas getrennt). Meine Frage ist: Gibt es eine Emacs-Bibliothek, die die einfache Erstellung solcher Formulare ermöglicht (mit "einfach" meine ich, das Rad nicht neu zu erfinden), oder sollte ich alles selbst codieren?

(Ich stelle mir vor, dass ich im letzteren Fall (1) einige Teile des Puffers schreibgeschützt einstellen würde, (2) einen speziellen Hauptmodus vorbereiten würde, so dass zB TABund S-TABzwischen "Feldern" wechseln und (3) Verwenden Sie möglicherweise etwas wie Eiszapfen oder Helm für die automatische Vervollständigung.)

mbork
quelle
1
Ihr Titel wurde geändert, um Eingabefelder anzuzeigen. Formen haben in elisp eine ganz besondere Bedeutung, was zu Verwirrung führen kann.
Malabarba
2
Und ja, es gibt eine integrierte Widget-Bibliothek. Aber ich weiß nichts darüber.
Malabarba
@ Malabarba: Danke, das ist wahrscheinlich eine bessere Formulierung.
mbork
(Obwohl Emacs selbst das Wort "Form" in dieser Bedeutung verwendet - siehe das in Drews Antwort erwähnte Widgets-Handbuch!)
mbork

Antworten:

8

Siehe Bibliotheken cus-edit.elund wid-edit.el(und ihre Bibliotheken der obersten Ebene custom.elund widget.elund zugehörige Komponentenbibliotheken), die in GNU Emacs enthalten sind. Ersteres nutzt Letzteres. Letzteres definiert grundlegende (und nicht so grundlegende) Formulareingabe-Dinge, die als " Widgets " bezeichnet werden, in einer Hierarchie. Mit diesen vordefinierten Widgets und Funktionen in der Bibliothek können Sie Ihre eigenen Widgets und Widgettypen erstellen.

Seien Sie jedoch gewarnt, dass der Code dieser Bibliotheken, insbesondere der von wid-edit.el, nicht sehr einfach zu befolgen ist. Am besten verwenden Sie zunächst vorhandene Widgets wieder oder verwenden vorhandenen Widget-Definitionscode als Leitfaden.

(Zwei kleinere Erweiterungsbibliotheken hierfür sind cus-edit+.elund wid-edit+.el. Sie enthalten auch einige Verwendungsbeispiele.)

Es gibt ein mit GNU Emacs vertriebenes Info-Handbuch für Widgets mit dem Titel " The Emacs Widget Library ".

Es gibt auch eine Bibliothek forms.el, die in GNU Emacs enthalten ist, aber ich bin nicht damit vertraut. Vielleicht hat jemand anderes etwas Nützliches dazu zu sagen. Es gibt ein Handbuch für Formulare mit dem Titel " Formularmodus " , das mit GNU Emacs vertrieben wird .

Drew
quelle
2
Ein bisschen mehr auf forms.el: stackoverflow.com/questions/10166600/…
phils
1
@ Draw: Danke für deine Antwort! Könnten Sie die Beziehung zwischen \(custom\|widget\).elund \(cus\|wid\)-edit.elein bisschen klären ? Ich finde vor allem diesen Teil aus dem Widgets-Handbuch unverständlich : (require 'widget) (eval-when-compile (require 'wid-edit)).
mbork
1
Erstens bin ich kein Experte in diesem Bereich. Die Zeiten, in denen ich etwas an Customize ändern musste, tauchten in cus-edit.elund ein wid-edit.el. Die anderen Dateien, die Sie erwähnen, sind Dateien der obersten Ebene. Die *-edit.elDateien haben den Code, an dem ich interessiert war. Keine Ahnung mehr als das; Es tut uns leid. Die eigentliche Schwierigkeit ist der Code selbst, der einen bestimmten Semi-OOP-Stil verwendet, der sich weder für die Emacs-Selbstdokumentation (gelinde gesagt) noch für den Emacs-Debugger eignet. Sie können selbst nachforschen oder versuchen, den Autor zu kontaktieren (viel Glück damit!). Vielleicht helfen andere hier.
Drew