Apakah ada fungsi untuk memasukkan `(kbd" ... ") yang benar dengan menekan tombol?

20

Saya bosan mencari nama kunci untuk kbdfungsi, apakah ada cara untuk secara otomatis memasukkan nama kunci yang benar hanya dengan menekan tombol?

Jadi misalnya saya ingin melakukan sesuatu: Saya mengetik

(local-set-key |

Saya berlari magical-insert-kbd-command, tekan f6 dan saya dapatkan

(local-set-key (kbd "<f6>") |
dshepherd
sumber

Jawaban:

20

Tidak yakin persis apa yang Anda tanyakan. Tetapi C-h kdiikuti dengan menekan tombol menunjukkan kepada Anda string apa yang perlu Anda lewati kbd. Misalnya, C-h k f6menunjukkan kepada Anda <f6>.

Berikut adalah perintah yang melakukan apa yang Anda inginkan, saya kira dan mengikat hasilnya ke C-c c:

(defun foo (key)
  (interactive "kKey: ")
  (insert (format "(kbd %S)" (key-description key))))

(global-set-key (kbd "C-c c") 'foo)

Kemudian ketik:

(local-set-key C-c c

Itu meminta Anda untuk menggunakan kunci. Jika Anda menekan F6tombol maka Anda mendapatkan ini:

(local-set-key (kbd "<f6>") 

[Diperbarui per saran oleh @HaraldHancheOlsen: Diubah "(kbd \"%s\")"ke".](kbd %S)"

Drew
sumber
Sempurna, terima kasih !. Hal utama yang saya lewatkan adalah kehilangan key-descriptionfungsi.
dshepherd
Tetapi OP benar bahwa akan berguna jika memiliki fungsi yang secara otomatis menempatkan pengikat kunci di ring bunuh.
incandescentman
1
@incandescentman: Hah? Di mana OP mengatakan sesuatu tentang cincin bunuh ? Dan apa yang Anda maksud dengan "pengikat kunci" dalam kalimat itu? Pengikatan kunci bukan string, yang merupakan isinya kill-ring. Apakah maksud Anda key-descriptionstring? atau nilai pengembalian formatsexp di atas ? Lagi pula, harus jelas bagaimana mengubah perintah yang saya berikan, untuk menambahkan salah satu dari mereka ke kill-ring(gunakan saja kill-new).
Drew
"masukkan secara otomatis." Jika saya mengerti dengan benar, solusi di atas hanya menampilkan pengikat tombol (mis. kbd <M-return>) Tetapi tidak memasukkannya ke file init. (Anda harus melakukan langkah tambahan salin / tempel.) Mungkin saya salah paham. Untuk kasus penggunaan pribadi saya sendiri, saya akan merasa berguna untuk memiliki cara untuk menanyakan sintaks untuk keybinding (mis. Adalah sintaks M-RETatau M-<return>atau apa?) Dan secara otomatis menempatkan string itu di ring bunuh / papan tulis, sehingga saya bisa kemudian rekatkan keybinding ke file init saya saat menulis baris seperti (define-key map (kbd "<M-return>") 'org-return).
incandescentman
1
Ya, Anda salah paham. (Tapi ada juga salah ketik pada kunci-mengikat sexp: Saya lupa menggunakan kbddalam global-set-keysexp - dikoreksi sekarang.) Perintah foo(yang global-set-keymengikat sexp C-c c) membaca urutan kunci dan kemudian memasukkan, pada titik buffer saat ini, kbdsexp yang tepat untuk itu. Jika Anda menggunakan C-c cdalam file init Anda, setelah (local-set-key , maka itu memasukkan kbdsexp yang Anda butuhkan untuk kunci yang dibacanya.
Drew
7

Jika Anda menggunakan M-x local-set-keyuntuk melakukan penjilidan kunci Anda secara interaktif, Anda bisa menggunakan C-x ESC ESC( repeat-complex-command) untuk mendapatkan ekspresi Lisp yang bisa Anda tempelkan ke konfigurasi Anda. Ini mungkin tidak akan menggunakan (kbd ...)deskripsi gaya- ramah .

Sacha Chua
sumber
Rapi. Saya cenderung menggunakan define-keymeskipun sebenarnya, tampaknya lebih mudah untuk hanya mendefinisikan kunci langsung daripada mengatur hook untuk memanggil fungsi untuk mendefinisikan kunci.
dshepherd