Kanca nedir?


8

Açıklığa kavuşturmak için ... Örneğin, bu dokümanda :

Kanca, bazı iyi tanımlanmış durumlarda çağrılacak işlevlerin listesini tutan bir Lisp değişkenidir. (Buna kancanın çalıştırılması denir.) Listedeki bireysel işlevlere kancanın kanca işlevleri denir. Örneğin, kanca kill-emacs-hookEmacs'tan çıkmadan hemen önce çalışır ...

Ben değerlendirildiğinde kill-emacs-hookçalışacak bir dizi "kanca işlevleri" bir listesini temsil eden bir değişken (sembol) olduğunu düşünüyorum kill-emacs-hook, böylece bu işlevleri yerine getiriyor. Doğru? Sonra

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

, zaten orada olanlara ek olarak auto-fill-modetarafından tanımlanan listeye ekliyor text-mode-hook. İyi. Şimdi bu

(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)

Görünüşe göre ya biz yaratıyoruz ya da değiştiriyoruz text-mode-hook. Şimdi kancaların doğası ve onlarla olan ilişkileri konusunda kafam karıştı defcustom. Mantıksal seçimim, bu kodun text-mode-hook"tip" olan bir değişken yaratmasıdır (elisp türleriyle ne anlama geldiğini bilmiyorum) hook. Gerçekten de, bu kancanın ilk yaratılışı mı olmalı text-mode-hook? Öyleyse, "seçenekler" ne oluyor? Bunlar varsayılan kanca işlevleri mi, yoksa başka bir şey mi?


1
Bağlantınızdan: «: options anahtar kelimesi, değişken için önerilen bir değer listesini belirtir. Genellikle:: seçenekler kancaya uygulanır. Liste sadece bir öneridir; münhasır değildir; değişkeni ayarlayan bir kişi değişkeni başka değerlere ayarlayabilir; aşağıdaki listede gösterilen seçenekler: seçenekler anahtar kelimesi bir kullanıcıya uygun seçenekler sunmayı amaçlamaktadır. »
Sidhekin

Yanıtlar:


6

Emacs Lisp kancası kavramını anlamanız kesinlikle doğrudur. Gerçekten de, “normal” kancalar sadece fonksiyon listeleridir (her fonksiyon argüman almaz, aksi takdirde Emacs Lisp'de genellikle “kanca” veya “normal kanca” olarak adlandırılmaz).

Bu değişkenlerin çoğunun biten isimleri vardır -hook. Bunlar, normal kancalardır run-hooks. Böyle bir kancanın değeri fonksiyonların bir listesidir; işlevler bağımsız değişken olmadan çağrılır ve değerleri tamamen yoksayılır. Böyle bir kancaya yeni bir işlev koymanın önerilen yolu aramaktır add-hook.

İsimleri biten değişkenler -functionsgenellikle anormal kancalardır (bazı eski kodlar da kullanımdan kaldırılmış -hooksson eki kullanabilir ); değerleri işlev listeleridir, ancak bu işlevler özel bir şekilde çağrılır (bağımsız değişkenlerden geçirilir veya dönüş değerleri kullanılır). Adları biten değişkenlerin -functiondeğerleri olarak tek işlevleri vardır.

Özelleştirme arayüzü farklı bir şeydir. Arasındaki tüm farkı defvarve defcustomikinci düzenlemeye “özelleştir” arayüzü üzerinden değişkeni kullanıcı izin vermesidir. Bu arayüz söylüyorsun eğer öyleyse örneğin, belirli veri tiplerinin düzenleme kolaylaştırabilir :typeait text-mode-hookolduğunu hook, daha sonra özelleştirme arayüzü emin olur o text-mode-hookzaman fonksiyonların listesi aşağıda verilmiştir. Ayrıca, hangi seçenekler belirtebilirsiniz tavsiye ile :optionsargüman.

Bu nedenle, anlayışınız doğrudur ve defcustomseçenekleri Emacs'a talimat vermenin bir yoludur, böylece “özelleştir” arayüzünü kullandığında kullanıcıya daha iyi yardımcı olabilir.


Ama bu a örneği defcustomçok iyi değil çünkü text-mode-hookzaten var; zaten dahil. Sağ? Şimdi, kendi modumu yazıp özelleştirme isteseydim, bunu yapardım. Benim karışıklığım, bu örneğin gerçekten yarattığı text-mode-hook, değiştirmediğidir. Bu doğru bir anlayış mı? Ve eğer bu gerçekten yeni bir şey yaratıyorsa text-mode-hook, :optionsbu iki işlevi add-hooklisteye bir seçenek olarak sunuyor , değil mi?
147 pm

@ 147 pm, bu örnek size Emacs'ın mevcut kodunun bir kısmının kancayı temsil eden özelleştirilebilir değişkeni nasıl tanımladığını gösterir. Özetle defcustomsadece yeni değişkenleri tanımlar. Bu özel örnekte text-mode-hookoluşturulur ve başlangıç ​​değeri 'dir nil. Özelleştirme arayüzü de tavsiye edilen değerlerdir bu listede olması söylenir turn-on-auto-fillve flyspell-mode. Ancak text-mode-hookprogramlı olarak istediğiniz herhangi bir şeye ayarlayabilirsiniz , bu normal bir değişkendir. Sen kullanabilirsiniz add-hookda başka fonksiyonları ile.
Mark Karpov

@ 147, diğer bir deyişle, tüm anahtar kelime argümanları yalnızca özelleştirme sistemi için ipuçlarıdır, bunun dışında herhangi bir fark yaratmazlar. Kodun ipucu olmadan (defvar text-mode-hook nil).
Mark Karpov

Ama defcustomkanca başlangıçta böyle mi yaratılıyor? Öyle görünüyor. Başka bir deyişle, bu örnek bir yerlerde Emacs kodunun bağırsaklarındaki derinliklerden alınmıştır.
147 pm

@ 147 pm, evet, doğru.
Mark Karpov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.