Czy istnieje funkcja wstawiania poprawnego „(kbd„… ”)„ przez naciśnięcie klawisza?

20

Znudziło mnie wyszukiwanie nazw klawiszy dla kbdfunkcji. Czy istnieje sposób, aby automatycznie wstawić poprawną nazwę klucza, naciskając tylko klawisz?

Na przykład chcę coś z tym zrobić: piszę

(local-set-key |

Biegnę magical-insert-kbd-command, wciskam F6 i dostaję

(local-set-key (kbd "<f6>") |
dshepherd
źródło

Odpowiedzi:

20

Nie jestem pewien, o co dokładnie pytasz. Ale C-h knastępnie naciśnięcie klawisza pokazuje dokładnie, do którego ciągu należy przekazać kbd. Na przykład C-h k f6pokazuje <f6>.

Oto polecenie, które robi, co chcesz, i przypuszczam, że wiąże wynik z C-c c:

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

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

Następnie wpisz:

(local-set-key C-c c

To zachęca do użycia klucza. Jeśli naciśniesz F6klawisz, otrzymasz:

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

[Zaktualizowano zgodnie z sugestią @HaraldHancheOlsen: Zmieniono "(kbd \"%s\")"na".](kbd %S)"

Rysował
źródło
Perfekcyjnie, dzięki!. Najważniejsze, czego mi brakowało, to brakowało tej key-descriptionfunkcji.
dshepherd
Ale OP ma rację, że użyteczne byłoby posiadanie funkcji, która automatycznie umieszczałaby skrót klawiszowy w pierścieniu zabijania.
incandescentman
1
@incandescentman: Huh? Gdzie OP mówi cokolwiek o pierścieniu śmierci ? A co rozumiesz przez „skrót klawiszowy” w tym zdaniu? Powiązanie klucza nie jest ciągiem, który kill-ringzawiera. Masz na myśli key-descriptionsznurek? lub wartość zwrotna powyższego formatsexp? W każdym razie powinno być jasne, jak zmodyfikować polecenie, które wydałem, aby dodać jedno z nich do kill-ring(po prostu użyj kill-new).
Drew
„wstaw automatycznie”. Jeśli dobrze rozumiem, powyższe rozwiązanie wyświetla tylko skrót klawiszowy (np. kbd <M-return>), Ale nie wstawia go do pliku init. (Będziesz musiał wykonać dodatkowy krok kopiowania / wklejania). Może źle zrozumiałem. Na moim własnym przypadku użytku osobistego, to uważam, że warto mieć sposób do kwerendy składni dla kombinacja klawiszy (np jest składnia M-RETlub M-<return>czy co?) I automatycznie umieścić ten ciąg w ringu kill / kartonowe, tak że mogłem wtedy wklej keybinding do mojego pliku init podczas pisania linii podobnej do (define-key map (kbd "<M-return>") 'org-return).
incandescentman
1
Tak, źle zrozumiałeś. (Ale w sexp wiążącym klawisze była też literówka: zapomniałem użyć kbdw global-set-keysexp - teraz poprawione). Polecenie foo(z którym global-set-keywiąże się sexp C-c c) odczytuje sekwencję klawiszy, a następnie wstawia, w punkcie bieżącego bufora, odpowiedni kbdsexp za to. Jeśli użyjesz C-c cw swoim pliku init, (local-set-key to wstawi on kbdsekcję potrzebną dla czytanego klucza.
Drew
7

Jeśli używasz M-x local-set-keyinteraktywnego przypisywania klawiszy, możesz użyć C-x ESC ESC( repeat-complex-command), aby uzyskać wyrażenie Lisp, które możesz wkleić do konfiguracji. Prawdopodobnie nie będzie jednak używać przyjaznych (kbd ...)opisów.

Sacha Chua
źródło
Schludny. Zwykle używam define-key, ale wydaje się, że prostsze jest zdefiniowanie klucza wprost niż ustawienie haka do wywołania funkcji w celu zdefiniowania klucza.
dshepherd