Bei einer Zeichenfolge in elisp möchte ich Emacs simulieren, die alle Tastendrücke erhalten, die zum erneuten Erstellen dieser Zeichenfolge erforderlich sind. Angesichts der Zeichenfolge "Hallo" würden sich Emacs genauso verhalten, als hätte ich Umschalt + H, e, l, l, o gedrückt. Beachten Sie, dass dies nicht immer mit dem Einfügen von Text in den Puffer identisch ist. Einige Modi wie der Suchmodus hören Tastendruckereignisse direkt ab.
Der Grund, warum dies notwendig ist, liegt darin, dass es viele Modi und Erweiterungen gibt, die davon ausgehen, dass alle Eingaben von der Tastatur stammen, oder davon ausgehen, dass jede Änderung von Puffer / Fenster / Rahmen mit dem Tastatureingabeereignis verbunden ist, und viele die Zeit, zu der sie die mit diesem Ereignis verbundenen Daten überprüfen. Für den Spracherkennungsmodus, an dem ich arbeite, um nahtlos mit dem vorhandenen Code zu arbeiten, kann er nicht einfach direkt in elisp aufrufen, um Aktionen auszuführen, sondern muss elisp anweisen, die Tasten zu drücken, damit diese Aktionen ausgeführt werden.
Ich habe ungelesene Befehlsereignisse gefunden, kenne jedoch keinen vorhandenen Code, der Zeichenfolgen in die erforderlichen Schlüsselsequenzen übersetzt. Gibt es so etwas schon?
quelle
(let ((string "C-Beams")) (execute-kbd-macro (kbd (mapconcat #'char-to-string string " "))))
wird funktionieren. Wahrscheinlich gibt es einen besseren Weg ...(execute-kbd-macro (kbd "SPC"))
funktioniert jedoch, so dass Sie etwas aufwändigeres als mapconcat schreiben könnten, um diese Ersetzung durchzuführen ... dies macht mir Sorgen, obwohl es möglicherweise andere relevante Schlüssel gibt, die diese spezielle Behandlung erfordern.(mapc (lambda (char) (execute-kbd-macro (char-to-string char))) string)
scheint in Ordnung zu funktionieren. Aber (natürlich?) Wenn es ein Tabulatorzeichen gibt, wird es so tun, als würde es TAB treffen, was möglicherweise nicht an einen Befehl gebunden ist, der einen tatsächlichen Tabulator einfügt ...Okay, meine erste Antwort weist eine Reihe von Mängeln auf, die in den Kommentaren aufgeführt sind.
(Hervorhebung von mir)
Eine Lösung, um eine Zeichenfolge als einzelne Tastendrücke direkt an Emacs weiterzuleiten, lautet:
Dies scheint ziemlich gut zu funktionieren (es handhabt sogar Japanisch!), Aber es gibt immer noch einige Kuriositäten:
\n
auslösen C-j(nicht C-m,RET
oder<return>
)\t
wird auslösenTAB
(nicht<tab>
)quelle