Bir tuş dizisinin gerçekte ne yaptığını bulma


14

Zaman zaman metin düzenlerken beklenmedik davranışlar gözlemliyorum. İlk başvurum genellikle C-h kbelirli bir tuş dizisiyle hangi işlevlerin çağrıldığını bulmak için kullanmaktır . Ancak, bazen dokümantasyon gözlemlenen davranışla çelişmektedir. Bu durumlarda, genellikle başka bir paketin bu işleve veya anahtar dizisine bağlandığını ve davranışını değiştirdiğini varsayıyorum.

Anahtar dizime hangi işlevlerin bağlandığını nasıl bulabilirim ?

Son zamanlarda karşılaştığım bir örnek, "tuşa bastığım ve etkin bölgenin başına ve sonuna tırnak işaretleri eklendiğiydi. Bunun varsayılan Emacs davranışı olmadığından şüphe duydum, bu yüzden C-h k "aslında hangi işlevin çağrıldığını bulmak için kullanılır .

describe-keyDokümantasyon işlevi söyledi self-insert-commandyerleşik bir işlevi olan çağrılır ediliyordu. Uzun bir hikaye kısaca anlatmak için, bir miktar deneme yanılma sonrasında, davranışın neden olduğunu belirleyebildim electric-pair-mode. Gelecekte, bu sonuca varmak için şüpheli paketleri suçluyu bulana kadar birer birer kapatmaktan daha hızlı bir yolu var mı?


electric-pair-modeSadece bazı büyük modlarda etkinleştirilmesi mümkün müdür ? Hala görüyor musunuz self-insert-commandiçin "bunu yaptığında C-h kise electric-pair-modeaktiftir?
Kaushal Modi

@kaushalmodi: Bu , tuş takımını değiştirerek değil, electric-pair-modeiçine girerek işe yarıyor post-self-insert-hook.
nispio

C-h kbir tuşa basmak için tam olarak ne olduğunu söyler. İçin belgelere bakarsanız , komut bittikten sonra çalıştığını self-insert-commandaçıkça post-self-insert-hookbelirtir.
shosti

@shosti: Bu basit örnekte evet. Peki ya bir uzatma after-change-functionscevabında Jordon gibi bahsederse ne olur ? Bir işlevin belgeleri muhtemelen bu kancadan özellikle bahsetmez, değil mi?
nispio

Üzgünüm, daha spesifik olmalıydım. C-h k+ standart kancalar == tam davranış (az ya da çok). Tabii ki bazen bu çok fazla olasılık bırakıyor, ancak hala bildiğim diğer karmaşık yazılım sistemlerinden çok daha şeffaf.
shosti

Yanıtlar:


13

Tek bir tuşa basmanın tam olarak ne yapacağını bilmenin kolay bir yolu yoktur.

Ek davranış görürseniz, daima ortak kancaları kontrol edin. Buradaki listeye bakın: http://www.gnu.org/software/emacs/manual/html_node/elisp/Standard-Hooks.html

Çoğu durumda önemli olanlar:

  • sonrası değişim-fonksiyonları
  • önce değiştirme-fonksiyonları
  • Birinci değişiklik-kanca
  • sonrası komut kanca
  • Önceden komut kanca
  • Post-kendini-insert-kanca

Bu kancaları incelemeniz ve hangisinin davranışınızı değiştirdiğini görmek için içerdikleri işlevlere bakmanız gerekir.

Bu kancalardaki işlevler gözlenen davranışı tam olarak tanımlamazsa, belgelerinde belgelenecek öneri için işlevleri kontrol edin describe-function.


Düzenleme: Bir fonksiyonlar tek tek geçmekten daha iyi bir kanca açıklamak için bazı fonksiyonlar yazdım: https://gist.github.com/jordonbiondo/bad03e44bb053db0f1ebdescribe-hook Orada diğer tarif fonksiyonları gibi tanımlanmış kullanabilirsiniz . İşte çıktısının bir örneği:

