Apakah mungkin untuk mensimulasikan peristiwa kunci sewenang-wenang dari elisp? Saya menyadari cara-cara yang saya dapat menemukan ikatan untuk kunci yang diberikan, dan kemudian memanggil perintah itu secara interaktif, tetapi bagaimana jika peristiwa kunci itu tidak terikat pada suatu perintah?
Sebagai satu contoh , bagaimana jika saya ingin mengikat C-`
untuk berperilaku sama dengan ESC
kunci dalam semua konteks ?
elisp
key-bindings
events
nispio
sumber
sumber
key-bindings
ini adalah tag yang salah jika Anda tidak mencoba alias mengikat kunci. Juga, mungkin Anda harus mengubah contoh Anda ke sesuatu yang lain sehingga tidak menjadi bingung.key-events
tag. Haruskah saya membuatnya?key-translation-map
memfasilitasi yang terakhir, jadi jika itu yang Anda inginkan, saya sarankan menggunakannya daripada melakukan sesuatu yang lebih manual.Jawaban:
Anda bisa memberi makan acara yang sewenang-wenang (penekanan tombol, klik mouse, dll.) Ke loop perintah dengan meletakkannya di atasnya
unread-command-events
. Misalnya, berikut ini akan menyebabkan loop perintah untuk menjalankan istirahat saat dijalankan berikutnya:Perhatikan bahwa ini hanya mengumpankan peristiwa ke loop perintah, jadi tidak ada yang menarik jika Anda mengulangi di kode Anda sendiri.
Pendekatan lain, yang tampaknya Anda sadari, adalah menemukan fungsi yang terikat dengan kunci tertentu, dan menjalankannya sendiri:
Ini akan segera menjalankan perintah. Berhati-hatilah, bagaimanapun, bahwa beberapa perintah memiliki perilaku yang berbeda tergantung pada apakah mereka dipanggil secara interaktif, seperti argumen default. Anda ingin mengompensasi itu dengan menggunakan
call-interactively
:sumber
unread-command-events
tetapi saya belum tahu bagaimana menggunakannya. Pengaturan itu tidak berpengaruh bagi saya. Apakah ada contoh yang baik tentang bagaimana ini digunakan?unread-command-events
.unread-command-events
tepat seperti namanya. Anda dapat memeriksa suatu peristiwa dan kemudian, tergantung pada apa itu, mendorongnya kembali secara kondisionalu-c-e
sehingga kemudian akan diproses secara normal. Ada banyak contoh penggunaannya dalam kode sumber Emacs -grep
adalah teman Anda.unread-command-events
bekerja. Bagian yang hilang sebelumnya adalahlistify-key-sequence
fungsinya. Saya baru saja menggunakan vektor kunci mentah.with-simulated-input
makro yang mengevaluasi ekspresi apa pun denganunread-command-events
membiarkan-terikat ke urutan kunci yang ditentukan: github.com/DarwinAwardWinner/ido-ubiquitous/blob/…Cara paling sederhana yang saya tahu adalah menggunakan
execute-kbd-macro
:sumber
C-`
memberi saya kesalahanapply: Wrong number of arguments: #[(ad--addoit-function ...
.emacs -Q
kesalahan itu tidak ada. Saya masih mendapatkan kesalahan ini:After 0 kbd macro iterations: foo: Lisp nesting exceeds `max-lisp-eval-depth'
evil
), langsung memanggil fungsi yang diinginkan memiliki efek yang tidak terduga dalam kasus saya (evilmi-jump-items
), dan saya harus menggunakan(execute-kbd-macro (kbd "%"))
Diambil dari jawaban ini , Anda dapat menggunakan global-set-key seperti ini
Yang akan diperlakukan
C-`
sebagaiescapeIni tampaknya memiliki beberapa masalah meskipun jika kombinasi kedua tidak menjalankan suatu fungsi. Jadi jika escapedigunakan seperti
Meta
, maka itu tidak berfungsi dengan benar. Tetapi tampaknya berfungsi untuk perintah yang terikat pada fungsi.sumber
C-`
memberikan saya sebuah kesalahan:After 0 kbd macro iterations: command-execute: Lisp nesting exceeds `max-lisp-eval-depth'
.C-
terikatESC
oleh beberapa metode lain, jadi ini akan menjadi infinite loop.eval-sexp
terjadi dalam satu sesi. :-) Tetapi mencoba lagi denganemacs -Q
alasanC-`
untuk tidak melakukan apa-apa.(kbd "<escape>")
dan(kbd "ESC")
mungkin memiliki arti yang berbeda - sudahkah Anda mencoba keduanya?Setelah membaca saran dari jch untuk digunakan
unread-command-events
, saya dapat meretas bersama solusi yang akan melakukan beberapa hal yang saya cari.Masih ada sejumlah kekusutan yang harus diselesaikan. Yaitu, saya tidak mendapatkan hasil yang benar jika saya memanggil fungsi ini dua kali berturut-turut dalam satu
defun
.Catatan samping:
Setelah memeriksa saran phils untuk menggunakan
key-translation-map
saya dapat menemukanlocal-function-key-map
yang juga sangat membantu dalam mencapai beberapa tujuan saya yang lebih luas.sumber