Best Practices für VIM-Auslagerungsdateien?

14

Jedes Mal, wenn ich aus einer Sitzung in Vim ausschied, weil ich die Verbindung verloren habe, bin ich ziemlich voll mit Dred (und ich benutze Vim trotzdem weiter ... was für ein Masochist ich sein muss), denn wenn ich meine Akten wieder öffne, Akten warten darauf, meine Arbeit zu zerstören. Was sind die Best Practices für die Arbeit mit VIM-Auslagerungsdateien? Wählen Sie einfach die neueste aus? Wenn die Datei wie erwartet funktioniert, löschen Sie einfach die Auslagerungsdateien? Wie werden Sie sie los?

leeand00
quelle
5
Swap-Dateien dienen zum Schutz Ihrer Arbeit. Erwägen Sie die Verwendung von Gnu-Bildschirm.
1
Ich möchte die Funktionalität nicht ausschalten. es ist ärgerlich aber wie du sagst nützlich.
Leeand00
1
Ich möchte nur wissen, wie man es richtig benutzt.
leeand00
2
@ DrEval Ich benutze tmux
leeand00
2
Wenn Sie tmux verwenden, sollten Sie sich keine Sorgen über den Verlust Ihrer Verbindung machen müssen: Verbinden Sie sich einfach wieder mit Ihrer Sitzung, wenn Sie die Verbindung wiederherstellen. Vielleicht interessieren Sie sich auch für mosh und das Recover-Plugin von @ ChristianBrabandt .
Rich

Antworten:

22

Keine Panik!

Wiederherstellen von Dateien ist immer sicher, da vim nie irgendwelche Änderungen schreibt , bis Sie sie selbst schreiben. Das Wiederherstellen von einer Auslagerungsdatei und das anschließende Schließen ohne Speichern ändern also nichts.

Organisieren Sie Ihre Swap-Dateien:

Bitten Sie vim, alle Ihre Auslagerungsdateien am selben Ort abzulegen, damit Sie immer wissen, wo sie sich befinden:

set directory^=$HOME/.vim/swap//

oder wo immer Sie möchten. Die Verwendung //am Ende des Dateinamens bewirkt, dass vim absolute Dateipfade für die Auslagerungsdateinamen verwendet, sodass keine Namenskollisionen auftreten. Stellen Sie sicher, dass das Verzeichnis vorhanden ist, oder vim verwendet es nicht (es wird es nicht für Sie erstellt).

Hinweis: Dies funktioniert nur bei Umgebungsvariablen. Wenn Sie eine Vimscript-Variable verwenden möchten, müssen Sie etwas :executeMagie verwenden:

execute "set directory^=".my_vim_home_var."/swap//"

Diff die Unterschiede:

Vim Hilfe schlägt vor , einen sehr nützlichen Befehl in dieser Situation zu verwenden: :DiffOrig. Es ist kein vim-Standardbefehl , kopieren Sie also die Implementierung von :h :DiffOrigin Ihren vimrc. (Es ist auch in, $VIMRUNTIME/defaults.vimwenn Sie vim8 haben). Jetzt können Sie die Datei wiederherstellen und einfach DiffOrig ausführen, um einen Überblick über die Änderungen gegenüber der unveränderten Version zu erhalten.

Wenn Sie den Inhalt mehrerer Auslagerungsdateien vergleichen möchten, stellen Sie Ihre Datei mit jeder anderen Auslagerungsdatei wieder her und schreiben Sie das Ergebnis in temporäre Dateien. Laden Sie nun die Dateien und führen Sie sie :diffthisfür jede Datei aus, nehmen Sie die gewünschten Änderungen vor, schreiben Sie in die ursprüngliche Datei zurück und löschen Sie die temporären und Auslagerungsdateien.

Nützliche Befehle:

