Domanda

Considerando una battitura in Emacs, ad esempio C-x C-s . Riesco a capire quale funzione invoca digitando C-h c tasto , ma come posso trovare dove è stato definito questo keybinding?

(Forse la risposta giusta è che non può essere deciso, perché le mappe dei tasti non memorizzano questo tipo di informazioni.)

È stato utile?

Soluzione

Le informazioni su dove i keybind sono associati alle funzioni non sono conservate da Emacs. In effetti, la risposta è generalmente indefinita.

Molte volte le combinazioni di tasti sono impostate come effetto collaterale di una modalità minore o tramite hook di modalità. L'associazione dei tasti per le modalità secondarie viene spesso memorizzata in alcune variabili come comint-mode-map . Questa mappa di tasti è abilitata impostando la variabile mode comint-mode . Tuttavia, quella mappa delle modalità è una variabile globale e chiunque, ovunque, può aggiungere combinazioni di tasti. Quindi, fare quello che vuoi è essenzialmente tenere traccia di chi imposta una variabile con un valore particolare. Allo stesso modo per le associazioni di tasti che sono appena impostate localmente tramite hook di modalità (usando local-set-key ). Inoltre puoi anche impostare le associazioni dei tasti tramite variabili file . Tutto ciò è solo per dire che i collegamenti chiave in Emacs sono effimeri.

Il meglio che puoi fare è trovare la funzione associata alla chiave e cercare quel file (o qualsiasi file correlato se la modalità è divisa in più file).

La ricerca dell'associazione dei tasti in emacs è abbastanza coinvolta a causa della miriade di modi in cui è possibile impostare / associare i tratti chiave (globalmente, modalità maggiore, modalità minori, sovrascrivendo modalità minori, da locale a buffer, proprietà del testo, ecc.). Per una rapida panoramica, consulta questa documentazione .

Puoi scrivere una funzione come questa per guardare nelle modalità secondarie per vedere dove potrebbe essere impostato un keybinding, ma ovviamente il mio primo test ha mostrato che il keybinding non è stato definito lì. Ma forse il codice sarà istruttivo.

(defun guess-where-keybinding-is-defined (key)
  "try to guess where a key binding might be defined"
  (interactive (list (read-key-sequence "Describe key: ")))
  (let ((bindings (minor-mode-key-binding key))
        found)
    (while (and bindings (not found))
      (if (setq found (caar bindings))
          (find-function (cdar bindings)))
      (setq bindings (cdr bindings)))))

C'è un problema specifico che stai cercando di risolvere (diverso da questa domanda)?

Altri suggerimenti

Basta fare M-x find-function

Dal documento Emacs:

  

(funzione trova-funzione)

     

Trova la definizione della funzione   punto vicino.

     

Trova il file di origine contenente il file   definizione della funzione vicino al punto   (selezionato da   `funzione chiamata al punto ') in a   buffer e punti prima del   definizione. Impostare il segno prima di spostare, se   il buffer esisteva già.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top