É possível simular um evento-chave arbitrário do elisp? Estou ciente das maneiras pelas quais posso encontrar a ligação para uma determinada chave e, em seguida, chamar esse comando interativamente, mas e se esse evento de chave não estiver vinculado a um comando?
Como exemplo , e se eu quisesse ligar C-`
para me comportar da mesma forma que a ESC
chave em todos os contextos ?
elisp
key-bindings
events
nispio
fonte
fonte
key-bindings
é a tag errada se você não está tentando criar um atalho de chave. Além disso, talvez você deva mudar seu exemplo para outra coisa para que não fique confuso.key-events
etiqueta. Devo fazer um?key-translation-map
facilitam o último; portanto, se é tudo o que você deseja, sugiro usá-lo em vez de fazer algo mais manual.Respostas:
Você pode alimentar eventos arbitrários (pressionamentos de tecla, cliques do mouse etc.) no loop de comando, colocando-os em
unread-command-events
. Por exemplo, o seguinte fará com que o loop de comando execute uma interrupção na próxima vez em que for executado:Observe que isso apenas alimenta eventos para o loop de comando, portanto, não fará nada de interessante se você estiver repetindo seu próprio código.
Uma abordagem diferente, da qual você parece estar ciente, é encontrar a função à qual uma determinada chave está vinculada e executá-la:
Isso executará o comando imediatamente. Cuidado, no entanto, que alguns comandos têm um comportamento diferente, dependendo de serem chamados interativamente, como argumentos padrão. Você deseja compensar isso usando
call-interactively
:fonte
unread-command-events
mas não consegui descobrir como usá-lo. Defini-lo não teve efeito para mim. Existe algum bom exemplo de como é usado?unread-command-events
.unread-command-events
é exatamente o que o nome diz. Você pode examinar um evento e, dependendo do que é, enviar de volta condicionalmenteu-c-e
para que ele seja processado normalmente. Existem muitos exemplos de seu uso no código fonte do Emacs -grep
é seu amigo.unread-command-events
de trabalhar. A peça que faltava antes era alistify-key-sequence
função. Eu estava usando o vetor de chave bruta.with-simulated-input
macro que avalia qualquer expressão comunread-command-events
let-bound para uma sequência de teclas especificada: github.com/DarwinAwardWinner/ido-ubiquitous/blob/…A maneira mais simples que conheço é apenas usar
execute-kbd-macro
:fonte
C-`
ocorre um erroapply: Wrong number of arguments: #[(ad--addoit-function ...
.emacs -Q
esse erro não está presente. No entanto, ainda recebo este erro:After 0 kbd macro iterations: foo: Lisp nesting exceeds `max-lisp-eval-depth'
evil
), chamando diretamente a função desejada teve um efeito inesperado no meu caso (evilmi-jump-items
), e eu tive que usar(execute-kbd-macro (kbd "%"))
Retirado desta resposta , você pode usar global-set-key como este
Que tratará
C-`
comoescapeIsso parece ter alguns problemas, se a segunda combinação não executar uma função. Portanto, se escapeestiver sendo usado como
Meta
, então não funcionará corretamente. Mas parece funcionar para comandos vinculados a funções.fonte
C-`
me dá um erro:After 0 kbd macro iterations: command-execute: Lisp nesting exceeds `max-lisp-eval-depth'
.C-
`vinculadoESC
por algum outro método, então ele entra em um loop infinito.eval-sexp
acontecendo em uma sessão. :-) Mas tentar novamente comemacs -Q
causasC-`
simplesmente não faz nada.(kbd "<escape>")
e(kbd "ESC")
pode significar coisas diferentes - você já tentou os dois?Depois de ler a sugestão de jch para usar
unread-command-events
, pude criar uma solução que fizesse algumas das coisas que eu estava procurando.Ainda há uma série de dobras para resolver. Ou seja, não obtenho o resultado correto se eu chamar essa função duas vezes seguidas em uma única
defun
.Nota:
Depois de verificar a sugestão de uso do phils,
key-translation-map
consegui descobrir olocal-function-key-map
que também é muito útil para alcançar alguns dos meus objetivos mais amplos.fonte