Wenn wir eine Datei bearbeiten, machen wir normalerweise viele UNDO hintereinander, beispielsweise 20 Mal. In VIM wird dies normalerweise durch u
20-maliges Drücken ausgeführt , wodurch VIM in den 20 Positionen des Verlaufsstapels "nach oben" geht. Wenn Sie dann eine bestimmte Option festlegen change
, gehen alle letzten 20 Verlaufsbefehle verloren und werden durch ersetzt change
. Ich würde das gerne machen, change
ohne diese 20 Positionen zu verlieren. Ich möchte VIM also anweisen, die Aufzeichnung des Verlaufs zu beenden, bevor ich dies tue change
, und den Verlauf danach fortzusetzen (nicht change
in den Verlauf aufnehmen wollen ).
BEARBEITEN
Um klarer zu sein: Ich habe eine Funktion FF
, die die letzten Zeilen einer Datei aktualisiert, wenn der Puffer geschrieben wird. Wenn ich also spiele 20 undos + write
, write
öffnet der letzte einen neuen Rückgängig-Zweig. Ich habe versucht, undojoin
innen hinzuzufügen FF
( ich habe versucht , einem Vorschlag von jlmg unten zu folgen), aber eine Sequenz Schreiben-Rückgängig-Schreiben gibt einen Fehler: Rückgängig machen nach Rückgängig nicht erlaubt . Ich könnte stattdessen einige tun, sed ....
nachdem ich gegangen vim
bin, aber da ich dies durch verwende, SSH
bevorzuge ich eine Nur-Vim-Lösung (einen Befehl ausführen, nachdem der Puffer entladen wurde, wird nicht in die Datei geschrieben).
BEARBEITEN 2 Versuchen Sie dies in VIM: Öffnen Sie eine leere Datei und gehen Sie wie folgt vor:
i1<ESC>:wa2<ESC>:wa3<ESC>:wa4<ESC>uu:w
Wenn Sie jetzt eine machen <CTRL>R
, schreibt VIM die '3' zurück, je weiter <CTRL>R
Sie die bekommen 4
. Dies geschieht AUCH, wenn Sie :w
nach jedem eine machen <CTRL>R
. Wenn Sie jedoch jedes Mal, wenn Sie eine Funktion :w
ausführen, eine Funktion ausführen BufWritePre
, <CTRL>R
wird die Funktion nicht 3
zurückgeschrieben. Und das ist, was ich tun möchte, deshalb habe ich geschrieben, um "Hisotry auszusetzen", aber vielleicht ist das, was ich frage, nicht möglich, außer mit der vollen Arbeit zu arbeiten undotree()
.
vi
, aber für michvi
ist Undo Befehl rückgängig macht einmal, und dann , wenn Sie die Tasteu
wieder rückgängig macht es den Rückgängig ( ‚Redo‘). Das ist echt vi. Daher kennen ich und andere Benutzer dieser Website möglicherweise die Antwort auf Ihre Frage nicht.vim.se
, das hätte ich versucht. Wie auch immer, Sato scheint zu helfen.sed
erzielen, aber sed kann Ihre Rückgängigmachungen nicht ausführen. Wie wird das funktionieren? Wenn Sie in der Lage wären, den Verlauf auszusetzen, welches Verhalten würden Sie von vim erwarten, wenn Sie anschließend ein Rückgängigmachen durchführen? Das einzige Verhalten, das ich mir vorstellen konnte, war, diese Änderungen (zusammen mit den Rückgängigmachungen) in einem Rückgängig-Block zu gruppieren, daher meine Antwort. Aber wenn das nicht so ist, was ist es dann?Antworten:
Sie müssen den Vim-Verlauf nicht aussetzen. Die tatsächlichen Daten bilden einen Baum, den Sie mit der
undotree()
Funktion abrufen können. Es gibt natürlich eine Reihe von Plugins, die daraus etwas benutzerfreundlicheres machen , z . B. gundo , mundo und undotree . Wenn Sie auch die Undo-Persistenz aktivieren (vgl.:h undo-persistence
), Können Sie einfach durch den gesamten Änderungsverlauf einer Datei navigieren.quelle
undotree()
sollte helfen?change
weder irgendwohistory
noch imundo
Baum erscheint. Deshalb war meine Frage "Geschichte aussetzen".:earlier
, das eine Zeiteinheit akzeptiert und bei Bedarf Verzweigungen rückgängig:earlier 1h
macht (z. B. lässt der Puffer so aussehen, wie er vor einer Stunde war). Wenn Sie keine Zeiteinheit verwenden können (weil die Änderungen zu nahe beieinander lagen?), Müssen Sieg-
den Rückgängig-Baum einige Schritte nacheinander durchlaufen.Wenn ich Sie richtig verstehe, möchten Sie, dass nach dem Rückgängigmachen das
change
und die 20 Rückgängigmachungen rückgängig gemacht werden.Wenn vim eine Funktion oder einen Befehl ausführt, werden alle Aktionen, die es ausführt, zusammen rückgängig gemacht. Ich bin nicht sicher, ob diese Aktionen Rückgängigmachungen beinhalten können. Vielleicht kann dieser Teil der Dokumentation helfen:
Leider habe ich versucht, zu verwenden
:undo 2 | undojoin | normal ohi
, aber ich habe die Fehlermeldung erhaltenE790: undojoin is not allowed after undo
.Wenn die Aktionen jedoch in einer Funktion wie der folgenden ausgeführt werden:
Wenn Sie es dann mit aufrufen
:call F()
, wird dieundo
und eine andere Aktion in einem Rückgängig-Block ausgeführt. Beachten Sie, dass Sie einen neuen Rückgängig-Zweig erstellen, da Sie Rückgängig verwenden. Nachdem dies erledigt ist, können Sie den normalen Modus-Befehl verwendeng-
, um rückgängig zu machenF()
. Verwendenu
wird wie:undo 3
am Anfang getan haben .quelle
undo
alles, was Sie in Ihrer Funktion tun , nach einigen Schritten keinenF()
neuen Rückgängig-Zweig öffnet. In meinem FallF()
wird jedes Mal ausgeführt, wenn ichundo
die Datei schreibe. Wenn ich die Datei schreibe,F()
wird ein neuer Rückgängig-Zweig geöffnet. Ich habe esundojoin
am Anfang mit versuchtF()
, aber eine Sequenz Schreiben-Rückgängig-Schreiben gibt einen Fehler :undojoint not allowed after undo
.:undojoin
die nicht für das funktionierte, was Sie wollten, und erwähnte den gleichen Fehler, und ich schlug zu:undojoin
Beginn nicht vor, sie zu verwendenF()
.F()
soll tun, was:undojoin
nicht konnte, nämlich die Undos und andere Befehle in einem Undo-Block zu verbinden.g-
und navigiereng+
.