2012-10-05 8 views
9

Ich habe eine Vimscript-Funktion, die auf BufWritePre aufgerufen wird, um die Integrität der Datei zu überprüfen. In der Regel werden dabei Leerzeichen gekürzt und überprüft, ob die Faltenstruktur "gültig" ist (gemäß den Konventionen meines Unternehmens).Verhindern, dass Vim seinen Rückgängig-Baum aktualisiert

Mein Problem ist, dass, wenn ich eine Datei bearbeite und dann speichern, die Rückgängig-Struktur die von der Überprüfungsfunktion vorgenommenen Änderungen enthält. Gibt es eine einfache Möglichkeit zu sagen, dass ich nicht möchte, dass eine Funktion den Rückgängig-Baum ändert? Oder kann ich den Status zu Beginn der Funktion speichern und am Ende wiederherstellen?

Antwort

6

Mit können Sie Ihre Änderungen mit den letzten Änderungen durch den Benutzer (thoug Ich würde das verwirrender finden, als wenn ich sie trennen würde. Im Allgemeinen ist das Rückgängigmachen eine Schrittfolge; Sie können nicht einfach Schritte in der Mitte weglassen, die sowohl unintuitiv als auch schwer in der Undo-Engine zu implementieren wären.

Wie auch immer, was ist so schlimm daran, Ihre automatische Neuformatierung in die Undo-History aufzunehmen? Wie ich es verstehe, wird es beim nächsten Speichern erneut angewendet, wenn der Benutzer seine letzten Änderungen rückgängig macht.

+0

Danke, du machst ein paar gute Punkte. Ich muss überdenken, was ich erreichen wollte. Der 'Rückgängigmachen'-Befehl kann sich als nützlich erweisen. –

3

Wenn Ihr BufWritePre Aktion Manipulationen ausführt, die letztlich die Dateien unverändert lassen, können Sie:

:wundo <tmpfile> 

... Änderungen vornehmen Datei danach die gleiche verlassen ...

:rundo <tmpfile> 

Dieser Wille belassen Sie Ihre Rückgängig-Historie vor der vorübergehenden Änderung, wenn die Datei jedoch nicht mit dem vorherigen Status übereinstimmt, erhalten Sie den Fehler File contents changed, cannot use undo info.

Wenn Sie die Änderungen während der fertig machen BufWritePre unmöglich rückgängig zu machen, können Sie:

:set noundofile 

.. Änderungen Perform ...

:set undofile 

Allerdings wird diese ganze Geschichte verlieren vor dem BufWritePre

+0

Das sieht gut aus, danke. Warum funktioniert das nur, wenn die Datei unverändert ist? Im Allgemeinen wird sich die Datei ändern, aber ich möchte die Änderungen nicht rückgängig machen können. –

+0

@PrinceGulash Möchten Sie Änderungen vor der BufWritePre-Aktion rückgängig machen können? – Benj

+0

Ja. Wenn ich also ein Wort hinzufüge und dann speichere, sollte "du" das Wort entfernen, unabhängig von den Leerzeichen, die das Speichern ausgelöst hat. –