tl; dr: Gunakan ifdan fungsi init Anda sendiri:
(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)))
Kemudian lakukan semua inisialisasi mode di your-cool-init.
Penjelasan yang lebih panjang:
Masalahnya adalah bahwa cara resmi menulis mode utama turunan adalah dengan menggunakan define-derived-modemakro:
(define-derived-mode your-cool-mode prog-mode ...)
Pada Emacsen yang lebih tua (pra-24), ini rusak ketika prog-mode. Dan Anda tidak dapat menggunakannya di (if (fboundp 'prog-mode) ...)sana karena makro mengharapkan simbol literal, dan akan mengutipnya untuk Anda dalam ekspansi.
define-derived-modemenggunakan orangtua dalam banyak cara. Anda harus menyalin semua itu dalam definisi mode Anda sendiri untuk memanfaatkannya, dan itu membosankan dan rentan kesalahan.
Jadi satu-satunya cara adalah dengan menggunakan dua define-derived-modepernyataan yang berbeda , tergantung pada apakah prog-modeada atau tidak. Itu membuat Anda kesulitan menulis kode inisialisasi Anda dua kali. Yang tentu saja buruk, jadi Anda mengekstraknya ke dalam fungsinya sendiri, seperti dijelaskan di atas.
(Solusi terbaik tentu saja untuk menjatuhkan dukungan untuk 23.x dan menggunakan scoping lexical. Tapi saya kira Anda sudah mempertimbangkan dan menjatuhkan opsi itu. :-))
prog-mode. Khususnya, Anda akan menderita karena kurangnya ikatan leksikal.