Dada una cadena en elisp, me gustaría simular que emacs reciba las pulsaciones de teclas necesarias para volver a crear esa cadena. Entonces, dada la cadena "Hola", emacs actuaría exactamente igual que si hubiera presionado Shift + H, e, l, l, o. Tenga en cuenta que esto no siempre es lo mismo que insertar texto en el búfer; algunos modos, como el modo isearch, escuchan los eventos de pulsación de teclas directamente.
La razón por la que esto es necesario es porque hay muchos modos y extensiones que suponen que todas las entradas provienen del teclado o suponen que cualquier cambio de búfer / ventana / marco estará asociado con el evento de entrada del teclado, y muchos el momento en que inspeccionan los datos asociados con ese evento. Para el modo de reconocimiento de voz en el que trabajo para funcionar sin problemas con el cuerpo de código existente, no puede llamar directamente a elisp para realizar acciones, sino que debe decirle a elisp que presione las teclas para que esas acciones sucedan.
He encontrado eventos de comandos no leídos, pero no conozco ningún código existente que traduzca las cadenas a las secuencias de teclas necesarias. ¿Ya existe algo así?
fuente
(let ((string "C-Beams")) (execute-kbd-macro (kbd (mapconcat #'char-to-string string " "))))
trabajará. Probablemente hay una mejor manera ...(execute-kbd-macro (kbd "SPC"))
funciona, así que podrías escribir algo un poco más elaborado que mapconcat para hacer esa sustitución ... esto me preocupa, aunque puede haber otras claves relevantes que necesitan este tratamiento especial.(mapc (lambda (char) (execute-kbd-macro (char-to-string char))) string)
Parece funcionar bien. Pero (? Por supuesto) si hay un carácter de tabulación, que va a fingir que está golpeando TAB, que puede no estar atado a un comando de inserción de una ficha real ...Bien, mi primera respuesta tiene una serie de deficiencias como se detalla en sus comentarios.
(énfasis mío)
Entonces, una solución para pasar una cadena directamente a Emacs como teclas individuales es:
Esto parece funcionar bastante bien (¡incluso maneja japonés!), Pero todavía hay algunas rarezas:
\n
activará C-j(no C-m,RET
o<return>
)\t
activaráTAB
(no<tab>
)fuente