2009-05-04 14 views
6

Considerando una pulsación de tecla en Emacs, p. C-x C-s. Puedo averiguar qué función invoca escribiendo C-h c pulsación de tecla, pero ¿cómo puedo saber dónde se definió esta vinculación?¿En qué archivo se definió el enlace de clave?

(Tal vez la respuesta correcta es que no se puede decidir, ya que los mapas de teclas no almacenan este tipo de información.)

Respuesta

5

Emacs no guarda la información sobre dónde se asocian las teclas con las funciones. De hecho, la respuesta generalmente no está definida.

Muchas veces los enlaces de teclas se configuran como un efecto secundario de un modo menor, o mediante ganchos de modo. El enlace de clave para modos menores a menudo se almacena en alguna variable como comint-mode-map. Este mapa de teclas se habilita configurando la variable de modo comint-mode. Sin embargo, ese mapa de modo es una variable global y cualquiera, en cualquier lugar, puede agregarle enlaces de teclas. Entonces, hacer lo que quieras es esencialmente rastrear quién establece una variable con un valor particular. De forma similar, para enlaces de teclas que se configuran localmente a través de ganchos de modo (usando local-set-key). Además, incluso puede configurar enlaces de teclas a través del file variables. Todo esto es para decir que las asociaciones de teclas en Emacs son efímeras.

Lo mejor que puede hacer es encontrar la función asociada a la tecla y buscar en ese archivo (o cualquier archivo relacionado si el modo se divide en varios archivos).

La búsqueda de enlace de claves en emacs es bastante complicada debido a la gran cantidad de maneras de establecer/asociar pulsaciones de tecla (globalmente, modo principal, modos menores, anulación de modos menores, local a búferes, propiedades de texto, etc.). Para obtener una visión general rápida, consulte this documentation.

Puede escribir una función como esta para buscar en los modos menores para ver dónde podría establecerse una combinación de teclas, pero por supuesto mi primera prueba mostró que la vinculación no estaba definida allí. Pero tal vez el código sea instructivo.

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

¿Hay algún problema específico que intente resolver (que no sea esta pregunta)?

+0

Gracias por su respuesta detallada. La pregunta me vino a la mente ayer cuando estaba tratando de descubrir que era una combinación de teclas específica definida en los modos centrales o por un paquete externo. –

1

Sólo hacer Mx find-función

De Emacs doc:

(función find-función)

encontrar la definición de la función punto cercano.

encuentra el archivo fuente que contiene la definición de la función cerca del punto (seleccionado por `función de los llamados-a-punto ') en un tampón y lugares apuntan antes de la definición . Establecer marca antes de mover, si el búfer ya existe.

+0

Eso no es lo que estoy buscando. Me dice dónde se definió * function * no * keybinding *. –

+0

No creo que puedas descubrirlo. –

Cuestiones relacionadas