Apa cara terbaik untuk mendeteksi penekanan tombol (misalnya melalui kail) yang tidak mengedit buffer? Maksud saya hal-hal seperti tombol panah untuk gerakan titik, panggilan ke beginning-of-buffer
, dll.
Alasan untuk ini adalah bahwa saya sedang mengerjakan beberapa ycmd
binding untuk emacs, dan saya ingin dapat mendeteksi (setidaknya secara heuristik) ketika pengguna telah berhenti mengedit dan bergerak di sekitar buffer. Ini adalah saat yang tepat untuk mengirim konten buffer untuk parsing. Klien vim melakukan ini ketika pengguna keluar dari mode penyisipan, dan saya mencoba untuk meniru perilaku itu.
key-bindings
abingham
sumber
sumber
self-insert-command
untuk membatalkan dan menjadwal ulang penghitung waktu alih-alih menggunakan penghitung waktu idle. Dengan cara ini, bahkan jika pengguna melakukan sesuatu, penghitung waktu tidak diatur ulang kecuali "sesuatu" adalah penyisipan teks.after-change-functions
adalah mekanisme umum untuk bereaksi terhadap perubahan teks.post-command-hook
. Itu akan memicu semuanya, jadi Anda mungkin perlu memfilter apa yang memicu sebelum mengambil tindakan apa pun yang Anda inginkan.buffer-chars-modified-tick
fungsinya mungkin bermanfaat.Jawaban:
Tambahkan kait berikut:
pre-command-hook
, atur beberapa variabel sentinel ket
- ini menandakan perintah tidak berubah.after-change-functions
, setel nilai sentinel ini kenil
. (Ini adalah hook, itu tidak terdengar seperti itu; terima kasih kepada @phils untuk menunjukkan ini.)post-command-hook
, periksa nilai sentinel ini dan jalankan fungsi Anda.Ini mungkin atau mungkin tidak berfungsi tergantung pada urutan eksekusi. Jika tidak, beri tahu saya di komentar di bawah.
Ketika saya pulang kerja, saya akan memposting contoh.
sumber
post-self-insert-hook
(sedikit jawaban yang tampaknya membingungkan hook dengan menasihatiself-insert-command
). Bagaimanapun, saya pikir Anda umumnya akan lebih sukaafter-change-functions
karena itu benar-benar melakukan apa yang Anda inginkan (karena memasukkan sendiri bukan satu-satunya jenis stroke kunci yang memodifikasi buffer).Hanya pemikiran saja -
Ini seharusnya tidak benar-benar tentang "penekanan tombol", tetapi tentang perintah - tidak peduli bagaimana mereka dieksekusi, bukan ? Jika saya mengerti dengan benar, Anda benar-benar mencari cara untuk mengetahui apakah perintah yang diberikan dipanggil memodifikasi buffer.
Jika demikian, maka mungkin lakukan sesuatu seperti ini:
Letakkan fungsi pada
pre-command-hook
yang (1) mencatat nilai saat ini(buffer-modified-p)
dan kemudian (2) menggunakanset-modified-p
untuk membuat buffer tidak dimodifikasi.Letakkan fungsi pada
post-command-hook
yang (1) memeriksa apakah perintah memodifikasi buffer (dengan membandingkan nilai yang direkam dengan nilai saat ini yang baru(buffer-modified-p)
), kemudian bertindak sesuai, dan (2) jika nilai barunil
kemudian diatur ulang ke nilai pra-perubahan menggunakanset-modified-p
.Agak berat (memeriksa setiap perintah yang dipanggil), tetapi mungkin patut dicoba.
Jika bagian " bertindak sesuai " hanyalah no-op untuk semua perintah modifikasi buffer, dan jika itu juga no-op untuk banyak perintah yang tidak memodifikasi (misalnya karena Anda baru saja melakukannya pada perintah non-modifikasi sebelumnya), maka setidaknya Anda tidak akan melakukan tindakan " bertindak sesuai " lebih dari yang diperlukan. Tetapi bagian pengecekan saja mungkin mahal / berlebihan (memperlambat banyak hal) - coba lihat.
sumber