Elisp adalah bahasa yang ditafsirkan. Anda dapat memasukkan kode khusus versi ke dalam kode Anda .emacs
, tetapi melindunginya dengan menguji pada waktu buka yang beroperasi pada versi yang benar.
(if (is-new-feature-available)
(shiny-new-feature)
(old-less-nifty-feature))
Kode ini akan berfungsi di semua versi karena (shiny-new-feature)
hanya dievaluasi ketika (is-new-feature-available)
mengembalikan true. Sebagian besar jawaban ini ditujukan untuk bagaimana menerapkan (is-new-feature-available)
.
Mengatasi berbagai set fitur
Lebih baik menguji apakah fitur tersedia daripada menguji versi Emacs. Terkadang fitur tersebut tersedia sebagai paket opsional. Jika Anda ingin menjalankan kode dalam XEmacs atau varian Emacs lainnya, mungkin ia memperoleh fitur yang sama di versi yang berbeda. Gunakan fungsi boundp
untuk menguji apakah suatu variabel tersedia, dan fboundp
untuk menguji apakah suatu fungsi tersedia.
Misalnya, cuplikan berikut ini mengikat kunci untuk beralih visual-line-mode
jika tersedia, dan longlines-mode
sebaliknya.
(global-set-key "\eml" (if (fboundp 'visual-line-mode)
'visual-line-mode
'longlines-mode))
Terkadang, daripada menguji fitur, lebih mudah untuk menjalankan sepotong kode kecil dan mengabaikan kesalahan apa pun karena fungsi yang tidak terdefinisi, argumen yang tidak valid, dll. Jangan lakukan ini untuk sejumlah besar kode, karena ini akan membuat kode Anda sangat sulit di-debug.
Misalnya, saya tidak ingin melihat bilah alat. Versi Emacs yang lebih lama tidak memilikinya sama sekali. GNU Emacs dan XEmacs menambahkan fitur itu dengan cara yang berbeda dan menjadikannya default. Begini cara saya mematikannya. The set-specifier
fungsi khusus untuk XEmacs, dan default-toolbar-visible-p
khusus untuk versi yang cukup baru-baru Emacs; menggunakan condition-case
mengurus kedua persyaratan. GNU Emacs menyediakan fungsi khusus jadi saya hanya menguji apakah fungsi itu tersedia.
;; For XEmacs
(condition-case nil
(set-specifier default-toolbar-visible-p nil)
(error nil))
;; For GNU Emacs
(if (fboundp 'tool-bar-mode)
(tool-bar-mode 0))
Beberapa nama wajah berubah karena versi. Gunakan facep
untuk menguji ketersediaan nama wajah.
(let ((face (if (facep 'mode-line) 'mode-line 'modeline)))
(set-face-background face …))
Terkadang Anda mungkin ingin memuat paket yang bagus jika ada, dan tidak melakukan apa pun jika paket tidak tersedia. require
memiliki argumen opsional untuk itu.
(require 'tex-site nil t) ;; Load AUCTeX if available
Argumen ini diperkenalkan di GNU Emacs 20.4 dan tidak tersedia di XEmacs, jadi jika Anda ingin melangkah sejauh itu, Anda harus membungkusnya condition-case
atau menggunakannya load
(yang tidak memeriksa perpustakaan yang sudah dimuat) .
Batasi ketergantungan versi ke fitur tingkat pengguna. Jangan gunakan fitur pemrograman yang lebih baru yang tidak tersedia di semua versi yang ingin Anda dukung: Anda harus menyediakan versi kompatibilitas untuk versi yang lebih lama, dan lebih mudah mempertahankan satu versi.
Terkadang Anda memang membutuhkan fitur di banyak tempat, dan itu tersedia di semua implementasi yang Anda pedulikan, tetapi dengan cara yang berbeda. Ini sebagian besar terjadi jika Anda ingin mendukung XEmacs dan GNU Emacs: mereka memiliki kecenderungan frustasi untuk menyalin fitur masing-masing tetapi tidak pada antarmuka mereka. Dalam hal ini, mendefinisikan fungsi kompatibilitas lebih mudah daripada pengujian pada saat digunakan.
Misalnya, kode berikut mendefinisikan fungsi yang mengembalikan sistem jendela dari frame saat ini, cara GNU modern, cara XEmacs modern, dan cara gaya lama ketika Anda tidak bisa menggabungkan frame terminal dan GUI dalam contoh yang sama.
(defalias 'compat-window-system
(cond
((fboundp 'window-system) #'window-system)
((fboundp 'device-type)
(lambda (&optional frame)
(device-type (frame-device frame))))
(t
(lambda (&optional frame) window-system))))
Ketergantungan lingkungan
Tidak banyak kode yang harus bergantung pada platform. Variabel system-type
menunjukkan sistem operasi. Saya menggunakannya secara eksklusif untuk mengaktifkan beberapa peretasan ms-dos
(ya, file saya setua itu) dan windows-nt
.
Anda mungkin ingin menambahkan direktori ke jalur pencarian yang dapat dieksekusi ( PATH
), tetapi itu biasanya paling baik dilakukan di luar Emacs, di .profile
sistem Anda untuk Unix-like dan melalui panel kontrol di Windows. Untuk menguji apakah program eksternal tersedia, hubungi executable-find
.
Untuk kode yang perlu bertindak berbeda tergantung pada jenis GUI jika ada, periksa window-type
atau penggantinya (lihat di atas).
File inisialisasi
Untuk kompatibilitas maksimum, masukkan kode Anda ~/.emacs
. GNU Emacs mulai mencari di ~/emacs.d
versi 22. XEmacs mulai mencari di ~/.xemacs
dalam versi 21.4. Pendekatan alternatif adalah memasukkan kode kompatibilitas ~/.emacs
dan menyelesaikannya dengan memuat file utama Anda. Letakkan di (setq load-home-init-file t)
suatu tempat untuk menghindari versi terbaru dari XEmacs yang menanyakan apakah Anda ingin memindahkan Anda .emacs
ke lokasi khusus XEmacs.
Versi Emacs yang berbeda mungkin memiliki ekspansi yang berbeda dan tidak kompatibel untuk beberapa makro. Jadi jangan berbagi file byte-yang dikompilasi antar versi, kompilasi file pada setiap mesin.
Terkadang fitur sudah usang, tetapi Anda masih ingin menggunakannya karena hanya itu yang ada di beberapa versi lain yang ingin Anda dukung. Peringatan byte compiler berasal dari byte-obsolete-variable
properti.
(cond
((not (boundp 'desktop-enable))
(defvaralias 'desktop-enable 'desktop-save-mode))
((get 'desktop-enable 'byte-obsolete-variable)
(put 'desktop-enable 'byte-obsolete-variable nil)))
¹ Secara relatif, dibandingkan dengan XEmac yang lebih lama.
window-system
, dll dapat dijawab secara wajar di sini.