2011-09-03 11 views
7

Me preguntaba si hay una función inversa (kbd), una que podría utilizar para obtener de un código clave una descripción significativa de la misma, por ejemplo, C-b de 2.Función inversa (kbd)?

Normalmente funciona (format "%c" x), pero no tanto para el ejemplo anterior como para muchos otros, ya que las combinaciones de teclas, especialmente en Emacs, son a menudo más complicadas que un solo carácter, e incluso cuando son un solo carácter, pueden ser un espacio en blanco o una Pestaña

Parece que las funciones de documentación utilizan la función (describe-buffer-bindings), que está escrita en C y por lo tanto inmutable, y me gustaría evitar esa ruta, si es posible, y manipular los datos en mi camino para proporcionar características más elegantes.

Respuesta

10

Probablemente estés buscando (key-description KEYS &optional PREFIX).

Por ejemplo: (key-description [2]) y (key-description (kbd "C-b")) evaluar a "C-b".

+1

¡Gracias! ¡Eso es exactamente lo que necesitaba! (key-description (format "% c" 2)) ahora devuelve C-b! – konr

2

Definición de la inversa de KBD

(defun my-kbd-inverse (key) 
    (if (numberp key) 
     (setq key (vector key))) 
    (key-description key)) 

prueba

(defvar my-example-keys nil) 
(setq my-example-keys 
     (list 2 3 ?a 
      24 
      [?\C-x ?l] 
      (list "C-x" "A") 
      [(meta right) (meta left)] 
      (kbd "<f9>") 
      (kbd "<C-f9>") 
      (kbd "C-M-a") 
      [24 f9 97])) 
(cl-loop for key in my-example-keys 
     do 
     (princ (my-kbd-inverse key)) 
     (terpri)) 

Si hay alguna clave que se pueden pasar a global-set-key pero no funciona con la definición actual de my-kbd-inverse, que me haga saber .

Nota al margen: hay un motivo por el cual la descripción de la clave no toma un carácter como argumento. Hay dos errores de caracteres:

  1. un carácter es simplemente un número. No hay un tipo de datos separado para los personajes.

  2. existe la sensación de que un carácter es no una clave. Un personaje es un evento de entrada. Una secuencia de eventos de entrada forma una secuencia de teclas (un atajo de teclado) y una secuencia de teclas se llama una tecla, en resumen. El carácter ?a no es una clave, pero el vector [a] y la cadena "a" son. Las funciones global-set-key y key-description solo toman llaves.