tl; dr: Use if
e sua própria função 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)))
Em seguida, faça toda a inicialização do modo em your-cool-init
.
Explicação mais longa:
O problema é que a maneira oficial de escrever um modo principal derivado é usar a define-derived-mode
macro:
(define-derived-mode your-cool-mode prog-mode ...)
No Emacsen mais antigo (pré-24), isso quebra quando prog-mode
. E você não pode usá (if (fboundp 'prog-mode) ...)
-lo porque a macro espera um símbolo literal e o citará na expansão.
define-derived-mode
usa o pai de várias maneiras. Você precisaria copiar todos aqueles em sua própria definição de modo para usá-los, e isso é tedioso e propenso a erros.
Portanto, a única maneira é usar duas define-derived-mode
instruções diferentes , dependendo da existência prog-mode
ou não. Isso deixa você com o problema de escrever seu código de inicialização duas vezes. O que é obviamente ruim, então você extrai isso para sua própria função, conforme descrito acima.
(É claro que a melhor solução é largar o suporte para 23.xe usar o escopo lexical. Mas acho que você já considerou e largou essa opção. :-))
prog-mode
. Notavelmente, você sofrerá com a falta de vinculação lexical.