Bagaimana cara menggunakan defcustom dengan benar?

15

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.eltampaknya menggunakan defcustom,, defgroupdll. Tampaknya ini akan menjadi dunia bayangan dari variabel yang didefinisikan secara global yang digunakan oleh kode elisp. Jadi satu pertanyaan adalah, Apakah penggunaan defcustomcara 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.

147 siang
sumber
Bisakah Anda mengklarifikasi apa yang Anda minta? Apakah Anda ingin tahu kapan harus menggunakan customizefasilitas 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 seperti defcustomdan sejenisnya.
Dan

Jawaban:

20

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(atau Options > Customize Emacs > Top-level Customization Groupdari 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:).

defcustomadalah pembungkus di sekitar fungsionalitas tingkat rendah Emacs Lisp seperti defvaritu 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. defgroupadalah 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:

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

The defgroupmenciptakan grup baru dalam antarmuka Kustomisasi di bawah convenienceitem tingkat atas . Saya kemudian membutuhkan variabel untuk menyimpan status kotak centang yang mungkin. Saya bisa menggunakan defvar, tetapi karena saya ingin ini mudah dikustomisasi, saya memilih untuk menggunakannya defcustom. The :groupporsi menunjukkan bahwa itu milik kelompok yang sebelumnya ditetapkan, dan :typemenunjukkan 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 RETdan menavigasi ke Convenience > Checkbox, saya melihat yang berikut:

antarmuka kustomisasi

Ini bukan antarmuka yang paling indah di dunia, tetapi perhatikan bahwa ia memiliki alat interaktif untuk menyesuaikan nilai "Kotak Centang" (secara checkbox-statesinternal). Ini menunjukkan nilai string saat ini bersama dengan tombol INS(masukkan) dan DEL(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.

camdez
sumber
2
Pos bagus! Keuntungan paling signifikan untuk Menyesuaikan (dan defcustom) adalah bahwa hal itu secara otomatis menangani : (1) pemeriksaan jenis , untuk membantu mencegah Anda menetapkan nilai yang salah ke variabel (asalkan penulis defcustomberusaha untuk menyediakan jenis yang masuk akal) periksa), (2) inisialisasi ( :initialize) dan perbarui kans (dipicu) ( :set).
Drew
Terima kasih! Saya telah memperbarui pos untuk mencerminkan saran Anda.
camdez
7

Apakah penggunaan defcustom cara lain untuk melakukan (disesuaikan) variabel global?

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.

Adakah yang bisa mengarahkan saya untuk menyalakan cara menggunakan ...

The halaman manual untuk defcustom memiliki klarifikasi lebih lanjut. Topik penyesuaian dalam manual memiliki detail lengkap.

... kapan digunakan, mengapa, kapan tidak?

Saya pribadi menemukan defcustom kurang rumit selama pengembangan karena saya tidak harus berurusan dengan masalah reload dengan defvar dan setq.

Pengguna Emacs
sumber