Seperti kebanyakan pengguna Emacs, saya telah menyesuaikan mode dengan mengubah variabel. Apa yang tidak pernah terpikir oleh saya adalah mentalitas pemrograman keseluruhan di belakang telah menyesuaikan ini-dan-itu. Saya menyadari ini ketika saya mulai melihat beberapa kode sumber untuk eshell. Saya bukan programmer elisp, tetapi secara khusus em-ls.el
tampaknya menggunakan defcustom
,, defgroup
dll. Tampaknya ini akan menjadi dunia bayangan dari variabel yang didefinisikan secara global yang digunakan oleh kode elisp. Jadi satu pertanyaan adalah, Apakah penggunaan defcustom
cara lain untuk melakukan (disesuaikan) variabel global?
Adakah yang bisa mengarahkan saya untuk menyalakan cara menggunakan dengan benar (pertama-tama mengerti) seluruh ide di belakang defcustom
, kapan harus digunakan, mengapa, kapan tidak? Mungkin contoh pemula untuk pemula elisp.
customize
fasilitas versus kapan harus menyesuaikan dengan tangan? Atau apakah Anda tertarik untuk menulis mode? Yang terakhir adalah situasi di mana Anda mungkin benar-benar menemukan diri Anda menggunakan hal-hal sepertidefcustom
dan sejenisnya.Jawaban:
Sistem kustomisasi adalah fitur bawaan Emacs yang dirancang untuk menyelesaikan masalah yang Anda uraikan dengan tepat — pemrograman mungkin bukan cara yang ideal bagi rata-rata pengguna untuk mengonfigurasi editor mereka.
Titik masuk utama ke fungsionalitas penyesuaian adalah
M-x customize RET
(atauOptions > Customize Emacs > Top-level Customization Group
dari menu). Dari sana Anda akan melihat sistem menu interaktif untuk menyesuaikan pengaturan. Antarmuka ini menegaskan bahwa semua pengaturan adalah jenis yang benar (angka, string, warna, dll.), Menghindari sumber kesalahan utama yang dihadapi ketika pengguna mengkonfigurasi Emacs secara terprogram. Jika pengguna memilih untuk tetap melakukan perubahan apa pun yang dilakukan melalui UI, pengaturan disimpan ke bagian khusus dalam file inisialisasi pengguna (baca.emacs
:).defcustom
adalah pembungkus di sekitar fungsionalitas tingkat rendah Emacs Lisp sepertidefvar
itu keduanya mendeklarasikan variabel dan membuatnya terlihat dalam antarmuka penyesuaian. Ini juga memungkinkan pengembang untuk memberikan metadata tambahan yang diperlukan untuk menampilkan kontrol interaktif yang sesuai — yaitu, jenis nilai apa yang disimpan dalam variabel ini? String yang sewenang-wenang? Sebuah angka? Pilihan dari serangkaian opsi yang sudah ditentukan? dll.defgroup
adalah konstruk pengelompokan untuk opsi yang dapat disesuaikan ini sehingga dapat diatur ke dalam hierarki yang bagus.Fungsionalitas ini harus digunakan setiap saat sepotong data harus dianggap sebagai opsi yang dapat dikonfigurasi untuk pengguna daripada detail internal perpustakaan.
Berikut adalah contoh sederhana yang diambil dari perpustakaan kecil saya:
The
defgroup
menciptakan grup baru dalam antarmuka Kustomisasi di bawahconvenience
item tingkat atas . Saya kemudian membutuhkan variabel untuk menyimpan status kotak centang yang mungkin. Saya bisa menggunakandefvar
, tetapi karena saya ingin ini mudah dikustomisasi, saya memilih untuk menggunakannyadefcustom
. The:group
porsi menunjukkan bahwa itu milik kelompok yang sebelumnya ditetapkan, dan:type
menunjukkan bahwa itu adalah urutan string. Ada juga nilai default dan deskripsi. Ada juga fasilitas tambahan (tidak ditampilkan di sini) untuk mengubah nilai yang dimasukkan oleh pengguna.Jika sekarang saya menjalankan
M-x customize RET
dan menavigasi keConvenience > Checkbox
, saya melihat yang berikut:Ini bukan antarmuka yang paling indah di dunia, tetapi perhatikan bahwa ia memiliki alat interaktif untuk menyesuaikan nilai "Kotak Centang" (secara
checkbox-states
internal). Ini menunjukkan nilai string saat ini bersama dengan tombolINS
(masukkan) danDEL
(hapus), dan memungkinkan kita untuk mengedit nilai string dalam kotak edit. Setelah selesai, kami dapat memutuskan apakah akan menerapkan perubahan, mengembalikannya, atau menerapkan dan menyimpannya untuk sesi mendatang.sumber
defcustom
) adalah bahwa hal itu secara otomatis menangani : (1) pemeriksaan jenis , untuk membantu mencegah Anda menetapkan nilai yang salah ke variabel (asalkan penulisdefcustom
berusaha untuk menyediakan jenis yang masuk akal) periksa), (2) inisialisasi (:initialize
) dan perbarui kans (dipicu) (:set
).Iya. Terutama jika Anda ingin pengguna kode Anda dapat mengubah variabel dengan mudah melalui antarmuka penyesuaian Mx .
defcustom memberikan dua manfaat penting bagi pengguna Anda: dokumentasi dan keamanan jenis. Dokumentasi bagus untuk dimiliki di sana. Jenis keamanan memungkinkan seseorang untuk menentukan jenis nilai valid apa yang bisa diambil oleh variabel Anda.
Tentu saja defvar baik-baik saja jika semua yang Anda lakukan adalah menyesuaikan sendiri dan tidak mengantisipasi penggunaan yang lebih luas. Namun, beberapa orang akan mengatakan bertahan dengan defcustom adalah kebiasaan yang baik untuk ditanamkan.
The halaman manual untuk defcustom memiliki klarifikasi lebih lanjut. Topik penyesuaian dalam manual memiliki detail lengkap.
Saya pribadi menemukan defcustom kurang rumit selama pengembangan karena saya tidak harus berurusan dengan masalah reload dengan defvar dan setq.
sumber