tl; dr: Verwenden Sie if
und Ihre eigene Init-Funktion:
(if (fboundp 'prog-mode)
(define-derived-mode your-cool-mode prog-mode "Cool"
"Docstring"
(your-cool--init))
(define-derived-mode your-cool-mode nil "Cool"
"Docstring"
(your-cool--init)))
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:
(define-derived-mode your-cool-mode prog-mode ...)
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 sie prog-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. :-))
prog-mode
. Insbesondere leiden Sie unter dem Mangel an lexikalischer Bindung.