Est-il possible de simuler un événement clé arbitraire depuis elisp? Je connais les moyens de trouver la liaison pour une clé donnée, puis d'appeler cette commande de manière interactive, mais que se passe-t-il si cet événement clé n'est pas lié à une commande?
À titre d' exemple , que se passe-t-il si je souhaite lier C-`
pour se comporter de la même manière que la ESC
clé dans tous les contextes ?
elisp
key-bindings
events
nispio
la source
la source
key-bindings
soit la mauvaise balise si vous n'essayez pas d'alias une liaison de clé. De plus, vous devriez peut-être changer votre exemple en quelque chose d'autre afin qu'il ne soit pas confondu.key-events
balise. Dois-je en faire un?key-translation-map
faciliter ce dernier, donc si c'est tout ce que vous voulez, je suggère de l'utiliser plutôt que de faire quelque chose de plus manuel.Réponses:
Vous pouvez envoyer des événements arbitraires (frappes, clics de souris, etc.) à la boucle de commande en les plaçant dessus
unread-command-events
. Par exemple, ce qui suit entraînera la boucle de commande pour exécuter une pause lors de sa prochaine exécution:Notez que cela ne fait que nourrir les événements dans la boucle de commande, donc cela ne fera rien d'intéressant si vous bouclez dans votre propre code.
Une approche différente, dont vous semblez être au courant, consiste à trouver la fonction à laquelle une touche donnée est liée et à l'exécuter vous-même:
Cela exécutera la commande immédiatement. Attention, cependant, certaines commandes ont un comportement différent selon qu'elles sont appelées de manière interactive, comme les arguments par défaut. Vous voudrez compenser cela en utilisant
call-interactively
:la source
unread-command-events
mais je n'ai pas réussi à comprendre comment l'utiliser. Le régler n'a eu aucun effet pour moi. Y a-t-il un bon exemple de la façon dont il est utilisé?unread-command-events
.unread-command-events
c'est exactement ce que son nom l'indique. Vous pouvez examiner un événement, puis, en fonction de ce qu'il est, le repousser conditionnellementu-c-e
pour qu'il soit ensuite traité normalement. Il existe de nombreux exemples de son utilisation dans le code source d'Emacs -grep
est votre ami.unread-command-events
au travail. La pièce qui me manquait avant était lalistify-key-sequence
fonction. Je venais d'utiliser le vecteur clé brut.with-simulated-input
macro qui évalue n'importe quelle expression avecunread-command-events
let-bound à une séquence de touches spécifiée: github.com/DarwinAwardWinner/ido-ubiquitous/blob/…La façon la plus simple que je connaisse est simplement d'utiliser
execute-kbd-macro
:la source
C-`
me donne une erreurapply: Wrong number of arguments: #[(ad--addoit-function ...
.emacs -Q
cette erreur n'est pas présente. Je reçois toujours cette erreur cependant:After 0 kbd macro iterations: foo: Lisp nesting exceeds `max-lisp-eval-depth'
evil
), appeler directement la fonction souhaitée a eu un effet inattendu dans mon cas (evilmi-jump-items
), et j'ai dû utiliser(execute-kbd-macro (kbd "%"))
Tiré de cette réponse , vous pouvez utiliser global-set-key comme ceci
Qui traitera
C-`
commeescapeCela semble avoir quelques problèmes si la deuxième combinaison n'exécute pas de fonction. Donc, si escapeest utilisé comme
Meta
, alors cela ne fonctionne pas correctement. Mais cela semble fonctionner pour les commandes liées aux fonctions.la source
C-`
me donne une erreur:After 0 kbd macro iterations: command-execute: Lisp nesting exceeds `max-lisp-eval-depth'
.C-
`lié àESC
une autre méthode, donc ça va dans une boucle infinie.eval-sexp
choses se passent en une seule session. :-) Mais réessayer avec desemacs -Q
causesC-`
pour ne rien faire.(kbd "<escape>")
et(kbd "ESC")
peut signifier différentes choses - avez-vous essayé les deux?Après avoir lu la suggestion de jch à utiliser
unread-command-events
, j'ai pu pirater ensemble une solution qui fera certaines des choses que je recherche.Il y a encore un certain nombre de problèmes à résoudre. À savoir, je n'obtiens pas le résultat correct si j'appelle cette fonction deux fois de suite dans un seul
defun
.Note latérale:
Après avoir vérifié la suggestion d'utilisation de phils,
key-translation-map
j'ai pu trouverlocal-function-key-map
ce qui est également très utile pour atteindre certains de mes objectifs plus larges.la source