tl; dr: Sử dụng if
và chức năng init của riêng bạ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)))
Sau đó thực hiện tất cả các khởi tạo chế độ trong your-cool-init
.
Giải thích dài hơn:
Vấn đề là cách chính thức để viết một chế độ chính xuất phát là sử dụng define-derived-mode
macro:
(define-derived-mode your-cool-mode prog-mode ...)
Trên Emacsen cũ (trước 24), điều này sẽ phá vỡ khi prog-mode
. Và bạn không thể sử dụng (if (fboundp 'prog-mode) ...)
ở đó vì macro mong đợi một biểu tượng bằng chữ và sẽ trích dẫn nó cho bạn trong bản mở rộng.
define-derived-mode
sử dụng cha mẹ trong vô số cách. Bạn cần sao chép tất cả những thứ trong định nghĩa chế độ của riêng bạn để sử dụng chúng, và điều đó vừa tẻ nhạt vừa dễ bị lỗi.
Vì vậy, cách duy nhất là sử dụng hai define-derived-mode
câu lệnh khác nhau , tùy thuộc vào việc có prog-mode
tồn tại hay không. Điều đó khiến bạn gặp phải vấn đề viết mã khởi tạo hai lần. Điều này tất nhiên là xấu, vì vậy bạn trích xuất nó vào chức năng của chính nó, như được mô tả ở trên.
(Tất nhiên, giải pháp tốt nhất là bỏ hỗ trợ cho 23.x và sử dụng phạm vi từ vựng. Nhưng tôi đoán bạn đã xem xét và bỏ tùy chọn đó. :-))
prog-mode
. Đáng chú ý, bạn sẽ bị thiếu sự ràng buộc từ vựng.