:swapname: Ermittelt den Namen, den vim für die Auslagerungsdatei für den aktuellen Puffer verwendet ( :h :swapname) :recover: Stellt die ausgewählte Datei wieder her, genau wie beim Starten von vim und Drücken von R( :h :recover).

Schauen Sie sich die Hilfe an:

Vim hat einen ganzen Abschnitt des Benutzerhandbuchs auf Erholung: :usr_11.txt
Referenz Hilfe des Vim auf Auslagerungsdateien: :h swap-file, h recovery
Hilfe im Verzeichnis Option (für die Auslagerungsdatei einstellen)::h 'directory'

Bearbeiten: Geändertes Beispiel für das Einstellen des Verzeichnisses, wie in den Kommentaren von @B Layer ausgeführt

flemingfleming
quelle
Was ist, wenn Sie am Ende mehrere Auslagerungsdateien haben? Wegen vieler, vieler unterbrochener Verbindungen?
Leeand00
1
Ich erwähnte das im zweiten Absatz von "Diff the Differencces". Sobald Sie Diffs verwendet haben, um zu bestimmen, welche Änderungen Sie beibehalten möchten, löschen Sie alle temporären Dateien und alten Auslagerungsdateien, die Sie vorgenommen haben (jetzt wissen Sie, wo sich alle Auslagerungsdateien befinden).
Flemingfleming
1
Zu Ihrer Information, Sie müssen nicht verwenden exec... set directory^=$HOME/.vim/swap//funktioniert einwandfrei, solange $HOMEes sich um eine initialisierte Umgebungsvariable handelt. Sehen :h expand-env. Funktioniert auch mit dictionary, undodirund backupdirum nur einige zu nennen.
B Schicht
Danke, dass du mich daran erinnert hast! Ich verwende stattdessen eine Vimscript-Variable in meiner Konfiguration, daher benötigen die Umgebungsvariablen execute und forgot das nicht. Wenn ich darüber nachdenke, sollte ich wahrscheinlich nur vim verwenden, um stattdessen eine Umgebungsvariable festzulegen.
Flemingfleming
2

Persönlich habe ich Auslagerungs- und Sicherungsdateien deaktiviert, da sie in der Regel überall Auslagerungs- und Sicherungsdateien erstellen und häufig Konflikte verursachen. Das dauerhafte Rückgängigmachen von Vim war viel zuverlässiger und fehlerfreier.

Vim verfügt derzeit über eine permanente Methode zum Rückgängigmachen, eine viel feinkörnigere Methode zum Sichern. Bei jedem Drücken von Escwird der aktuelle Status der Datei erfasst.

Sie können :undolistoder Plugins wie Gundo oder Undo-Tree verwenden, um Ihren Undo-Verlauf zu durchsuchen.

So verwenden Sie vim:

  • Erstellen Sie ein Verzeichnis, in dem der Bearbeitungsverlauf für jede Datei erfasst wird
  • Weisen Sie vim an, dieses Verzeichnis zu verwenden
  • Dauerhaftes Rückgängigmachen aktivieren

In der Schale:

mkdir ~/.vim/undodir

In Vim

set undodir=~/.vim/undodir
set undofile

So deaktivieren Sie Auslagerungsdateien: :set noswapfile

alpha_989
quelle
1
Es gibt ein paar ziemlich große Probleme mit dieser Antwort. 1. Durch ständiges Rückgängigmachen wird ein anderes Problem beim Austauschen von Dateien behoben (und 'writebackup'ein weiteres Problem behoben). Das dauerhafte Rückgängigmachen hilft nicht, wenn Ihr Computer abstürzt. Sie können argumentieren, dass Auslagerungsdateien aus anderen Gründen (Stabilität des modernen Betriebssystems, Vorhandensein von UPS) nicht erforderlich sind, haben dies jedoch in dieser Antwort nicht getan. 2. Einstellung aktiviert 'undodir' nicht dauerhaftes Rückgängigmachen! Sie müssen gesetzt 'undofile'für diese
reich