Diberikan string di elisp, saya ingin mensimulasikan emacs menerima penekanan tombol apa pun yang diperlukan untuk membuat kembali string itu. Jadi mengingat string "Hello" emacs akan bertindak persis sama seperti jika saya telah menekan Shift + H, e, l, l, o. Perhatikan bahwa ini tidak selalu sama dengan memasukkan teks ke dalam buffer - beberapa mode seperti mode-cari mendengarkan acara langsung menekan tombol.
Alasan ini diperlukan adalah karena ada banyak mode dan ekstensi yang membuat asumsi bahwa semua input berasal dari keyboard atau membuat asumsi bahwa setiap penyangga / perubahan jendela / bingkai akan dikaitkan dengan peristiwa input keyboard, dan banyak waktu mereka memeriksa data yang terkait dengan peristiwa itu. Untuk mode pengenalan ucapan yang saya kerjakan agar bekerja mulus dengan tubuh kode yang ada, itu tidak bisa hanya memanggil langsung ke elisp untuk melakukan tindakan, alih-alih itu perlu memberitahu elisp untuk menekan tombol untuk menyebabkan tindakan itu terjadi.
Saya telah menemukan peristiwa-perintah-belum dibaca, tetapi saya tidak mengetahui adanya kode yang akan menerjemahkan string ke urutan kunci yang diperlukan. Apakah sesuatu seperti itu sudah ada?
sumber
(let ((string "C-Beams")) (execute-kbd-macro (kbd (mapconcat #'char-to-string string " "))))
akan bekerja. Mungkin ada cara yang lebih baik ...(execute-kbd-macro (kbd "SPC"))
berfungsi, jadi Anda bisa menulis sesuatu yang sedikit lebih rumit daripada mapconcat untuk melakukan substitusi itu ... ini membuat saya khawatir meskipun mungkin ada kunci lain yang relevan meskipun itu membutuhkan perlakuan khusus ini.(mapc (lambda (char) (execute-kbd-macro (char-to-string char))) string)
tampaknya berfungsi ok. Tapi (tentu saja?) Jika ada karakter tab, itu akan berpura-pura memukul TAB, yang mungkin tidak terikat pada perintah memasukkan tab yang sebenarnya ...Oke, jadi jawaban pertama saya memiliki sejumlah kekurangan seperti yang terinci dalam komentarnya.
(penekanan milikku)
Jadi solusi untuk meneruskan string ke Emacs sebagai penekanan tombol individu adalah:
Ini tampaknya bekerja dengan sangat baik (bahkan menangani Jepang!), Tetapi masih ada beberapa keanehan:
\n
akan memicu C-j(tidak C-m,RET
atau<return>
)\t
akan memicuTAB
(tidak<tab>
)sumber