tl; dr: ifKendi 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-modemakroyu 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-modeebeveynleri ç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-modeolup 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.