VIM - hinterlässt .swp-Dateien nach dem Absturz

3201
Brian M. Hunt

Ich benutze MacVim (snapshot 51), um die Python / HTML / etc-Dateien in einem Projekt mit mittlerer Größe zu bearbeiten. Alle paar Monate stürzt mein System ab oder stürzt ab, und Vim hinterlässt eine Fülle von. *. Swp-Dateien. Wenn ich Vim nach dem Absturz wieder öffne und eine dieser Dateien bearbeite, wird mir mitgeteilt, dass "Swap-Datei '' .xyz.swp '' bereits existiert!" mit den Optionen [Abort] [Quit] [Delete it] [Recover] [Trotzdem bearbeiten] und [Open Read-Only].

Diese Wiederherstellungsoption ist sinnvoll, wenn Änderungen am Vim-Puffer zum Zeitpunkt des Absturzes nicht gespeichert wurden. Zum Zeitpunkt des Absturzes wurden diese Dateien jedoch im Hintergrund von Vim geöffnet und unverändert gelassen.

Wenn möglich, wie kann ich Vim so konfigurieren, dass diese überflüssige Frage beim Öffnen von Dateien nicht gestellt wird, für die keine Änderungen zwischen der .swpDatei und der tatsächlichen Datei vorliegen, z.

  1. Automatischer Vergleich der Änderungen in der SWP-Datei mit der Datei. Wenn keine Änderungen vorhanden sind, öffnen Sie einfach die Datei ohne Aufforderung.

  2. Keine SWP-Datei für Dateien, die keine Änderungen enthalten.

  3. Jede andere Möglichkeit, diese sinnlose Aufforderung systematisch zu vermeiden (aber ich würde es vorziehen, die Aufforderung in Fällen zu vermeiden, in denen natürlich nicht gespeicherte Änderungen vorhanden waren).

Ich habe .swpim Moment mehr als fünfzig Akten, die ich bereinigen muss, und die sinnlose Aufforderung ist eine Frustration, die ich gerne vermeiden würde.

Danke fürs Lesen.

Brian

7
"Alle paar Monate"? Wenn Ihr System nur alle paar Monate abstürzt und Sie viele .swp-Dateien erhalten, müssen Sie Vim auf falsche Weise beenden. Verwenden Sie: q, nicht nur Strg + Z. mcandre vor 14 Jahren 0
@mcandre: Hmm. Ich verwende ': q', aber die Auslagerungsdateien scheinen trotzdem für Puffer im Hintergrund herumzuhängen. Vielleicht ist das eher mein Problem. Ich sehe nichts in "~ / .vimrc", das Puffer halten würde ... (Übrigens, was macht "Strg + Z"? In MacVim scheint es nichts zu tun) Brian M. Hunt vor 14 Jahren 0
`Strg + Z` beendet einen Prozess, der von einer Shell (Terminal) gestartet wurde. Da Sie MacVim verwenden, trifft dies nicht auf Ihre Situation zu, aber Sie können es vielleicht von Ihrem Terminal aus versuchen… bchang vor 13 Jahren 0
Eigentlich tötet `Ctrl-Z` nichts. Der Prozess wird unterbrochen. (Aber nicht in GUI Vims.) Dadurch können Sie zur Shell zurückkehren, einige Dinge tun und Vim wieder hochfahren. Wenn Sie die Shell in der Zwischenzeit töten (z. B. durch Schließen des Terminalfensters), werden Sie Vim töten. Peeja vor 12 Jahren 0

4 Antworten auf die Frage

4
redacted

Auch wenn dies nicht genau das ist, was Sie möchten, kann dies das Problem mildern:

" Setup backup location and enable set backup set backupdir=$HOME/temp/vim_backups/ "where to put those backups set directory=$HOME/temp/vim_swp/ "this is for swp files  

Erstellen Sie diese Verzeichnisse und schreiben Sie die Dateien ~ und .swp an einen zentralen Ort. Viel einfacher auf diese Weise zu reinigen!

Auschecken von recover.vim - wenn eine .swp-Datei gefunden wird, werden Sie aufgefordert, ein Diff für die auf der Festplatte vorhandene Version und das swp auszuführen, damit Sie sehen können, was sich geändert hat. Viel hilfreicher auf diese Weise IMO.

3
GmonC

