Gibt es eine Funktion zum Einfügen des korrekten `(kbd“… ”)` durch Drücken der Taste?

20

Es ist mir langweilig, Tastennamen für die kbdFunktion nachzuschlagen. Gibt es eine Möglichkeit, den richtigen Tastennamen automatisch einzufügen, indem Sie einfach die Taste drücken?

Ich möchte zum Beispiel, dass ich Folgendes mache: Ich tippe

(local-set-key |

Ich renne magical-insert-kbd-command, drücke F6 und ich bekomme

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

Antworten:

20

Ich bin mir nicht sicher, wonach du fragst. Aber , C-h kgefolgt von der Taste zeigt schlagen Sie genau , welche Saite Sie brauchen , um einen Pass zu spielen kbd. Zum Beispiel C-h k f6zeigt Ihnen <f6>.

Hier ist ein Befehl, der tut, was Sie wollen, und das Ergebnis an Folgendes bindet C-c c:

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

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

Dann tippe:

(local-set-key C-c c

Das fordert Sie auf, einen Schlüssel zu verwenden. Wenn Sie die F6Taste drücken, erhalten Sie Folgendes:

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

[Aktualisiert per Vorschlag von @HaraldHancheOlsen: Geändert "(kbd \"%s\")"zu".](kbd %S)"

Drew
quelle
Perfekt danke!. Mir fehlte vor allem die key-descriptionFunktion.
Dshepherd
Aber OP ist richtig, dass es nützlich wäre, eine Funktion zu haben, die die Tastenkombination automatisch in den Kill-Ring einfügt.
weißglühender
1
@incandescentman: Huh? Wo sagt das OP etwas über den Kill Ring ? Und was meinst du mit der "Tastenkombination" in diesem Satz? Eine Schlüsselbindung ist keine Zeichenfolge kill-ring. Meinen Sie die key-descriptionZeichenfolge? oder der Rückgabewert des oben genannten formatsexp? Wie auch immer, es sollte klar sein, wie ich den Befehl, den ich gegeben habe, ändern kann, um einen dieser Befehle zu dem Befehl hinzuzufügen kill-ring(benutze einfach kill-new).
Drew
"Automatisch einfügen." Wenn ich das richtig verstehe, zeigt die obige Lösung nur die Tastenkombination an (z. B. kbd <M-return>), fügt sie jedoch nicht in eine Init-Datei ein. (Sie müssten den zusätzlichen Schritt des Kopierens / Einfügens ausführen.) Vielleicht habe ich es falsch verstanden. Für meinen eigenen persönlichen Gebrauch Fall würde ich es für sinnvoll , einen Weg zu haben die Syntax für eine Keybinding abzufragen (zB die Syntax M-REToder M-<return>oder was?) Und stellen automatisch die Zeichenfolge in den Kill - Ring / Pappe, so dass ich konnte dann Fügen Sie die Tastenkombination in meine Init-Datei ein, wenn Sie eine Zeile wie schreiben (define-key map (kbd "<M-return>") 'org-return).
Glühbirne
1
Ja, du hast es falsch verstanden. (Aber es gab auch einen Tippfehler im Schlüsselbindungs-Sexp: Ich habe vergessen, ihn kbdim global-set-keySexp zu verwenden - jetzt korrigiert.) Der Befehl foo(an den der global-set-keySexp bindet C-c c) liest eine Schlüsselsequenz und fügt dann an der Stelle des aktuellen Puffers den ein richtiges kbdsexp dafür. Wenn Sie C-c cin Ihrer Init-Datei after verwenden (local-set-key , fügt es das kbdSexp ein, das Sie für den gelesenen Schlüssel benötigen.
Drew
7

Wenn Sie M-x local-set-keydie Tastenkombination interaktiv ausführen, können Sie mit C-x ESC ESC( repeat-complex-command) einen Lisp-Ausdruck abrufen, den Sie in Ihre Konfiguration einfügen können. Es werden jedoch wahrscheinlich keine freundlichen (kbd ...)Beschreibungen verwendet.

Sacha Chua
quelle
Ordentlich. Ich verwende normalerweise, define-keyobwohl es einfacher zu sein scheint, den Schlüssel direkt zu definieren, als einen Hook zum Aufrufen einer Funktion zum Definieren des Schlüssels einzurichten.
Dshepherd