tl; dr: Gunakan if
dan 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-mode
makro:
(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-mode
menggunakan 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-mode
pernyataan yang berbeda , tergantung pada apakah prog-mode
ada 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.