2009-05-04 20 views
6

Considerando una sequenza di tasti in Emacs, ad es. C-x C-s. Posso capire quale funzione invoca digitando C-h c sequenza di tasti, ma come posso trovare dove è stata definita questa combinazione di tasti?In quale file è stata definita la combinazione di tasti?

(Forse la risposta giusta è che non può essere deciso, in quanto le mappe dei tasti non memorizzare questo tipo di informazioni.)

risposta

5

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

+0

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. –

1

Basta fare Mx find-funzione

Da Emacs doc:

(funzione find-funzione)

trovare la definizione della funzione punto vicino.

trova il file sorgente contenente la definizione della funzione vicino al punto (selezionata per `funzione cd-a-punto ') in un buffer e posti punto prima della definizione . Imposta segno prima di spostarsi, se il buffer esisteva già.

+0

Questo non è quello che sto cercando. Mi dice dove è stata definita una * funzione * non una * keybinding *. –

+0

Non penso che tu possa scoprirlo. –

Problemi correlati