Cara mengetahui apa urutan kunci sebenarnya

14

Dari waktu ke waktu saya mengamati perilaku tak terduga saat mengedit teks. Sumber pertama saya biasanya digunakan C-h kuntuk mencari tahu fungsi apa yang dipanggil oleh urutan kunci yang diberikan. Namun, kadang-kadang dokumentasi bertentangan dengan perilaku yang diamati. Dalam kasus ini, saya biasanya berasumsi bahwa beberapa paket lain telah terhubung ke fungsi atau urutan tombol itu dan memodifikasi perilakunya.

Bagaimana saya bisa mengetahui fungsi mana yang terhubung ke urutan kunci saya?

Salah satu contoh yang saya temui baru-baru ini adalah saya menekan "tombol dan tanda kutip dimasukkan pada awal dan akhir wilayah aktif. Saya memiliki kecurigaan bahwa ini bukan perilaku Emacs default, jadi saya biasanya C-h k "mencari tahu fungsi apa yang sebenarnya dipanggil.

The describe-keydokumentasi mengatakan kepada saya bahwa fungsi self-insert-commanditu dipanggil, yang built-in fungsi. Singkatnya, setelah beberapa percobaan dan kesalahan, saya dapat menentukan bahwa perilaku tersebut disebabkan oleh electric-pair-mode. Di masa depan, apakah ada cara yang lebih cepat untuk sampai pada kesimpulan ini daripada mematikan paket yang dicurigai satu per satu sampai menemukan pelakunya?

nispio
sumber
Mungkinkah itu electric-pair-modediaktifkan hanya dalam beberapa mode utama? Apakah Anda masih melihat self-insert-commanduntuk "ketika Anda melakukan C-h ksementara electric-pair-modeaktif?
Kaushal Modi
@kaushalmodi: Ternyata itu electric-pair-modeberfungsi dengan menghubungkan ke post-self-insert-hook, dan bukan dengan mengubah keybinding.
nispio
C-h kmemberi tahu Anda dengan tepat apa yang terjadi pada penekanan tombol. Jika Anda melihat dokumentasi untuk self-insert-command, itu sangat jelas mengatakan post-self-insert-hookdijalankan setelah perintah selesai.
shosti
@shosti: Dalam contoh sederhana ini, ya. Tetapi bagaimana jika bagaimana jika ekstensi menggunakan after-change-functionsseperti Jordon menyebutkan dalam jawabannya? Dokumentasi untuk suatu fungsi mungkin tidak akan secara khusus menyebutkan kaitan itu, bukan?
nispio
Maaf, saya seharusnya lebih spesifik. C-h k+ kait standar == perilaku lengkap (lebih atau kurang). Tentu saja kadang-kadang meninggalkan banyak kemungkinan, tetapi masih jauh lebih transparan daripada sistem perangkat lunak kompleks lainnya yang saya tahu.
shosti

Jawaban:

13

Tidak ada cara mudah untuk mengetahui dengan tepat apa yang akan dilakukan dengan menekan satu tombol.

Jika Anda melihat perilaku tambahan selalu periksa kait umum. Lihat daftar di sini: http://www.gnu.org/software/emacs/manual/html_node/elisp/Standard-Hooks.html

Dalam kebanyakan kasus yang penting adalah:

  • setelah-perubahan-fungsi
  • sebelum-perubahan-fungsi
  • pertama-ubah-kait
  • post-command-hook
  • pra-perintah-kait
  • post-self-insert-hook

Anda harus memeriksa kait-kait itu dan melihat ke fungsi-fungsi yang dikandungnya untuk melihat mana yang mengubah perilaku Anda.

Jika fungsi dalam kait ini tidak sepenuhnya menggambarkan perilaku yang diamati, periksa fungsi untuk saran yang akan muncul dalam dokumentasi mereka dari describe-function.


Sunting: Saya telah menulis beberapa fungsi untuk membantu mendeskripsikan sebuah kait lebih baik daripada melalui fungsi satu per satu: https://gist.github.com/jordonbiondo/bad03e44bb053db0f1eb Anda dapat menggunakan yang describe-hookdidefinisikan di sana seperti fungsi uraian lainnya. Ini adalah contoh dari outputnya:

Dan ini semua kodenya, kalau-kalau intinya menghilang:

(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)))))
Jordon Biondo
sumber
Apakah itu berarti bahwa ketika suatu fungsi dinasihati, dokumentasi secara otomatis diperbarui untuk mencerminkan perubahan?
nispio
Saya tidak tahu apakah properti aktual dapat diperbarui, tetapi nilai yang dikembalikan oleh documentationdiperbarui untuk mencerminkan.
Jordon Biondo
1
@nispio ya, benar.
Malabarba
1
Kode / fungsi di gist.github.com/jordonbiondo/bad03e44bb053db0f1eb bisa, dan menurut saya, harus dimasukkan dalam jawaban. Saya pikir jawaban SE memiliki batas 30.000 karakter.
Faheem Mitha
4

Mungkin bukan jawaban lengkap untuk pertanyaan Anda, tetapi paket helm-descbindsmembantu Anda mencari semua ikatan keyboard yang ditentukan dari representasi ascii dari pintasan. Untuk setiap klik, ini menunjukkan kepada Anda fungsi interaktif yang terkait dengan pintasan keyboard, dan Anda dapat meminta helm-descbindsuntuk menggambarkannya , atau menjalankannya langsung dari hasil pencarian.

masukkan deskripsi gambar di sini

Berikut ini deskripsi paket dari situs GitHub:

Helm Descbinds menyediakan antarmuka untuk binding-binding menjelaskan emacs yang membuat binding kunci yang aktif saat ini dapat dicari secara interaktif dengan helm.

Selain itu Anda memiliki tindakan berikut

  • Jalankan perintah
  • Jelaskan perintahnya
  • Temukan perintahnya

Dan C-zakan memberi Anda deskripsi persisten dari perintah saat ini.

Amelio Vazquez-Reina
sumber
2
Ini bagus. Saya pasti akan mengikat ini C-h b. Satu-satunya harapan saya adalah bahwa saya dapat melompat ke item dalam daftar dengan memasukkan urutan kunci yang sebenarnya daripada mengetikC - c _ C - p
nispio