tl; dr: उपयोग करें ifऔर अपने स्वयं के 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)))
फिर सभी मोड का प्रारंभ करें your-cool-init।
लंबी व्याख्या:
समस्या यह है कि एक व्युत्पन्न प्रमुख मोड लिखने का आधिकारिक तरीका define-derived-modeमैक्रो का उपयोग करना है :
(define-derived-mode your-cool-mode prog-mode ...)
पुराने Emacsen (पूर्व -24) पर, यह टूट जाता है जब prog-mode। और आप (if (fboundp 'prog-mode) ...)वहाँ उपयोग नहीं कर सकते क्योंकि मैक्रो को शाब्दिक प्रतीक की उम्मीद है, और विस्तार में आपके लिए इसे उद्धृत करेगा।
define-derived-modeकई तरीकों से माता-पिता का उपयोग करता है। आप उन सभी का उपयोग करने के लिए अपने स्वयं के मोड परिभाषा में कॉपी करने की आवश्यकता होगी, और यह दोनों कठिन और त्रुटि प्रवण है।
इसलिए एकमात्र तरीका दो अलग-अलग define-derived-modeकथनों का उपयोग करना prog-modeहै , जो इस बात पर निर्भर करता है कि मौजूद है या नहीं। जो आपको अपने इनिशियलाइज़ेशन कोड को दो बार लिखने की समस्या के साथ छोड़ देता है। जो निश्चित रूप से बुरा है, इसलिए आप इसे ऊपर बताए गए अनुसार अपने स्वयं के कार्य में निकाल सकते हैं।
(सबसे अच्छा समाधान निश्चित रूप से 23.x के लिए समर्थन छोड़ना और शाब्दिक स्कोपिंग का उपयोग करना है। लेकिन मुझे लगता है कि आपने पहले ही विचार किया था और उस विकल्प को छोड़ दिया था। :-))
prog-mode। विशेष रूप से, आप शाब्दिक बंधन की कमी से पीड़ित होंगे।