Ve işte tüm kod, özlünün kaybolması durumunda:

(defun guess-all-hooks ()
  "Return a list of all variables that are probably hook lists."
  (let ((syms '()))
    (mapatoms
     (lambda (sym)
       (if (ignore-errors (symbol-value sym))
           (let ((name (symbol-name sym)))
             (when (string-match "-\\(hook[s]?\\|functions\\)$" name)
               (push sym syms))))))
    syms))

(defun face-it (str face)
  "Apply FACE to STR and return."
  (propertize str 'face face))

(defun describe-hook (hook)
  "Display documentation about a hook variable and the
functions it contains."
  (interactive
   (list (completing-read
          "Hook: " (mapcar (lambda (x) (cons x nil)) (guess-all-hooks)))))
  (let* ((sym (intern hook))
         (sym-doc (documentation-property sym 'variable-documentation))
         (hook-docs (mapcar
                     (lambda (func)
                       (cons func (ignore-errors (documentation func))))
                     (symbol-value sym))))
    (switch-to-buffer
     (with-current-buffer (get-buffer-create "*describe-hook*")
       (let ((inhibit-read-only t))
         (delete-region (point-min) (point-max))
         (insert (face-it "Hook: " 'font-lock-constant-face) "\n\n")
         (insert (face-it (concat "`" hook "'") 'font-lock-variable-name-face))
         (replace-string "\n" "\n\t" nil
                         (point)
                         (save-excursion
                           (insert "\n" sym-doc "\n\n")
                           (1- (point))))
         (goto-char (point-max))
         (insert (face-it "Hook Functions: " 'font-lock-constant-face) "\n\n")
         (dolist (hd hook-docs)
           (insert (face-it (concat "`" (symbol-name (car hd)) "'")
                            'font-lock-function-name-face)
                   ": \n\t")
           (replace-string "\n" "\n\t" nil
                           (point)
                           (save-excursion
                             (insert (or (cdr hd) "No Documentation") "\n\n")
                             (1- (point))))
           (goto-char (point-max))))
       (help-mode)
       (help-make-xrefs)
       (read-only-mode t)
       (setq truncate-lines nil)
       (current-buffer)))))

Bu, bir işlev önerildiğinde dokümantasyonun değişikliği yansıtacak şekilde otomatik olarak güncellendiği anlamına mı geliyor?
nispio

Gerçek özellikleri güncellenip güncellenmediğini bilmiyorum, ancak döndürülen değer documentationyansıtmak için güncellenir.
Jordon Biondo

1
@ nispio evet, öyle.
Malabarba

1
Gist.github.com/jordonbiondo/bad03e44bb053db0f1eb içindeki kod / işlev benim görüşüme göre cevaba dahil edilmelidir. Bence bir SE cevabının 30.000 karakter sınırı var.
Faheem Mitha

4

Sorunuza tam bir cevap olmayabilir, ancak paket , tanımlanmış tüm klavye bağlantılarını kısayolun ascii temsilinden aramanızahelm-descbinds yardımcı olur . Her isabeti için size klavye kısayolu ile ilişkili interaktif fonksiyonunu gösterir ve sorabilir için tarif onu, ya yürütmek arama sonuçlarından doğrudan.helm-descbinds

resim açıklamasını buraya girin

GitHub sitesinden paket açıklaması:

Helm Descbinds, emacs'ın şu anda aktif olan anahtar bağlarını dümenle etkileşimli olarak aranabilir hale getiren tanımlama bağlamaları için bir arabirim sağlar.

Ayrıca, aşağıdaki eylemlere sahipsiniz

  • Komutu yürütün
  • Komutu açıklayın
  • Komutu bulun

Ve C-zsize mevcut komutun kalıcı bir açıklamasını verecektir.


2
Bu harika. Kesinlikle buna bağlayacağım C-h b. Benim tek dileğim, yazmak yerine gerçek anahtar dizisini girerek listedeki öğeye atlayabilmemC - c _ C - p
nispio 26:14
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.