Wie erkennt man Tastenanschläge, die den Puffer nicht bearbeiten?

8

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-bufferusw.

Der Grund dafür ist, dass ich an einigen ycmdBindungen 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.

Abingham
quelle
8
Sie könnten an Leerlauf-Timern für diese Art von Sachen interessiert sein
giordano
2
Eine andere Idee (oder eine Verfeinerung der Idee mit Leerlauf-Timern): Es wird self-insert-commandempfohlen, 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.
mbork
2
mbork: after-change-functionsist ein allgemeiner Mechanismus, um auf Textänderungen zu reagieren.
Phils
1
Verwenden Sie a 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.
Malabarba
1
Ich bin nicht sicher, ob es für dieses spezielle Problem relevant ist, aber die buffer-chars-modified-tickFunktion kann nützlich sein.
Jon O.

Antworten:

2

Fügen Sie die folgenden Haken hinzu:

  • Um pre-command-hook, einige Sentinel - Variable zu setzen t- diese Signale der Befehl war nicht zu ändern.
  • Um after-change-functions, setzen Sie diesen Sentinel - Wert nil. (Es ist ein Haken, es klingt einfach nicht so; danke an @phils für den Hinweis.)
  • Um 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.

Sean Allred
quelle
Ich muss jetzt zur Arbeit gehen…
Sean Allred
2
Nicht empfehlen, sich selbst einzufügen. Verwenden Sie After-Change-Funktionen
Malabarba
Ich werde es versuchen, wenn ich eine Chance habe.
Abingham
4
@abingham In der Regel sind Haken Ratschlägen vorzuziehen. Hooks wurden speziell für das Anbringen von Funktionen entwickelt, während Ratschläge Möglichkeiten zum Anbringen von Gegenständen an unerwarteten Stellen darstellen. In diesem speziellen Fall ist es auch nicht ratsam, einige sehr grundlegende Funktionen zu empfehlen, da diese unzuverlässig mit der Byte-Kompilierung interagieren.
Malabarba
2
Ich denke, Sean wollte sich darauf beziehen post-self-insert-hook(dieser Teil der Antwort scheint diesen Haken mit Beratung zu verwechseln self-insert-command). Ich denke, Sie würden es im Allgemeinen vorziehen, after-change-functionsweil es tatsächlich das tut, was Sie wollen (da das Selbsteinfügen nicht die einzige Art von Tastendruck ist, die den Puffer modifiziert).
Phils
0

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-hookdass (1) den aktuellen Wert von aufzeichnet (buffer-modified-p)und dann (2) verwendet set-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 Wert nildann auf den Wert vor dem Ändern zurückgesetzt wird mit set-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.

Drew
quelle