Apa itu kait?

8

Hanya untuk mengklarifikasi ... Misalnya, dalam dokumen ini :

Hook adalah variabel Lisp yang menyimpan daftar fungsi, untuk dipanggil pada beberapa kesempatan yang didefinisikan dengan baik. (Ini disebut menjalankan hook.) Fungsi individual dalam daftar disebut fungsi hook dari hook. Misalnya, pengait kill-emacs-hookberjalan sesaat sebelum keluar dari Emacs ...

Saya pikir itu mengatakan ada variabel (simbol) bernama kill-emacs-hookyang mewakili daftar dari set "fungsi kait" yang akan berjalan ketika kill-emacs-hookdievaluasi, dengan demikian melakukan fungsi-fungsi tersebut. Benar? Kemudian

(add-hook 'text-mode-hook 'auto-fill-mode)

menambah auto-fill-modedaftar yang diidentifikasi text-mode-hookselain apa yang sudah ada. Baik. Sekarang ini

(defcustom text-mode-hook nil
  "Normal hook run when entering Text mode and many related modes."
  :type 'hook
  :options '(turn-on-auto-fill flyspell-mode)
  :group 'wp)

di mana tampaknya kita sedang membuat atau mengubah text-mode-hook. Saya sekarang bingung dengan sifat kait dan hubungan mereka dengan defcustom. Pilihan logis saya adalah bahwa kode ini menciptakan variabel text-mode-hookyang "tipe" (tidak tahu apa yang dimaksud dengan tipe di elisp) hook. Apakah ini, memang, seharusnya menjadi ciptaan awal kait text-mode-hook? Jika demikian, ada apa dengan "opsi?" Apakah itu fungsi kait yang seharusnya, atau yang lainnya?

147 siang
sumber
1
Dari tautan Anda: «Kata kunci: opsi menentukan daftar nilai yang disarankan untuk variabel. Biasanya,: opsi berlaku untuk sebuah kail. Daftar ini hanya saran; itu tidak eksklusif; seseorang yang menetapkan variabel dapat mengaturnya ke nilai lain; daftar yang ditampilkan berikut: kata kunci opsi dimaksudkan untuk menawarkan pilihan yang nyaman bagi pengguna. »
The Sidhekin

Jawaban:

6

Pemahaman Anda tentang gagasan Emacs Lisp tentang kait benar-benar benar. Memang, kait "normal" hanyalah daftar fungsi (setiap fungsi tidak mengambil argumen, kalau tidak biasanya tidak disebut "kait" atau "kait normal" di Emacs Lisp).

Sebagian besar variabel ini memiliki nama yang diakhiri dengan -hook. Mereka adalah kait normal, dijalankan dengan cara run-hooks. Nilai hook semacam itu adalah daftar fungsi; fungsi dipanggil tanpa argumen dan nilainya diabaikan sama sekali. Cara yang disarankan untuk meletakkan fungsi baru pada hook seperti itu adalah dengan menelepon add-hook.

Variabel yang namanya diakhiri -functionsbiasanya kait tidak normal (beberapa kode lama juga dapat menggunakan -hookssuffix yang sudah tidak digunakan lagi ); nilainya adalah daftar fungsi, tetapi fungsi-fungsi ini dipanggil dengan cara khusus (mereka meneruskan argumen, atau nilai kembalinya digunakan). Variabel yang namanya berakhir -functionmemiliki fungsi tunggal sebagai nilainya.

Antarmuka kustomisasi adalah hal yang berbeda. Semua perbedaan antara defvardan defcustomyang terakhir memungkinkan pengguna untuk mengedit variabel melalui antarmuka "kustomisasi". Interface ini dapat memfasilitasi mengedit jenis tertentu data, jadi misalnya jika Anda mengatakan bahwa :typedari text-mode-hookini hook, maka antarmuka kustomisasi memastikan bahwa text-mode-hookselalu daftar fungsi. Selanjutnya, Anda dapat menentukan opsi mana yang direkomendasikan dengan :optionsargumen.

Jadi, pemahaman Anda benar dan defcustomdan pilihannya hanyalah cara untuk menginstruksikan Emacs, sehingga dapat lebih membantu pengguna ketika dia menggunakan antarmuka "kustomisasi".

Mark Karpov
sumber
Tetapi contoh a defcustomini tidak bagus karena text-mode-hooksudah ada; sudah termasuk. Baik? Sekarang, jika saya menulis mode saya sendiri dan kemudian menginginkan penyesuaian, saya akan melakukan ini. Kebingungan saya adalah contoh ini benar-benar membuat text-mode-hook, bukan mengubahnya. Apakah itu pemahaman yang benar? Dan jika ini memang membuat yang baru text-mode-hook, :optionsapakah menawarkan dua fungsi sebagai opsi untuk melakukan add-hookke daftar, kan?
147 sore
@ 147 pm, contoh ini hanya menunjukkan kepada Anda bagaimana beberapa bagian dari kode Emacs yang ada mendefinisikan variabel yang dapat disesuaikan yang mewakili hook. Singkatnya, defcustomhanya mendefinisikan variabel baru. Dalam contoh khusus text-mode-hookini dibuat dan nilai awalnya adalah nil. Antarmuka kustomisasi juga diberitahu bahwa nilai yang disarankan untuk ada dalam daftar ini adalah turn-on-auto-filldan flyspell-mode. Namun Anda dapat mengatur text-mode-hookapa pun yang Anda suka secara terprogram, itu variabel normal. Anda dapat menggunakan add-hookdengan fungsi lain juga.
Mark Karpov
@ 147, dengan kata lain, semua argumen kata kunci hanyalah petunjuk untuk sistem kustomisasi, mereka tidak membuat perbedaan di luarnya. Tanpa petunjuk bahwa kode berjumlah (defvar text-mode-hook nil).
Mark Karpov
Tapi apakah ini defcustomcara kait awalnya dibuat? Seperti apa bentuknya. Dengan kata lain contoh ini diambil dari jauh di dalam perut kode Emacs di suatu tempat.
147 sore
@ 147 siang, ya, benar.
Mark Karpov