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>") |

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)"


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 .


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.