Visual Studio hat diese nette Funktion, mit der Sie den Punkt auf etwas setzen können, drücken C-f3
und beide finden die nächste Instanz des Dings unter dem Punkt und es wird sich daran erinnern. Sie können dann drücken f3
, um die nächste Instanz zu finden und S-f3
nach derselben Sache zu suchen, jedoch rückwärts.
Ich kann dasselbe in Emacs mit einem Elisp machen, das ich geschrieben habe. (Es ist sperrig und ich bin sicher schlecht, also werde ich es weglassen).
Was würde Ich mag zu tun ist für eine ähnliche Funktionalität zu ermöglichen, sagen wir, f2
, f3
, f4
, und f5
. Wenn Sie also auf C-f2
Suchen nach dem Objekt unter dem Punkt drücken, indem Sie C-f3
das Objekt irgendwo in einer Variablen / einem Assoziationsarray / Symbol speichern. Wenn Sie auf ein anderes Objekt drücken , wird Emacs das zweite Objekt speichern, das in einer bestimmten Variablen gespeichert wird, und ich kann suchen für das erste, indem f2
ich in der Zukunft drücke, und ich kann nach dem zweiten suchen, indem ich f3
in der Zukunft drücke.
Ich würde gerne eine einzige Funktion für das Control-X erstellen, eine andere für einfaches X und eine dritte für Shift-X, aber ich bin mir nicht sicher, wie ich das angehen soll.
Ist es besser, die Funktion nach dem aktuellen Tastendruck fragen zu lassen (a la this-single-command-keys
) oder einen Weg zu finden, um einen Parameter an die interaktive Funktion zu übergeben ( ohne den Benutzer dazu aufzufordern, da er bereits eine Taste gedrückt hat)?
Wie gibt man zusätzliche Informationen an eine interaktive Funktion weiter?
quelle
C-u
; oder indem Sie den Benutzer auffordern, eine Auswahl aus dem Minibuffer einzugeben, oder den Benutzer auffordern, einen bestimmten Schlüssel auszuwählen; zB drücken Sie 1 für foo, drücken Sie 2 für bar, drücken Sie 3 für baz. [Ungefähr 90% der gesamten Frage sind interessant , aber für die allerletzte Frage / Antwort nicht relevant (meiner Meinung nach). Die vorletzte Frage sucht eine Meinung .]Antworten:
Sie können einen Befehl an mehrere Tastenfolgen binden und mit auf die aufrufende Tastenfolge innerhalb des Befehls zugreifen
this-command-keys
. Dies wird mit dem folgenden Code demonstriert. Dort wird der gleiche Befehlmy-command
wird indirekt auf die Schlüsselsequenzen gebundenF9
,C-c a
undC-c b
. "Indirekt" bedeutet dabei, dass es eine dünne Hülle gibtmy-command-wrapper
. Dieser Wrapper wird als interaktiver Befehl verwendet und ist sehr einfach gehalten. Es sollte nicht instrumentiert werden,edebug-defun
da der Rückgabewert vonthis-command-keys
in der Debugging-Sitzung keinen Sinn ergibt.Der Beispielcode zeigt, wie Sie separate Historien für die separaten aufrufenden Tastenfolgen aufbewahren können.
Wenn Sie die Tastenfolgen beim ersten Mal oder mit dem Präfix arg oder mit dem Shift-Modifikator aufrufen, können Sie den Argumentwert ändern, da
my-command
andernfalls der letzte Argumentwert aus dem Verlauf verwendet wird.quelle
Schauen wir uns das logisch an: Sie möchten nahezu identische Befehle an
C-f2
und gebunden habenC-f3
. Der einzige Unterschied zwischen diesen Befehlen besteht darin, ob sie das Objekt unter Punkt imf2
Speicher oder imf3
Speicher speichern. Dann müssen Sie entweder verschiedene Befehle erstellen oder einen einzelnen Befehl haben, dessen Verhalten davon abhängt, an welchen Schlüssel er gebunden ist.Sie können einen Schlüssel an einen Befehl binden, der zum Zeitpunkt der Erstellung der Bindung erstellt wurde. Das Befehlsargument an
define-key
und Freunde muss kein Befehlsname in Form eines Symbols sein, sondern kann ein Lambda-Ausdruck sein.Das funktioniert, ist aber nicht sehr schön. Beispielsweise zeigen Hilfebefehle und Befehlsverläufe keinen Befehlsnamen an.
Sie können den Großteil des Codes in eine Funktion einfügen und kleine Wrapper-Funktionen definieren. Lassen Sie die Wrapper-Funktionen von einer Funktion oder einem Makro generieren, um zu vermeiden, dass viel Code wiederholt wird.
Alternativ können Sie für jede Funktionalität einen einzelnen Befehl definieren (erste Suche, Vorwärts wiederholen, Rückwärts wiederholen). Dies ist etwas weniger flexibel (z. B. können Sie `search-thing-at-point-f2 nicht neu binden, H-swenn es Ihnen gefällt), aber viel weniger ausführlich.
Ein Befehl kann herausfinden, welcher Schlüssel ihn aufgerufen hat. Der einfachste Weg für Sie ist die Verwendung der Variablen
last-command-event
.Ich denke nicht, dass Ihre vorgeschlagene Schnittstelle eine besonders nützliche Ergänzung zu Emacs ist. Die in Emacs integrierte integrierte Suche bietet einfache Möglichkeiten, um das Objekt punktgenau zu durchsuchen und frühere Suchvorgänge zu wiederholen.
C-s
, um eine interaktive Suche zu starten .C-w
nach dem Wort,C-e
nach dem Rest der Zeile,C-y
nach dem zuletzt kopierten Text usw.C-s
erneut.M-p
undM-n
.quelle
Das Paket befasst
highlight-symbol
sich eher mit Ihrem ursprünglichen Anwendungsfall als mit der Elisp-Programmierfrage und macht das, was Sie wollen. Ich bin seit vielen Jahren ein glücklicher Benutzer.http://nschum.de/src/emacs/highlight-symbol/
Aus der Paketbeschreibung:
quelle