L'informazione su dove le associazioni di tasti sono associate con le funzioni non viene mantenuta da Emacs. In realtà, la risposta è solitamente indefinita.
Molte volte le associazioni di tasti sono configurate come un effetto collaterale di una modalità secondaria o tramite i ganci della modalità. Il binding chiave per le modalità secondarie viene spesso memorizzato in alcune variabili come comint-mode-map
. Questa mappa dei tasti è abilitata impostando la variabile di modalità comint-mode
. Tuttavia, quella mappa modalità è una variabile globale e chiunque, ovunque può aggiungere associazioni di tasti ad esso. Quindi, fare ciò che vuoi è essenzialmente tenere traccia di chi imposta una variabile con un valore particolare. Allo stesso modo per le associazioni di tasti che vengono impostate localmente tramite i hook della modalità (utilizzando local-set-key
). Inoltre, puoi anche impostare associazioni di tasti tramite file variables. Tutto questo è solo per dire che i legami chiave in Emacs sono effimeri.
Informazioni su ciò che è meglio fare è trovare la funzione associata al tasto e cercare in quel file (o in qualsiasi file correlato se la modalità è suddivisa in più file).
La ricerca di associazioni chiave in emacs è abbastanza complicata a causa della miriade di modi in cui è possibile impostare/associare i tasti (a livello globale, modalità principale, modalità secondarie, sovrascrittura di modalità minori, locale a buffer, proprietà testo ecc.). Per una rapida panoramica, controlla this documentation.
È possibile scrivere una funzione come questa per cercare nelle modalità secondarie per vedere dove è possibile impostare una combinazione di tasti, ma ovviamente il mio primo test ha mostrato che la combinazione di tasti non è stata definita 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 si sta cercando di risolvere (diverso da questa domanda)?
fonte
2009-05-04 13:14:22
Grazie per la tua risposta dettagliata. La domanda mi è venuta in mente ieri, quando stavo cercando di capire che si trattava di uno specifico keybinding definito nelle modalità core o da un pacchetto esterno. –