Laden Sie die Undo-Datei nicht, wenn sie in Vim 7.3+ zu groß ist

470
Kyle Strand

Ich habe gerade eine riesige Menge Text (in der Größenordnung von Millionen Zeilen, glaube ich) in ein Vim-Register kopiert, eine neue Datei geöffnet, eingefügt und dann die neue Kopie des Ausschnitts bearbeitet. Vim war während des gesamten Prozesses ziemlich schnell; Es war ein schönes Schaufenster der Macht von Vim.

.... nur dass ich die permanente Rückgängig-Funktion verwende. Nach einiger Zeit des Editierens bemerkte ich, dass meine Vim-Sitzung eine enorme Menge an Speicher in Anspruch nahm (etwa dreimal so viel wie meine Chrome-Sitzung, was laut Vim-Standards viel ist). Zuerst dachte ich, es wäre so, weil sich meine massive Kopie noch in einem der Register befand, aber als ich zur Bearbeitung ging .viminfo, betrug der längste Registerwert etwa 20 Zeilen. Ich habe versucht, Vim ein paar Mal neu zu starten, aber jedes Mal, wenn die betreffende Datei geladen wurde, blieb sie für eine inakzeptable Zeit hängen (wiederum nach Vim-Standards).

Also wurde mir klar, dass ich meine Undo-Datei für die problematische Datei löschen musste. Dies hat mein unmittelbares Problem gelöst, aber ich möchte vermeiden, es erneut zu begegnen. Ich möchte also eine Autocmd in meinem VimRC, die Folgendes tut:

  • Überprüfen Sie nach dem Laden einer Datei die Größe der entsprechenden Undo-Datei (falls vorhanden).
  • Führen x MbSie einen der folgenden Schritte aus, wenn die Rückgängig-Datei größer ist (oder eine andere Größe).
    • Lösche es
    • Wenn Sie nur die letzten Änderungen beibehalten, löschen Sie die Änderungen, bis die Datei eine angemessene Größe hat (dies wäre das bevorzugte Verhalten).

Irgendwelche Gedanken, wie das geht?

2
Nur tangential bezogen, aber hier ist ein Shout-out zu einem ziemlich coolen Skript (nicht meins, aber ich habe es sofort ausgeführt, sobald ich es gefunden habe), das etwas bewirkt, für das Vim wirklich eine eingebaute Fähigkeit haben sollte: https: // github.com/doy/conf/blob/master/bin/clean-vim-undo Kyle Strand vor 10 Jahren 0

2 Antworten auf die Frage

2
Ingo Karkat

Das LargeFile - Große Dateien bearbeiten- Plugin erkennt große Dateien und optimiert viele Optionen, um dies besser zu berücksichtigen . Es schaltet sich auch 'undolevels'aus, um zu verhindern, dass Sie eine größere Speichererweiterung sehen.

Hätte das sowieso schon gebraucht - danke für den Vorschlag. Ich akzeptiere die andere Antwort, nur weil sie spezifischer für das spezielle Problem ist, das ich hatte, aber auch +1 für Ihr Problem. Kyle Strand vor 10 Jahren 0
1
benjifisher

Von undo-persistence:

The 'undofile' option is checked after writing a file, before the BufWritePost autocommands. If you want to control what files to write undo information for, you can use a BufWritePre autocommand: > au BufWritePre /tmp/* setlocal noundofile 

Ich wollte vorschlagen, dass Sie vor dem Schreiben der Undo-Datei entscheiden, wie groß sie sein wird, und dann entscheiden, ob Sie die Einstellung vornehmen möchten 'undofile'. Es ist wahrscheinlich einfacher, vim die Datei schreiben zu lassen, dann BufWritePostdie Größe der neu geschriebenen Datei mit einem Autocommand zu überprüfen und sie zu löschen, wenn sie zu groß ist.