tl; dr: Use if
y su propia función init:
(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)))
Luego haga toda la inicialización del modo en your-cool-init
.
Explicación más larga:
El problema es que la forma oficial de escribir un modo principal derivado es usar la define-derived-mode
macro:
(define-derived-mode your-cool-mode prog-mode ...)
En Emacsen anterior (anterior a 24), esto se rompe cuando prog-mode
. Y no puede usarlo (if (fboundp 'prog-mode) ...)
allí porque la macro espera un símbolo literal y lo citará en la expansión.
define-derived-mode
usa el padre de muchas maneras. Debería copiarlos en su propia definición de modo para utilizarlos, y eso es tedioso y propenso a errores.
Entonces, la única forma es usar dos define-derived-mode
declaraciones diferentes , dependiendo de si prog-mode
existe o no. Eso te deja con el problema de escribir tu código de inicialización dos veces. Lo cual, por supuesto, es malo, por lo que extrae eso en su propia función, como se describe anteriormente.
(La mejor solución es, por supuesto, abandonar el soporte para 23.xy usar el alcance léxico. Pero supongo que ya consideró y eliminó esa opción. :-))
prog-mode
. En particular, sufrirá la falta de unión léxica.