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
ในความคิดของฉันมันไม่คุ้มค่าความพยายามอีกต่อไปและคุณจะต้องสละคุณสมบัติที่สำคัญมากกว่า โดยเฉพาะอย่างยิ่งคุณจะต้องทนทุกข์ทรมานจากการขาดคำศัพท์