tl; dr: if
Kendi başlangıç işlevinizi kullanın :
(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)))
Sonra tüm modun başlatılmasını yapın your-cool-init
.
Daha uzun açıklama:
Sorun, türetilmiş bir ana mod yazmanın resmi yolunun define-derived-mode
makroyu kullanmaktır :
(define-derived-mode your-cool-mode prog-mode ...)
Daha eski Emacsen'de (24 öncesi), bu ne zaman kırılır prog-mode
. Ve (if (fboundp 'prog-mode) ...)
orada kullanamazsınız çünkü makro değişmez bir sembol bekler ve genişletmede sizin için teklif verir.
define-derived-mode
ebeveynleri çok çeşitli şekillerde kullanır. Bunları kullanmak için hepsini kendi mod tanımınızda kopyalamanız gerekir ve bu hem sıkıcı hem de hataya açıktır.
Dolayısıyla tek yol, var define-derived-mode
olup olmamasına bağlı olarak iki farklı ifade kullanmaktır prog-mode
. Bu, başlatma kodunuzu iki kez yazma sorunu yaşamanıza neden olur. Tabii ki kötü, bu yüzden bunu yukarıda açıklandığı gibi kendi işlevine çıkarıyorsunuz.
(Tabii ki en iyi çözüm 23.x için destek bırakmak ve sözlük kapsamını kullanmaktır. Ama sanırım bu seçeneği zaten düşündünüz ve bıraktınız. :-))
prog-mode
. Özellikle, sözcüksel bağlanma eksikliğinden muzdarip olacaksınız.