¿Es posible simular un evento clave arbitrario desde elisp? Soy consciente de las formas en que puedo encontrar el enlace para una clave determinada y luego llamar a ese comando de forma interactiva, pero ¿qué sucede si ese evento clave no está vinculado a un comando?
Como ejemplo , ¿qué pasa si quisiera vincularme C-`
para comportarme igual que la ESC
clave en todos los contextos ?
elisp
key-bindings
events
nispio
fuente
fuente
key-bindings
es la etiqueta incorrecta si no está tratando de alias un enlace de clave. Además, tal vez debería cambiar su ejemplo por otro para que no se confunda.key-events
etiqueta ¿Debo hacer uno?key-translation-map
facilitar este último, por lo que si eso es todo lo que desea, sugeriría usarlo en lugar de hacer algo más manual.Respuestas:
Puede alimentar eventos arbitrarios (pulsaciones de teclas, clics del mouse, etc.) al bucle de comandos al colocarlos en
unread-command-events
. Por ejemplo, lo siguiente hará que el ciclo del comando ejecute un corte la próxima vez que se ejecute:Tenga en cuenta que esto solo alimenta eventos al bucle de comando, por lo que no hará nada interesante si está bucleando su propio código.
Un enfoque diferente, del que parece estar al tanto, es encontrar la función a la que está vinculada una tecla determinada y ejecutarla usted mismo:
Esto ejecutará el comando de inmediato. Sin embargo, tenga en cuenta que algunos comandos tienen un comportamiento diferente dependiendo de si se los llama de forma interactiva, como los argumentos predeterminados. Querrás compensar eso usando
call-interactively
:fuente
unread-command-events
pero no he podido descubrir cómo usarlo. Establecerlo no ha tenido ningún efecto para mí. ¿Hay algún buen ejemplo de cómo se usa?unread-command-events
.unread-command-events
es justo lo que dice su nombre. Puede examinar un evento y luego, según lo que sea, empujarlo condicionalmenteu-c-e
para que luego se procese normalmente. Hay muchos ejemplos de su uso en el código fuente de Emacs:grep
es tu amigo.unread-command-events
a trabajar. La pieza que me faltaba antes era lalistify-key-sequence
función. Acababa de usar el vector de clave sin formato.with-simulated-input
macro que evalúa cualquier expresión conunread-command-events
let-bound a una secuencia de teclas específica: github.com/DarwinAwardWinner/ido-ubiquitous/blob/…La forma más simple que conozco es simplemente usar
execute-kbd-macro
:fuente
C-`
me da un errorapply: Wrong number of arguments: #[(ad--addoit-function ...
.emacs -Q
ese error no está presente. Sin embargo, sigo recibiendo este error:After 0 kbd macro iterations: foo: Lisp nesting exceeds `max-lisp-eval-depth'
evil
), llamar directamente a la función deseada tuvo un efecto inesperado en mi caso (evilmi-jump-items
), y tuve que usar(execute-kbd-macro (kbd "%"))
Tomado de esta respuesta , puede usar global-set-key como este
Que tratará
C-`
comoescapeSin embargo, esto parece tener algunos problemas si la segunda combinación no ejecuta una función. Entonces, si escapese usa como
Meta
, entonces no funciona correctamente. Pero parece funcionar para comandos vinculados a funciones.fuente
C-`
me da un error:After 0 kbd macro iterations: command-execute: Lisp nesting exceeds `max-lisp-eval-depth'
.C-
`obligadoESC
por algún otro método, por lo que va a un bucle infinito.eval-sexp
pasando en una sesión. :-) Pero intentar de nuevo conemacs -Q
causasC-`
simplemente no hacer nada.(kbd "<escape>")
y(kbd "ESC")
puede significar cosas diferentes, ¿ha probado ambos?Después de leer la sugerencia de uso de jch
unread-command-events
, pude hackear una solución que hará algunas de las cosas que estoy buscando.Todavía hay una serie de problemas para resolver. Es decir, no obtengo el resultado correcto si llamo a esta función dos veces seguidas dentro de una sola
defun
.Nota al margen:
Después de consultar la sugerencia de uso de phils,
key-translation-map
pude encontrar lolocal-function-key-map
que también es muy útil para lograr algunos de mis objetivos más amplios.fuente