Wie binde ich einen Schlüssel an "die Funktion, die durch die folgende Tastenfolge dargestellt wird"?

8

Ich fange gerade an Emacs zu lernen (woohoo!) und ich habe ziemlich glücklich in meinem .emacs herumgespuckt. Leider kenne ich Lisp noch nicht, also habe ich Probleme mit den Grundlagen.

Ich habe bereits ein paar Tasten neu zugeordnet, bis ich mein Muskelgedächtnis repariere:

%Vor%

Das ist in Ordnung. Aber wie kann ich eine Taste dazu bringen, mehrere Tasten zu simulieren? Zum Beispiel, ich weiß nicht, machen <f1> dasselbe wie C-u 2 C-x } (Erweitern Sie den Puffer um zwei Zeichen).

Eine Möglichkeit ist es, diese C-x } Aufrufe shrink-window-horizontally nachzuschlagen und eine Art Lambda-Sache zu machen. Dies ist natürlich die gepflegte und elegante Art und Weise (wie machst du das?). Aber sicherlich gibt es eine Möglichkeit, <f1> zu definieren, um die Tastenanschläge C-u 2 C-x } ?

zu senden     
katrielalex 26.12.2010, 22:25
quelle

4 Antworten

8

Für alles, was langfristig ist, würde ich den Ansatz von seh empfehlen, da dieser in den meisten Situationen natürlich robuster ist. Es erfordert natürlich etwas mehr Arbeit und Know-how, aber es lohnt sich allemal:)

angus 'Ansatz ist wie eine verkürzte Version der Tastaturmakros-Funktion, die Emacs seinen Namen gibt (und etwas einfacher zu verwenden als Makros für das betreffende Beispiel). Sie sollten jedoch auf jeden Fall auf Makros achten - sie können äußerst nützlich sein, und für etwas Komplizierteres wird es schnell viel einfacher, einen dynamisch zu speichern, als alle einzelnen Schlüssel manuell auszugeben.

Hier ist die Zusammenfassung, die ich selbst von den wichtigsten Bits geschrieben habe:

%Vor%

Wenn wir mit dem Beispiel aus der Frage spielen, werden Sie sehen, wie einige dieser Dinge zusammenhängen ...

Zunächst können Sie das Makro mit F3 Cu 2 Cx <} F4

Sie könnten es dann zeitweilig an F1 mit Cx Ck b F1 binden > (Das ist nicht wahr, wenn F1 momentan ein Präfix-Schlüssel für eine existierende Keymap ist, wenn Sie es interaktiv eingeben, wird einfach der Rest angezeigt. Sie können dies im Code mit (global-set-key (kbd "<f1>") ...) umgehen, aber ich würde vorschlagen, bei reservierte Bindungen ).

Wenn Sie dann describe-key ( Ch k ) verwenden, um zu prüfen, was an diesen Schlüssel gebunden ist, zeigt Emacs Ihnen einen (lambda) Ausdruck, den Sie kopieren könnten zu Ihrer init-Datei, wenn Sie dies wünschen.

Alternativ können Sie das Makro benennen und Emacs bitten, den Code in den aktuellen Puffer einzufügen:

Mx < name-last-kbd-macro RET <() RET Mx < insert-kbd-macro RET RET

Dieser Code sieht anders aus als der von describe-key angezeigte Lambda-Ausdruck, aber wenn Sie das eingefügte Makro auswerten, sehen Sie die Äquivalenz. Sie können ebenfalls zeigen, dass der (kbd "...") -Ausdruck auch denselben Wert ergibt, und daher sind dies alles nur alternative Möglichkeiten, dasselbe zu tun.

(Sie können den * scratch * -Puffer verwenden, um den Code auszuwerten, indem Sie den Punkt nach dem Ende des Ausdrucks verschieben und entweder Cx Ce eingeben, um den Wert anzuzeigen der Minipuffer oder Cj , um den Wert in den Puffer einzufügen.

Beachten Sie, dass der eingegebene Code fset verwendet, um das Makro einem Symbol zuzuweisen. Sie könnten das Makro an einen Schlüssel binden, indem Sie (fset) ausführen und dann dieses Symbol einem Schlüssel mit (global-set-key) zuweisen, oder Sie können (fset) ignorieren und den Makrowert einfach direkt zuweisen. Dies entspricht natürlich direkt der Antwort von Angus.

Bearbeiten: Ich habe gerade bemerkt, dass es eine kmacro-name-last-macro Funktion gibt, die an Cx Ck n gebunden ist, die in der Form fast identisch ist name-last-kbd-macro , aber die die Lambda-Ausdrucksform erzeugt, die bei Verwendung von kmacro-bind-to-key ( Cx Ck b ) und describe-key angezeigt wird.

    
phils 27.12.2010, 05:12
quelle
18

Sicher gibt es, und es ist der offensichtliche Weg:

%Vor%     
angus 26.12.2010 23:14
quelle
8

Ich werde shrink-window-horizontally als Beispielfunktion verwenden, aber Sie können die Idee auf alle Bindungen, die Sie definieren möchten, verallgemeinern.

Wenn Sie zwei als Standardgröße verwenden möchten, um das Fenster zu verkleinern, anstatt eines, versuchen Sie Folgendes:

%Vor%

Dies bindet den F9 Schlüssel an eine interaktive Funktion, die ein Präfix-Argument akzeptiert . Wenn Sie einfach F9 drücken, werden Sie pass kein Argument , das den Standardwert 2 vorruft, da der Parameter n nil als Argument erhält. Wenn Sie jedoch beispielsweise C-u 10 F9 drücken, übergeben Sie zehn als Argument für n . Dadurch können Sie Ihre Bindung flexibler nutzen.

    
seh 26.12.2010 23:49
quelle
0

general-simulate-key von general.el funktioniert besser (in meinem Fall eine Sequenz mit Popups und wechselnden Keymaps, die ich nicht mit Makros bearbeiten konnte): Ссылка

    
fread2281 26.03.2018 21:38
quelle

Tags und Links