¿Hay una función para insertar el `(kbd“ ... ”)` correcto presionando la tecla?

20

Estoy aburrido de buscar nombres de teclas para la kbdfunción, ¿hay alguna manera de insertar automáticamente el nombre de tecla correcto con solo presionar la tecla?

Entonces, por ejemplo, quiero que algo haga esto: estoy escribiendo

(local-set-key |

Corro magical-insert-kbd-command, presiono f6 y obtengo

(local-set-key (kbd "<f6>") |
dshepherd
fuente

Respuestas:

20

No estoy seguro exactamente de lo que estás preguntando. Pero C-h kseguido de presionar la tecla le muestra exactamente a qué cadena debe pasar kbd. Por ejemplo, C-h k f6te muestra <f6>.

Aquí hay un comando que hace lo que quieres, supongo y vincula el resultado a C-c c:

(defun foo (key)
  (interactive "kKey: ")
  (insert (format "(kbd %S)" (key-description key))))

(global-set-key (kbd "C-c c") 'foo)

Luego escriba:

(local-set-key C-c c

Eso te lleva a usar una clave. Si presionas la F6tecla, obtienes esto:

(local-set-key (kbd "<f6>") 

[Actualizado por sugerencia de @HaraldHancheOlsen: cambiado "(kbd \"%s\")"a".](kbd %S)"

Dibujó
fuente
¡Perfecto gracias!. Lo principal que me faltaba era perder la key-descriptionfunción.
dshepherd
Pero OP tiene razón en que sería útil tener una función que coloque automáticamente la combinación de teclas en el anillo de cierre.
incandescentman
1
@incandescentman: ¿Eh? ¿Dónde dice algo el OP sobre el anillo de matar ? ¿Y qué quieres decir con "combinación de teclas" en esa oración? Una combinación de teclas no es una cadena, que es lo que kill-ringcontiene. ¿Te refieres a la key-descriptioncuerda? o el valor de retorno del formatsexp anterior ? De todos modos, debe quedar claro cómo modificar el comando que le di, para agregar cualquiera de ellos al kill-ring(solo usar kill-new).
Dibujó
"insertar automáticamente". Si entiendo correctamente, la solución anterior solo muestra la combinación de teclas (por ejemplo kbd <M-return>) pero no la inserta en un archivo de inicio. (Tendrías que hacer el paso adicional de copiar / pegar). Tal vez no entendí bien. Por mi caso de uso personal, creo que sería útil tener una forma de consultar la sintaxis de una combinación de teclas (por ejemplo, se muestra la sintaxis M-RETo M-<return>o qué?) Y automáticamente colocar esa cadena en el histórico de recortes / cartón, por lo que entonces podía pego la combinación de teclas en mi archivo de inicio al escribir una línea como (define-key map (kbd "<M-return>") 'org-return).
incandescentman
1
Sí, entendiste mal. (Pero también había un error tipográfico en el sexp de enlace de teclas: olvidé usarlo kbden el global-set-keysexp, corregido ahora). El comando foo(al que se global-set-keyune el sexp C-c c) lee una secuencia de teclas y luego inserta, en el punto del búfer actual, el kbdSexp adecuado para ello. Si lo usa C-c cen su archivo init, después (local-set-key , inserta el kbdsexp que necesita para la clave que lee.
Dibujó
7

Si usa M-x local-set-keyla combinación de teclas de manera interactiva, puede usar C-x ESC ESC( repeat-complex-command) para obtener una expresión Lisp que puede pegar en su configuración. Sin (kbd ...)embargo, probablemente no usará descripciones de estilo amigable .

Sacha Chua
fuente
Ordenado. define-keyAunque, en realidad, tiendo a usarlo , parece más simple definir la clave directamente que configurar un enlace para llamar a una función que defina la clave.
dshepherd