Wie kann ich meine Rückgängig-Geschichte in vim verwerfen?


23

Rückgängig ist schön in Vim zu haben. Aber manchmal möchte ich an einem bekannten guten Punkt meinen Rückgängig-Verlauf löschen u, um einzelne Änderungen rückgängig machen zu können, aber nur bis zu einem bestimmten Punkt. (Zum Beispiel könnte dies der Zeitpunkt sein, an dem ich das letzte Mal einen Commit ausgeführt habe.)

Eine Möglichkeit, dies zu erreichen, besteht darin, die Datei zu schließen und erneut zu öffnen - der Rückgängig-Verlauf beginnt an diesem Punkt sauber. Aber das ist ein Ärger.

In der Vergangenheit habe ich dies mit erreicht :edit!. In Vim 7.3 wird der Rückgängig-Verlauf jedoch nicht verworfen.

Gibt es eine andere Möglichkeit, dies zu tun, als die Datei zu schließen?


Sie möchten also nur den Status der Datei wiederherstellen, der bei Ihrem letzten Commit vorlag? Sie wollen im Wesentlichen nur die "U" -Taste auf etwas wie git checkout -f fileoder neu zuordnen hg rollback file?
Akira

@akira - nein, ich möchte in der Lage sein, ueinzelne Änderungen rückgängig zu machen, aber nicht über den Punkt hinaus, an dem ich das letzte Mal einen Commit ausgeführt habe. Genau so, als hätte ich jedes Mal, wenn ich ein Commit ausgeführt habe, die Datei geschlossen und erneut geöffnet. Das war :edit!früher so, als würde man die Datei schließen und wieder öffnen. Dies MUSS nicht an einen Festschreibungspunkt gebunden sein, dies ist nur der Zeitpunkt, an dem ich es am häufigsten möchte.
Nathan Long

Ah, das macht das Problem viel klarer. Sie sollten Ihre Frage ein wenig ändern.
Akira

Antworten:


11
:set undoreload=0 | edit

sollte tun, wonach du fragst.


1
Ha! Schalten Sie diese Funktion einfach aus, oder? :) Ich weiß nicht, warum ich so lange gebraucht habe, um das zu bemerken.
Nathan Long

7

Das alte: redigieren Sie! Verhalten in einem Einzeiler:

:exe "set ul=-1 | e! | set ul=" . &ul

Das funktioniert. Würde es Ihnen etwas ausmachen, es zu erklären?
Nathan Long

Verketten Sie den Wert der Einstellung "Undolevels" am Ende der Befehlsfolge (damit sie wiederhergestellt werden kann) und führen Sie sie aus. Weitere Informationen finden Sie in der Dokumentation: :h :exe, :h :bar, :h :set-args, :h 'ul'und :h :edit!.
Aldrik

6

Benoits Funktion hat bei mir nicht funktioniert, aber ich habe im vim-Handbuch etwas Ähnliches gefunden:

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

Ich habe es einer Funktion hinzugefügt, die meinem vimrc hinzugefügt wurde, und es scheint auf vim 7.3 einwandfrei zu funktionieren:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

Dies kann mit verwendet werden :ClearUndo.


1
Wenn ich normalerweise mit dem Gundo-Plugin arbeite und das Neuladen von Dateien rückgängig mache, ist dieses Ding für mich sehr praktisch. Ich habe jedoch zwei Dinge geändert: Anstelle des normalen Bearbeitungsbefehls (der anscheinend selbst einen Bearbeitungsverlauf in 7.4 hinterlässt) verwende ich einfach eine Bearbeitung! (und schreibe immer, bevor du den Rückgängig-Verlauf löschst). Es scheint, dass einige interne Listen nicht richtig aktualisiert werden. Wenn Sie dies also mit dem Gundo-Plugin verwenden möchten, nehmen Sie eine zusätzliche Bearbeitung vor! am Ende der Funktionen wird verhindert, dass es später zu Fehlern kommt.
PlasmaHH

@PlasmaHH Könnten Sie bitte die Funktion zum Löschen des Rückgängigmachungsverlaufs posten, da ich nicht verstand, was Sie geändert haben? Danke
Ben

5

Wahrscheinlich:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

( 'ul'ist alias für 'undolevels').


Das funktioniert! Jetzt versuche ich, einen einzelnen Befehl dazu zu bringen - vorzugsweise :edit!. Zu Beginn habe ich mit den von Ihnen aufgelisteten Befehlen eine Funktion namens ClearUndos () erstellt, aber der Aufruf scheint nichts zu bewirken, wohingegen das individuelle Ausführen der Befehle ...
Nathan Long

3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit

soll das der inhalt der funktion sein? Es funktioniert nicht für mich, aber vielleicht habe ich es falsch verstanden. Auch - vielleicht dies auf seine eigene Antwort verschieben?
Nathan Long

Möglicherweise können Sie |einen Befehlsinhalt nicht roh einfügen. Erstellen Sie dann eine Funktion, die das tut, was ich in meiner Antwort angegeben habe, und setzen Sie den Befehl auf call thefunction().
Benoit

3

"Verlauf rückgängig machen löschen (: w um die Datei rückgängig zu machen, falls vorhanden)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Wenn Sie 'undolevels' auf -1 setzen, werden die Rückgängig-Informationen nicht sofort gelöscht. Dies geschieht bei der nächsten Änderung, dh m-1bei der Änderung Ihres Textes.
  • Wenn 'undofile'eingeschaltet ist, :wlöschen Sie die Undo - Datei oder eine Kette wie UndoClear|w.

1

In einem Skript:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

Dann benutze :Resetum es zu nennen.


Ihre Funktionsdefinitionszeile benötigt () am Ende.
Nathan Long

Das ist merkwürdig - diese Befehle einzeln auszuführen funktioniert einwandfrei, und das Echo der Werte in der gesamten Funktion zeigt, dass sie richtig gesetzt und nicht gesetzt sind. Durch das Ausführen der Funktion wird mein Rückgängig-Verlauf jedoch nicht zurückgesetzt. Danach kann ich den Vorgang immer noch mehrmals rückgängig machen. Vielleicht set ul=wirkt sich der Befehl nur auf eine lokale Variable aus, bis das Skript beendet wird, und da wir ihn vor dem Beenden des Skripts wieder ändern, wirkt er sich nie auf die Umgebung aus? Haben Sie diese Funktion getestet und haben sie funktioniert - was bedeutet, dass mein Setup seltsam ist?
Nathan Long
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.