Existe-t-il une fonction pour insérer le bon `(kbd“… ”)` en appuyant sur la touche?

20

Je m'ennuie de rechercher des noms de touches pour la kbdfonction, existe-t-il un moyen d'insérer automatiquement le nom de touche correct en appuyant simplement sur la touche?

Donc, par exemple, je veux quelque chose à faire: je tape

(local-set-key |

Je cours magical-insert-kbd-command, appuie sur f6 et je reçois

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

Réponses:

20

Je ne sais pas exactement ce que vous demandez. Mais C-h ksuivi de la touche vous montre exactement à quelle chaîne vous devez passer kbd. Par exemple, C-h k f6vous montre <f6>.

Voici une commande qui fait ce que vous voulez, je suppose et lie le résultat à C-c c:

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

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

Tapez ensuite:

(local-set-key C-c c

Cela vous invite à utiliser une clé. Si vous appuyez sur la F6touche, vous obtenez ceci:

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

[Mise à jour par suggestion @HaraldHancheOlsen: Changement "(kbd \"%s\")"de".](kbd %S)"

A dessiné
la source
Parfait merci!. La principale chose qui me manquait était la key-descriptionfonction.
dshepherd
Mais OP a raison de dire qu'il serait utile d'avoir une fonction qui place automatiquement le raccourci clavier dans le kill ring.
incandescentman
1
@incandescentman: Hein? Où le PO dit-il quelque chose au sujet du ring de mise à mort ? Et que voulez-vous dire par le "raccourci clavier" dans cette phrase? Une liaison de clé n'est pas une chaîne, c'est ce qu'elle kill-ringcontient. Voulez-vous dire la key-descriptionchaîne? ou la valeur de retour du formatsexp ci-dessus ? Quoi qu'il en soit, il devrait être clair comment modifier la commande que j'ai donnée, pour ajouter l'un ou l'autre à kill-ring(utilisez simplement kill-new).
Drew
"insérer automatiquement." Si je comprends bien, la solution ci-dessus affiche uniquement le raccourci clavier (par exemple kbd <M-return>) mais ne l'insère pas dans un fichier init. (Vous devrez faire l'étape supplémentaire de copier / coller.) Peut-être que j'ai mal compris. Pour mon propre cas d'utilisation personnel, je trouverais utile d'avoir un moyen d'interroger la syntaxe d'une liaison de touches (par exemple, la syntaxe M-RETou M-<return>ou quoi?) Et de placer automatiquement cette chaîne dans le kill ring / pasteboard, afin que je puisse ensuite collez la liaison de touches dans mon fichier init lors de l'écriture d'une ligne comme (define-key map (kbd "<M-return>") 'org-return).
incandescentman
1
Oui, vous avez mal compris. (Mais il y avait aussi une faute de frappe dans le sexp de liaison de clé: j'ai oublié d'utiliser kbddans le global-set-keysexp - corrigé maintenant.) La commande foo(à laquelle le global-set-keysexp se lie C-c c) lit une séquence de touches puis insère, au point du tampon actuel, le kbdsexp approprié pour cela. Si vous utilisez C-c cdans votre fichier init, après (local-set-key , il insère le kbdsexp dont vous avez besoin pour la clé qu'il lit.
Drew
7

Si vous utilisez M-x local-set-keypour effectuer vos raccourcis clavier de manière interactive, vous pouvez utiliser C-x ESC ESC( repeat-complex-command) pour obtenir une expression Lisp que vous pouvez coller dans votre configuration. (kbd ...)Cependant, il n'utilisera probablement pas de descriptions de style convivial .

Sacha Chua
la source
Soigné. J'ai tendance à utiliser define-keybien qu'en fait, il semble plus simple de définir simplement la clé que de configurer un hook pour appeler une fonction pour définir la clé.
dshepherd