Ich habe es nicht getestet, aber wie sieht es mit dieser Lösung aus, die im offiziellen Wiki von Vim enthalten ist?

Swap-Datei "..." existiert bereits! - so differ es

Auch wenn sich herausstellt, dass die wiederhergestellte Auslagerungsdatei mit der tatsächlichen Datei identisch ist, besteht keine Notwendigkeit für das Diffing.

#!/bin/bash # Expects variables realfile, swapfile, recoveryfile. vim -r "$swapfile" -c ":wq! $recoveryfile" && rm "$swapfile" if cmp "$recoveryfile" "$realfile" then rm "$recoveryfile" else vimdiff "$recoveryfile" "$realfile" fi 

Es gibt auch ein Skript für dieses Problem in Stackoverflow .

Dadurch werden alle Auslagerungsdateien entfernt, die mit den echten Dateien auf dem neuesten Stand sind . Alle, die nicht übereinstimmen, werden in einem vimdiff-Fenster angezeigt, damit ich meine nicht gespeicherten Änderungen zusammenführen kann.

0
mcandre

Vim erstellt automatisch .swp-Dateien als Backup für genau diese Situation: Das System stürzt ab. Befolgen Sie diese Anweisungen, um die Erstellung der .swp-Datei zu deaktivieren .

1. Ergebnis für Google: vim disable .swp.

@mcandre: Danke. Das Deaktivieren von Swap ist eine Worst-Case-Lösung. Angesichts der (wenn auch geringen Wahrscheinlichkeit) hohen potenziellen Verluste durch die Verwendung von Swap-Dateien werde ich dies wahrscheinlich nicht tun. Es ist die sinnlose Wiederherstellungsaufforderung, die ich vermeiden möchte. Brian M. Hunt vor 14 Jahren 0
Sie könnten ein Anmeldeskript schreiben, das alle .swp-Dateien findet und in ein Sicherungsverzeichnis verschiebt (oder sogar löscht). mcandre vor 14 Jahren 0
@Mcandre: Danke für den Vorschlag. Das könnte funktionieren, und ich habe darüber nachgedacht, aber es würde mir nicht sagen, ob nicht gespeicherte Änderungen in den Auslagerungsdateien vorhanden waren. Brian M. Hunt vor 14 Jahren 0
Fügen Sie dem Skript dann ein "diff" hinzu, um die Dateien zu vergleichen. mcandre vor 14 Jahren 0
@mcandre: Was würdest du unterscheiden? Gibt es eine Möglichkeit, den Inhalt der Vim-Auslagerungsdatei für einen Vergleich über diff zu extrahieren? Brian M. Hunt vor 14 Jahren 0
Sie würden die SWP-Datei und die Originaldateien unterscheiden und die entsprechenden SWP-Dateien entfernen. Siehe man diff (http://unixhelp.ed.ac.uk/CGI/man-cgi?diff). mcandre vor 14 Jahren 0
@mcandre: Der Inhalt der Auslagerungsdateien unterscheidet sich definitionsgemäß vom Inhalt der Datei. Auslagerungsdateien sind binäre Container, die dazu dienen, den Status von Vim aufrechtzuerhalten, und haben die folgende Art von Magie (für Vim 7.2): "b0VIM7.2 \ 0 \ 0 \ 0 \ 0 \ 0". Ein gerader Unterschied ist also sinnlos. Sie müssen den Status des Editors zum Zeitpunkt der letzten Auslagerungssynchronisierung extrahieren und mit der Datei vergleichen. Daher meine Frage: "Gibt es eine Möglichkeit, den Inhalt der Vim-Auslagerungsdatei für einen Vergleich über diff zu extrahieren?" Brian M. Hunt vor 14 Jahren 0
-1
ayaz

Wenn Sie die Dokumentation für die Funktion "Auslagerungsdatei" in Vim lesen, indem Sie den Befehl "Vim" ausführen, :help swapsollten Sie viel darüber erfahren, wie Vim die Erstellung von Auslagerungsdateien durchführt usw.

Während `: help swap` bei vielen Dingen helfen sollte, ist dies in diesem Fall nicht der Fall. Die "Learning Vi & Vim Editors" von Robbins et al. Wenn ja, hätte ich die Frage nicht posten müssen. ;) Brian M. Hunt vor 14 Jahren 0