Tradurre stringhe in tasti premuti


8

Data una stringa in elisp, mi piacerebbe simulare emacs ricevendo qualsiasi tasto premuto per ricreare quella stringa. Quindi, dato che la stringa "Hello" emacs avrebbe funzionato esattamente come se avessi premuto Shift + H, e, l, l, o. Nota che questo non è sempre la stessa cosa dell'inserimento di testo nel buffer: alcune modalità come la modalità isearch ascoltano direttamente gli eventi di pressione dei tasti.

La ragione per cui ciò è necessario è perché ci sono molte modalità ed estensioni che danno per scontato che tutti gli input provengano dalla tastiera o suppongono che qualsiasi modifica di buffer / finestra / frame sarà associata all'evento di input da tastiera, e molti il tempo in cui ispezionano i dati associati a quell'evento. Affinché la modalità di riconoscimento vocale su cui lavoro funzioni perfettamente con il corpo di codice esistente, non può semplicemente chiamare direttamente in elisp per eseguire azioni, invece deve dire a elisp di premere i tasti per far sì che tali azioni si verifichino.

Ho trovato unread-command-events, ma non sono a conoscenza di alcun codice esistente che tradurrà le stringhe nelle sequenze di tasti necessarie. Esiste già qualcosa del genere?

Risposte:


5

fa

(execute-kbd-macro (kbd "Hello"))

lavorare per caso?


2
Funzionerà in questo caso, ma non con la stringa "C-Beams" per esempio. Un modo per evitarlo è aggiungere spazi tra ogni personaggio. (let ((string "C-Beams")) (execute-kbd-macro (kbd (mapconcat #'char-to-string string " "))))funzionerà. Probabilmente c'è un modo migliore ...
YoungFrog

Hmm, il trucco mapconcat non funziona se la stringa contiene effettivamente spazi, ad es. "C travi" diventa "Cbeam". (execute-kbd-macro (kbd "SPC"))funziona però, quindi potresti scrivere qualcosa di un po 'più elaborato di mapconcat per fare quella sostituzione ... questo mi fa preoccupare anche se potrebbero esserci altre chiavi rilevanti che necessitano di questo trattamento speciale.
Joseph Garvin,

Sembra che anche le nuove righe e le schede abbiano questo problema. Posso occuparmi della sostituzione di SPC / RET / TAB, anche se mi chiedo se l'intero approccio avrà problemi con le tastiere internazionali.
Joseph Garvin,

(mapc (lambda (char) (execute-kbd-macro (char-to-string char))) string)sembra funzionare bene. Ma (ovviamente?) Se c'è un carattere di tabulazione, farà finta di colpire TAB, che potrebbe non essere associato a un comando che inserisce una scheda reale ...
YoungFrog

@YoungFrog: sembra essere ancora rotto da \ n
Joseph Garvin l'

4

Va bene, quindi la mia prima risposta ha una serie di carenze come dettagliato nei suoi commenti.

execute-kbd-macro è una funzione integrata in C source code.

(execute-kbd-macro MACRO &optional COUNT LOOPFUNC)

Eseguire MACRO come stringa di caratteri di comando dell'editor. MACRO può anche essere un vettore di eventi da tastiera . Se MACRO è un simbolo, viene utilizzata la definizione della sua funzione. COUNT è un conteggio delle ripetizioni, o zero per una volta, o 0 per il ciclo infinito.

Terzo argomento facoltativo LOOPFUNC può essere una funzione chiamata prima di ogni iterazione della macro. L'iterazione si interrompe se LOOPFUNC restituisce zero.

(enfatizzare il mio)

Quindi una soluzione per passare una stringa direttamente a Emacs come singoli tasti premuti è:

(defun insert-via-kbd (str)
  (execute-kbd-macro (vconcat str)))

Questo sembra funzionare abbastanza bene (gestisce anche il giapponese!), Ma ci sono ancora alcune stranezze:

  • \ninnescherà C-j(non C-m, RETo <return>)
  • \tattiverà TAB(non <tab>)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.