Pregunta

Considerando una pulsación de tecla en Emacs, p. ej. C-x C-s . Puedo averiguar qué función invoca escribiendo C-h c keystroke , pero ¿cómo puedo encontrar dónde se definió esta combinación de teclas?

(Quizás la respuesta correcta es que no se puede decidir, porque los mapas de teclas no almacenan este tipo de información).

¿Fue útil?

Solución

Emacs no guarda la información sobre dónde están asociadas las vinculaciones de teclas con las funciones. De hecho, la respuesta suele ser indefinida.

Muchas veces, las combinaciones de teclas se configuran como un efecto secundario de un modo menor, o mediante ganchos de modo. El enlace de teclas 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 quiere es esencialmente rastrear quién establece una variable con un valor particular. De manera similar, para los enlaces de teclas que se establecen localmente a través de los ganchos de modo (usando local-set-key ). Además, incluso puede configurar enlaces de teclas a través de variables de archivo . Todo esto es solo para decir que los enlaces de teclas en Emacs son efímeros.

Lo mejor que puedes hacer es encontrar la función asociada con la tecla y buscar en ese archivo (o en cualquier archivo relacionado si el modo está dividido en varios archivos).

La búsqueda de vinculación de teclas en emacs está bastante involucrada debido a la gran cantidad de formas en que puede establecer / asociar pulsaciones de teclas (globalmente, modo mayor, modo menor, modo secundario mayor, modo local a búferes, propiedades de texto, etc.). Para obtener una descripción general rápida, consulte esta documentación .

Puedes escribir una función como esta para mirar en los modos menores para ver dónde se puede establecer una combinación de teclas, pero, por supuesto, mi primera prueba mostró que la combinación de teclas no estaba definida allí. Pero quizás 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 estés tratando de resolver (aparte de esta pregunta)?

Otros consejos

Simplemente haga M-x find-function

Desde el documento de Emacs:

  

(función de función de búsqueda)

     

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

     

Encuentra el archivo fuente que contiene el   definición de la función cerca del punto   (seleccionado por   `función-llamada-en-punto ') en una   búfer y puntos de punto antes de la   definición. Establecer marca antes de mover, si   el búfer ya existía.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top