Ist es möglich, ein beliebiges Schlüsselereignis aus elisp heraus zu simulieren? Ich bin mir bewusst, wie ich die Bindung für einen bestimmten Schlüssel finden und diesen Befehl dann interaktiv aufrufen kann, aber was ist, wenn dieses Schlüsselereignis nicht an einen Befehl gebunden ist?
Als ein Beispiel , was passiert , wenn ich wollte , binden , C-`
das gleiche wie die verhaltene ESC
Schlüssel in allen Kontexten ?
elisp
key-bindings
events
Nispio
quelle
quelle
key-bindings
es das falsche Tag, wenn Sie nicht versuchen, eine Schlüsselbindung als Alias zu kennzeichnen. Vielleicht sollten Sie Ihr Beispiel auch in etwas anderes ändern, damit es nicht verwirrt wird.key-events
Tag. Soll ich eins machen?key-translation-map
den letzteren erleichtern, so dass , wenn das ist alles , was Sie wollen, würde ich es empfehlen die Verwendung nicht mehr manuell etwas zu tun.Antworten:
Sie können beliebige Ereignisse (Tastenanschläge, Mausklicks usw.) in die Befehlsschleife einfügen, indem Sie sie dort platzieren
unread-command-events
. Das Folgende bewirkt beispielsweise, dass die Befehlsschleife beim nächsten Ausführen eine Unterbrechung ausführt:Beachten Sie, dass dies nur Ereignisse an die Befehlsschleife weiterleitet. Wenn Sie also Ihren eigenen Code einschleifen, ist dies nicht von Interesse.
Ein anderer Ansatz, den Sie zu kennen scheinen, besteht darin, die Funktion, an die ein bestimmter Schlüssel gebunden ist, zu finden und selbst auszuführen:
Dadurch wird der Befehl sofort ausgeführt. Beachten Sie jedoch, dass einige Befehle ein unterschiedliches Verhalten aufweisen, je nachdem, ob sie interaktiv aufgerufen werden, z. B. Standardargumente. Sie möchten dies ausgleichen, indem Sie Folgendes verwenden
call-interactively
:quelle
unread-command-events
aber ich konnte nicht herausfinden, wie man es benutzt. Das Einstellen hat für mich keine Wirkung. Gibt es ein gutes Beispiel für die Verwendung?unread-command-events
.unread-command-events
ist genau das, was der Name sagt. Sie können ein Ereignis untersuchen und es dann, je nachdem, was es ist, unter bestimmten Bedingungen zurückschieben,u-c-e
damit es normal verarbeitet wird. Es gibt viele Beispiele für die Verwendung im Emacs-Quellcode -grep
ist Ihr Freund.unread-command-events
an die Arbeit machen. Das Stück, das ich vorher vermisst habe, war dielistify-key-sequence
Funktion. Ich hatte gerade den rohen Schlüsselvektor verwendet.with-simulated-input
Makro zu implementieren , das alle Ausdrücke auswertetunread-command-events
, die an eine bestimmte Schlüsselsequenz gebunden sind: github.com/DarwinAwardWinner/ido-ubiquitous/blob/…Der einfachste Weg, den ich kenne, ist einfach zu benutzen
execute-kbd-macro
:quelle
C-`
ich das Obige auswerte und dann drücke, erhalte ich einen Fehlerapply: Wrong number of arguments: #[(ad--addoit-function ...
.emacs -Q
diesem Fehler ist nicht vorhanden. Ich bekomme immer noch diese Fehlermeldung:After 0 kbd macro iterations: foo: Lisp nesting exceeds `max-lisp-eval-depth'
evil
) hatte der direkte Aufruf der gewünschten Funktion in meinem Fall (evilmi-jump-items
) einen unerwarteten Effekt , und ich musste(execute-kbd-macro (kbd "%"))
Aus dieser Antwort können Sie den folgenden Global-Set-Schlüssel verwenden
Welches wird
C-`
als behandelnescapeDies scheint jedoch einige Probleme zu haben, wenn die zweite Kombination keine Funktion ausführt. Wenn escapealso wie verwendet wird
Meta
, dann funktioniert es nicht richtig. Aber es scheint für Befehle zu funktionieren, die an Funktionen gebunden sind.quelle
C-`
gibt mir eine Fehlermeldung:After 0 kbd macro iterations: command-execute: Lisp nesting exceeds `max-lisp-eval-depth'
.C-
anESC
eine andere Methode gebunden , es geht also in eine Endlosschleife.eval-sexp
In einer Sitzung laufen zu viele . :-) Aber nochmal versuchen mitemacs -Q
AnlassC-`
einfach nichts zu machen.(kbd "<escape>")
und(kbd "ESC")
möglicherweise mit unterschiedlichen Bedeutungen - haben Sie beide ausprobiert?Nachdem ich den Vorschlag von jch zur Verwendung gelesen hatte ,
unread-command-events
war ich in der Lage, eine Lösung zu hacken, die einige der Dinge erledigt, nach denen ich suche.Es gibt noch eine Reihe von Knicken zu lösen. Ich erhalte nämlich nicht das richtige Ergebnis, wenn ich diese Funktion zweimal hintereinander innerhalb einer einzigen aufrufe
defun
.Randnotiz:
Nachdem ich den Vorschlag von phils zur Verwendung durchgesehen hatte,
key-translation-map
konnte ich feststellen, dasslocal-function-key-map
dies auch sehr hilfreich ist, um einige meiner übergeordneten Ziele zu erreichen.quelle