Was ist der beste Weg, um Tastenanschläge (z. B. über einen Hook) zu erkennen, die den Puffer nicht bearbeiten? Ich meine Dinge wie Pfeiltasten für Punktbewegungen, Anrufe an beginning-of-buffer
usw.
Der Grund dafür ist, dass ich an einigen ycmd
Bindungen für Emacs arbeite und (zumindest heuristisch) erkennen möchte, wann der Benutzer die Bearbeitung beendet hat und sich im Puffer bewegt. Dies ist ein guter Zeitpunkt, um den Pufferinhalt zum Parsen zu versenden. Der vim-Client führt dies aus, wenn der Benutzer den Einfügemodus verlässt und ich versuche, dieses Verhalten zu emulieren.
key-bindings
Abingham
quelle
quelle
self-insert-command
empfohlen, einen Timer abzubrechen und neu zu planen, anstatt einen Leerlauf-Timer zu verwenden. Auf diese Weise wird der Timer nicht zurückgesetzt , selbst wenn der Benutzer etwas tut , es sei denn, das "Etwas" ist das Einfügen von Text.after-change-functions
ist ein allgemeiner Mechanismus, um auf Textänderungen zu reagieren.post-command-hook
. Das wird alles auslösen, daher müssen Sie möglicherweise etwas filtern, was es ausgelöst hat, bevor Sie die gewünschten Maßnahmen ergreifen.buffer-chars-modified-tick
Funktion kann nützlich sein.Antworten:
Fügen Sie die folgenden Haken hinzu:
pre-command-hook
, einige Sentinel - Variable zu setzent
- diese Signale der Befehl war nicht zu ändern.after-change-functions
, setzen Sie diesen Sentinel - Wertnil
. (Es ist ein Haken, es klingt einfach nicht so; danke an @phils für den Hinweis.)post-command-hook
überprüfen Sie diesen Wert Sentinel und führen Sie Ihre Funktion.Dies kann je nach Ausführungsreihenfolge funktionieren oder nicht. Wenn nicht, lass es mich in den Kommentaren unten wissen.
Wenn ich von der Arbeit komme, werde ich ein Beispiel posten.
quelle
post-self-insert-hook
(dieser Teil der Antwort scheint diesen Haken mit Beratung zu verwechselnself-insert-command
). Ich denke, Sie würden es im Allgemeinen vorziehen,after-change-functions
weil es tatsächlich das tut, was Sie wollen (da das Selbsteinfügen nicht die einzige Art von Tastendruck ist, die den Puffer modifiziert).Nur ein Gedanke -
Hier sollte es eigentlich nicht um "Tastenanschläge" gehen, sondern um Befehle - egal wie sie ausgeführt werden, nein ? Wenn ich das richtig verstehe, suchen Sie wirklich nach einer Möglichkeit, festzustellen, ob ein bestimmter Befehl, der aufgerufen wird, den Puffer ändert.
Wenn ja, dann machen Sie vielleicht so etwas:
Setzen Sie eine Funktion darauf,
pre-command-hook
dass (1) den aktuellen Wert von aufzeichnet(buffer-modified-p)
und dann (2) verwendetset-modified-p
, um den Puffer unverändert zu machen.Setzen Sie eine Funktion darauf
post-command-hook
, (1) prüft, ob der Befehl den Puffer geändert hat (indem er den aufgezeichneten Wert mit dem neuen aktuellen Wert von vergleicht(buffer-modified-p)
), handelt dann entsprechend und (2) wenn der neue Wertnil
dann auf den Wert vor dem Ändern zurückgesetzt wird mitset-modified-p
.Etwas hartnäckig (es prüft auf jeden Befehl, der aufgerufen wird), aber es könnte einen Versuch wert sein.
Wenn der Teil " entsprechend handelt " nur ein No-Op für alle Puffermodifizierungsbefehle ist und wenn er auch ein No-Op für viele nichtmodifizierende Befehle ist (z. B. weil Sie es gerade bei einem vorherigen nichtmodifizierenden Befehl getan haben), dann werden Sie zumindest nicht mehr als nötig " entsprechend handeln ". Aber der Überprüfungsteil allein könnte teuer / übertrieben sein (Dinge zu stark verlangsamen) - versuchen Sie es, um zu sehen.
quelle