Esiste una funzione per inserire il `(kbd“… ”)` corretto premendo il tasto?


20

Sono annoiato di cercare i nomi dei tasti per la kbdfunzione, c'è un modo per inserire automaticamente il nome del tasto corretto semplicemente premendo il tasto?

Quindi, per esempio, voglio qualcosa per fare questo: sto scrivendo

(local-set-key |

Corro magical-insert-kbd-command, premo f6 e ottengo

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

Risposte:


20

Non sono sicuro di quello che stai chiedendo. Ma C-h kseguito premendo il tasto ti mostra esattamente a quale stringa devi passare kbd. Ad esempio, C-h k f6ti mostra <f6>.

Ecco un comando che fa quello che vuoi, immagino e lega il risultato a C-c c:

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

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

Quindi digitare:

(local-set-key C-c c

Questo ti chiede di usare una chiave. Se si F6preme il tasto, si ottiene questo:

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

[Aggiornato per suggerimento di @HaraldHancheOlsen: modificato "(kbd \"%s\")"in".](kbd %S)"


Perfetto grazie!. La cosa principale che mi mancava mancava la key-descriptionfunzione.
pastore

Ma OP ha ragione sul fatto che sarebbe utile disporre di una funzione che inserisca automaticamente la combinazione di tasti nell'anello di eliminazione.
incandescentman,

1
@incandescentman: Huh? Dove dice l'OP qualcosa sull'anello di uccisione ? E cosa intendi per "associazione di tasti" in quella frase? Un'associazione chiave non è una stringa, che è ciò che kill-ringcontiene. Intendi la key-descriptionstringa? o il valore di ritorno del formatsexp sopra ? Comunque, dovrebbe essere chiaro come modificare il comando che ho dato, per aggiungere uno di quelli al kill-ring(solo usare kill-new).
Estratto il

"inserisci automaticamente." Se ho capito bene, la soluzione sopra mostra solo il keybinding (es. kbd <M-return>) Ma non lo inserisce in un file init. (Dovresti fare il passaggio aggiuntivo di copia / incolla.) Forse ho frainteso. Per il mio caso d'uso personale, troverei utile avere un modo per interrogare la sintassi per un keybinding (ad es. La sintassi M-RETo M-<return>o cosa?) E posizionare automaticamente quella stringa nel kill ring / pasteboard, in modo da poter quindi incolla il keybinding nel mio file init quando scrivi una riga come (define-key map (kbd "<M-return>") 'org-return).
incandescentman,

1
Sì, hai frainteso. (Ma c'era anche un refuso nel sexp vincolante: ho dimenticato di usare kbdnel global-set-keysexp - corretto ora.) Il comando foo(a cui il global-set-keysexp si lega C-c c) legge una sequenza di tasti e quindi inserisce, nel punto del buffer corrente, il kbdsexp adeguato per questo. Se si utilizza C-c cnel file init, dopo (local-set-key , inserisce il kbdsexp necessario per la chiave che legge.
Estratto il

7

Se usi M-x local-set-keyper eseguire il binding dei tasti in modo interattivo, puoi usare C-x ESC ESC( repeat-complex-command) per ottenere un'espressione Lisp che puoi incollare nella tua configurazione. (kbd ...)Tuttavia, probabilmente non utilizzerà descrizioni in stile amichevole .


Neat. Tendo a usarlo define-key, in realtà, sembra più semplice definire la chiave in modo definitivo piuttosto che impostare un hook per chiamare una funzione per definire la chiave.
pastore,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.