Ich schreibe einen Hauptmodus für eine Programmiersprache, möchte aber ältere Emacs-Versionen unterstützen. prog-mode
ist relativ neu. Ich möchte von erben, prog-mode
wenn es definiert ist, aber trotzdem etwas Vernünftiges tun.
Was ist der beste Ansatz? Sollte ich defalias
prog-mode
auf älteren Emacsen, oder wird das andere Modi stören, wenn sie das gleiche tun?
major-mode
prog-mode
version-compatibilty
Wilfred Hughes
quelle
quelle
prog-mode
. Insbesondere leiden Sie unter dem Mangel an lexikalischer Bindung.Antworten:
Auf Kosten einer zusätzlichen Symbolbindung der obersten Ebene gibt es eine sehr übersichtliche Lösung, bei der das
define-derived-mode
Formular nicht wiederholt wird:Funktioniert gut in jedem Emacs> = 23. Ich habe mir das vor
haml-mode
ein paar Jahren IIRC ausgedacht und es scheint sich von dort auf mehrere andere Hauptmodi ausgeweitet zu haben. Dasdefine-derived-mode
Makro generiert hauptsächlich mit dem übergeordneten Modus-Symbol Code, der seine Funktion aufruft: In diesem Sinne entsprichtdefalias
die neue Variable genau der Alias-Funktion.Eine Einschränkung ist, dass dies verwirrend sein kann. Daher funktioniert
derived-mode-p
Code, der überprüft, ob Ihr Modus abgeleitet ist,prog-mode
möglicherweise nicht richtig. In der Praxis sind keine Probleme aufgetreten: Es ist üblicher, dass sich ein solcher Code einhaktprog-mode-hook
, der immer noch ausgeführt wird.(Wie Jorgen in den Kommentaren ausführt, wird
define-derived-mode
auch diemode-class
Eigenschaft aus dem übergeordneten Modus-Symbol verwendet unddefalias
nicht kopiert. Zum Zeitpunkt des Schreibens scheintspecial-mode
diese Eigenschaft nur für verwendet zu werden .)Update: Heutzutage würde ich einfach vorschlagen, mindestens Emacs 24 zu benötigen, da ältere Versionen längst veraltet sind.
quelle
prog-mode
, funktioniert aber nicht für jeden Modus.define-derived-mode
kopiert diemode-class
Symboleigenschaft in den untergeordneten Modus. Dasdefalias
wird diese Eigenschaft nicht übertragen. Wenn diesmode-class
für Ihren Anwendungsfall relevant ist, müssen Sie es manuell kopieren / einstellen.mode-class
Immobilie bedeutet.tl; dr: Verwenden Sie
if
und Ihre eigene Init-Funktion:Führen Sie dann die gesamte Initialisierung des Modus in aus
your-cool-init
.Längere Erklärung:
Das Problem ist, dass die offizielle Art, einen abgeleiteten Hauptmodus zu schreiben, darin besteht, das
define-derived-mode
Makro zu verwenden:Bei älteren Emacsen (vor 24) bricht dies ab, wenn
prog-mode
. Und Sie können es dort nicht verwenden,(if (fboundp 'prog-mode) ...)
da das Makro ein Literalsymbol erwartet und es in der Erweiterung für Sie zitiert.define-derived-mode
verwendet das übergeordnete Element auf vielfältige Weise. Sie müssten alle in Ihrer eigenen Modusdefinition kopieren, um sie verwenden zu können, und das ist sowohl mühsam als auch fehleranfällig.Die einzige Möglichkeit besteht darin, zwei verschiedene
define-derived-mode
Anweisungen zu verwenden, je nachdem, ob sieprog-mode
vorhanden sind oder nicht. Dadurch haben Sie das Problem, Ihren Initialisierungscode zweimal zu schreiben. Was natürlich schlecht ist, also extrahieren Sie das in seine eigene Funktion, wie oben beschrieben.(Die beste Lösung ist natürlich, die Unterstützung für 23.x einzustellen und das lexikalische Scoping zu verwenden. Aber ich denke, Sie haben diese Option bereits in Betracht gezogen und fallen gelassen. :-))
quelle
prog-mode
älteren Emacsen? Wäre es sinnvoll, von abzuleitentext-mode
oderfundamental-mode
wennprog-mode
nicht verfügbar?fboundp
zuerst nur diedefine-derived-mode
Anweisung verwenden? Dann kann der tatsächliche Modus mit vollständiger Definition aus diesem Zwischenmodus abgeleitet werden? Auf diese Weise muss der gesamte Modus nicht zweimal definiert werden.fundamental-mode
entspricht Ableiten ausnil
(und in der Tat,define-derived-mode
ersetztfundamental-mode
mitnil
), während dertext-mode
nicht geeignet ist, als Programmcode kein Text ist. Die meisten Standardeinstellungen intext-mode
sind in Programmiermodi außerhalb von Kommentaren nicht sinnvoll. Aus diesem Grundprog-mode
wurde in Emacs 24 eingeführt.define-derived-mode
Definitionen in einerif
Form erfordern , nur für den Zwischenmodus anstelle des endgültigen Modus. Sie würdendefun
die Funktion für die Init-Funktion durch einedefine-derived-mode
für den Endmodus ersetzen . Ich denke nicht, dass dies besonders vorzuziehen ist. Sie können auch einprog-mode
Selbst definieren , wie aus der ursprünglichen Frage hervorgeht, aber dies kann andere Modi leicht verwirren, die darauf angewiesen sindfboundp
, das Vorhandensein dieses Modus zu überprüfen.define-derived-mode
Aussagen notwendig sind. Vor ein paar Jahren habe ich die Lösung gefunden, die ich als separate Antwort veröffentlicht habe, und sie scheint in beiden Emacs 23 und 24 gut zu funktionieren. Code, wie er in einer Reihe beliebter Hauptmodi verwendet wird.Ich denke, das Testen mit
fboundp
macht mehr Sinn.quelle
Sie können ein Wrapper-Makro definieren
define-derived-mode
, das seine Argumente auswertet.(Warnung: nur minimal getestet.)
quelle