Was ist der einfachste Weg, um Vim-Auslagerungsdateien zu löschen, aus denen ich bereits wiederhergestellt bin?

160796
Peeja

Manchmal stürzt Vim ab und hinterlässt mir eine Auslagerungsdatei. Das ist großartig. Dann öffne ich die Datei, die ich bearbeitet habe, und Vim fragt mich, ob ich wiederherstellen möchte. Danke Als es fertig ist, sagt Vim zu mir:

You may want to delete the .swp file now. 

Ja, das tue ich. Wie mache ich das? Ich dachte, es würde die alte Auslagerungsdatei einfach wieder als Auslagerungsdatei verwenden und beim Beenden aufräumen, aber das stimmt nicht. Es wird eine neue erstellt, diese bereinigt, und wenn ich die Datei erneut öffne, werden Sie aufgefordert, die erste Datei wiederherzustellen.

Sicher fehlt mir etwas.

67

12 Antworten auf die Frage

70
miyalys

Ein etwas einfacherer Weg:

Vom Terminal-Emulator:

vim filename 

Dann wählen Sie " Wiederherstellen" und wenn Sie den Swap löschen möchten, schreiben Sie (speichern), und führen Sie dies in vim aus:

:e // no argument needed. It assumes the current buffer. 

... und wählen Sie diese Zeit löschen .

Ich habe gerade herausgefunden, und ich denke, ich werde das von jetzt an tun. Dann werde ich auch nicht versehentlich eine Arbeitsdatei überschreiben, wenn sich die Wiederherstellung als beschädigt herausstellte (obwohl ich das noch nie probiert habe).

Zu dieser Frage gibt es auch relevante Tipps zum Stack Overflow (wo ich diesen Tipp gefunden habe).

Ich habe keine Löschoption, es gibt nur: [O] pen (E) dit (R) ecover (Q) uit (A) bort, was soll ich tun? Arne vor 8 Jahren 12
@ Arne: Aus meiner Erfahrung bedeutet das normalerweise, dass die Datei aktuell in einer anderen Instanz von vim geöffnet ist? miyalys vor 8 Jahren 3
Die Option [D] elete wurde erst nach einem Update auf Vim 7.4 angezeigt jmlarson vor 7 Jahren 1
@Arne Ich hatte das gleiche Problem. Aber nach einiger Zeit, etwa eine Stunde, habe ich vim neu gestartet und die Option war verfügbar. PC wurde zu dieser Zeit nicht neu gestartet. vim könnte denken, dass ein anderer vim-Prozess ausgeführt wird. Deshalb zeigt es die Option nicht. ka3ak vor 7 Jahren 0
Für diejenigen, die sagen, dass sie keine Option (D) elete sehen, siehe `: help swap-exists`; Zitat `Unter Unix wird diese Auswahl nur angeboten, wenn der Prozess, mit dem die Auslagerungsdatei erstellt wurde, scheinbar nicht ausgeführt wird.` Möglicherweise läuft auch ein anderer vim-Prozess, durch den diese Option ausgeblendet wird. Es könnte auch erklären, warum Sie überhaupt eine `swp'-Datei haben! Lqueryvg vor 6 Jahren 3
30
Shwaydogg

So entfernen Sie ALLE vim Swap-Dateien in einem Verzeichnis:

Wenn Sie sicher sind, dass Sie keine vim-Auslagerungsdateien in einer Verzeichnisstruktur benötigen und diese löschen möchten, können Sie den folgenden Befehl in dem Verzeichnis verwenden, während vim nicht ausgeführt wird (nicht einmal in einem anderen Fenster oder sogar einem anderen Login) Session):

find . -type f -name "*.sw[klmnop]" -delete 

Einige Anregungen und Gedanken kamen vom Entfernen von Junk-SWP-Dateien in Google Groups. Dadurch werden alle Dateien, deren Namen mit löschen .swk, .swl, .swm, .swn, .swo, oder .swp im aktuellen Verzeichnisbaum.

Dies kann aus verschiedenen Gründen nicht das sein, was Sie wollen:

  • Wie bereits erwähnt, sucht es das aktuelle Verzeichnis Baum ; dh das aktuelle Verzeichnis und alle Unterverzeichnisse rekursiv. Das geht über das hinaus, was die Frage verlangt, und kann als übertrieben angesehen werden.
  • Wie bereits erwähnt, werden alle Dateien, deren Namen am Ende mit löschen .swk, .swl, .swm, .swn, .swo, oder .swpund nicht nur .swpGary Johnson sagt :

    Außerdem enden nicht alle Auslagerungsdateien mit .swp. Wenn Vim eine Auslagerungsdatei erstellen muss und bereits eine mit .swp endet, verwendet Vim die Erweiterung .swo für die neue und anschließend .swn. Ich denke, es geht nur rückwärts durch das Alphabet. So etwas wie

     \*.sw[nop] 

    oder auch

     \*.sw? 

    wäre gründlicher.

    Der ursprüngliche Autor dieses Beitrags sagt:

    'klmnop' mag übertrieben sein, aber das stellt normalerweise sicher, dass ich alle bekomme.

  • Auf der anderen Seite könnte es zu Underkill werden.  Rubel schlägt vor

    find . -type f \( -name ".*.s[a-v][a-z]" -o -name ".*.sw[a-p]" \) -delete 

    was zu allen (Kleinbuchstaben) Erweiterungen mit drei Buchstaben von .saabis passt .swp. Er fügt hinzu: „Seien Sie vorsichtig, obwohl dies eine vollständigere Lösung ist, werden alle .svg-Bilddateien und .swf-Adobe-Flash-Dateien entfernt. Möglicherweise möchten Sie die Regex ändern, wenn Sie mit diesen Dateien arbeiten.“Es passt auch .sav, .snd(Tondaten) .sql, .src, .srt(SubRip Video Untertitel - Format), und viele andere gemeinsame Erweiterungen.

  • Es könnte übertrieben sein. Wie bereits erwähnt, werden alle Dateien, deren Namen mit löschen .swk, .swl, .swm, .swn, .swo, oder .swp. Anscheinend handelt es sich bei vim-Auslagerungsdateien im Allgemeinen um Punktdateien. Wenn Sie bearbeiten hello.cpp, kann es sich bei der Auslagerungsdatei handeln .hello.cpp.swp. Wie in der Antwort von rouble gezeigt (aber nicht erklärt), ist es sicherer, nur Dateien zu löschen, deren Namen mit einem Punkt beginnen. zB mit

    find . -type f -name ".*.sw[klmnop]" -delete 
13
Wolfy

Geben Sie ein ls -a, um ALLE Dateien im Verzeichnis anzuzeigen

Typ rm .whatever.your.swpist und drücken Sieenter

So einfach ist das.

Jede Datei, die .vorne angezeigt wird, ist eine versteckte Datei und wird normalerweise nicht angezeigt.

Denken Sie daran, dass die Änderungen sofort und dauerhaft sind. Seien Sie also vorsichtig.

Das ist jedoch nicht sehr einfach. Ich muss Vim verlassen, im Auslagerungsverzeichnis navigieren, mich an den Namen der Datei erinnern und möglicherweise entscheiden, ob es `file.swp` oder` file.swo` ist. Dann muss ich dorthin zurückkehren, wo ich war. Das Schlagen von `: e` ist eine viel einfachere Lösung. Peeja vor 10 Jahren 2
ls: kann nicht auf + A zugreifen: Keine solche Datei oder Verzeichnis Jonathan vor 8 Jahren 1
Das ist das, was ich benötige user5510975 vor 5 Jahren 0
6
toogley

Übrigens Einige Plugins erledigen das automatisch für Sie: autoswap.vim

aus der Beschreibung:

  1. Ist die Datei bereits in einer anderen Vim-Sitzung in einem anderen Fenster geöffnet?
  2. Wenn ja, wechseln Sie zu dem Fenster, in dem wir diese Datei bearbeiten.
  3. Wenn die Auslagerungsdatei älter ist als die Datei selbst, entfernen Sie sie einfach.
  4. Andernfalls öffnen Sie die Datei schreibgeschützt, damit wir sie sehen und speichern können.
Kann mir jemand sagen, warum vim ohne Plugins standardmäßig kein vernünftiges Verhalten haben kann? Pavel Šimerda vor 6 Jahren 3
5
Avio

Nein, AFAIK du vermisst nichts. Vimbehält die Auslagerungsdatei weiterhin als Sicherung bei, bis Sie sie explizit löschen.

Speichern und beenden Sie dieselbe Datei erneut und öffnen Sie sie erneut. Sie werden (erneut) mit aufgefordert

[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it 

Jetzt einfach drücken d:)

"Ja wirklich?" Ich meine, das wusste ich. Aber das ist blöd. Es ist sicherlich nicht "einfach". Peeja vor 11 Jahren 11
Was ist der Unterschied zwischen Aufhören und Abbruch? trusktr vor 10 Jahren 1
In meinem Fall gibt es keine Option zum Löschen. was soll ich machen? (Ich habe gespeichert, gekündigt und wieder geöffnet) Paschalis vor 9 Jahren 5
Sie müssen vim nicht zuerst beenden, sondern geben Folgendes ein: e Sobald Sie "Bearbeiten" oder "Wiederherstellen" für die Datei gewählt haben, erhalten Sie die Option, sie zu löschen 00prometheus vor 6 Jahren 0
1
Oli Comber

Vim ist, wie die meisten Unix-Befehle, einfach und explizit, anstatt anzunehmen und implizit.

Du erholst dich mit (r). Wenn Sie die Wiederherstellung nicht mögen oder die Wiederherstellung beschädigt ist, können Sie sie verwerfen. Wenn Sie es mögen, können Sie die Datei speichern. Die Wiederherstellungsdatei wird für Sie nicht gelöscht, da dies nicht explizit ist und in 100% der Fälle nicht korrekt ist.

Sie müssen also (r) ecover, (w) rite und (q) uit, dann noch einmal bearbeiten und (d) elete oder "rm .myfile.js.swp" wählen und erneut bearbeiten. Dies ist schnell und ist aus Sicht von Vim immer 100% korrektes Verhalten.

Okay, gibt es einen Weg, um vim dazu zu bringen, mir den Pfad zur Auslagerungsdatei zu geben? Ich bin froh, einen zweiten Befehl ausführen zu können, um die Auslagerungsdatei zu löschen (in der Tat mag ich die explizite Aussage davon), aber ich hätte gerne einen Befehl, um die Auslagerungsdatei zu löschen, wo immer sie ist. Ich habe zum Beispiel ein separates Verzeichnis für die Auslagerungsdatei. Wenn zwei geöffnete Dateien denselben Basisnamen haben, kann ich nicht programmgesteuert entscheiden, welche die richtige Auslagerungsdatei für den aktuellen Puffer ist. Peeja vor 10 Jahren 0
Richtig, aber eine einfache "Wiederherstellen und Löschen" -Option wäre schön. Es ist wahrscheinlich auch leicht zu implementieren. Ich mache es eines Tages, wenn ich mit der Schule fertig bin, falls es noch nicht geschehen ist. trusktr vor 10 Jahren 1
Die meisten Unix-Befehle sind einfach, explizit und weisen ein vernünftiges Standardverhalten auf. Vim Recovery ist nicht einfach, die UX ist genauso schlecht wie in LibreOffice, das Verhalten ist eindeutig falsch und das Ergebnis ist in vielen Fällen ein Datenverlust. Pavel Šimerda vor 6 Jahren 1
1
rouble

Hier ist eine umfassendere Regex, um alle vim-Auslagerungsdateien basierend auf der von Github erstellten gitignore-Datei für Vim zu bereinigen

$ find ./ -type f \( -name "\.*\.s[a-v][a-z]" -o -name "\.*\.sw[a-p]" \) -delete 

Seien Sie jedoch vorsichtig, da dies eine vollständigere Lösung ist, werden alle .svg-Bilddateien und .swf-Adobe-Flash-Dateien entfernt. Sie können die Regex ändern, wenn Sie mit diesen Dateien arbeiten.

1
nate

Hier ist ein Ausschnitt zum Hinzufügen .vimrc. Es löscht alle Auslagerungsdateien, die dem aktuellen Dateipuffer zugeordnet sind, und setzt die Auslagerungserweiterung zurück.

function! DeleteFileSwaps() write let l:output = '' redir => l:output  silent exec ':sw'  redir END  let l:current_swap_file = substitute(l:output, '\n', '', '') let l:base = substitute(l:current_swap_file, '\v\.\w+$', '', '') let l:swap_files = split(glob(l:base.'\.s*')) " delete all except the current swap file for l:swap_file in l:swap_files if !empty(glob(l:swap_file)) && l:swap_file != l:current_swap_file  call delete(l:swap_file) echo "swap file removed: ".l:swap_file endif endfor " Reset swap file extension to `.swp`. set swf! | set swf! echo "Reset swap file extension for file: ".expand('%') endfunction command! DeleteFileSwaps :call DeleteFileSwaps() 

Sobald Begegnung mit dem Dilemma kann man ausführt :DeleteFileSwaps Das ist großartig, wenn mit kombinieren :windooder :tabdoBefehlen.

:tabdo DeleteFileSwaps 

Weitere Details : Eine Datei kann mehr als eine Auslagerungsdatei haben. Der Grund dafür ist, dass die Auslagerungsdatei mit der Erweiterung von .swpnoch vorhanden ist und deshalb vimständig neue erstellt. Um herauszufinden, ob es .swpgibt:

  • Wenn die Zieldatei in vim geöffnet ist, führen Sie sie aus :sw, um die aktuelle Auslagerungsdatei abzurufen.
  • Überprüfen Sie das Verzeichnis, in dem sich die aktuelle Auslagerungsdatei befindet.
  • Prüfen Sie dann, ob das Verzeichnis eine Auslagerungsdatei mit dem Namen der geöffneten Datei enthält und die Erweiterung hat .swp.

Das obige Snippet folgt dem gleichen Vorgang, entfernt jedoch alle Auslagerungsdateien.

Hoffe das hilft.

0
JosephHarriott

Aus dem Handbuch :h swap:

Sie können den Namen der aktuellen Auslagerungsdatei sehen, die mit dem Befehl verwendet wird: :sw[apname]

Achtung ... das ist wahrscheinlich nicht der Name der Datei, die Sie löschen müssen. Bis Sie die `.swp`-Datei löschen, wird Ihnen der Befehl`: sw` wahrscheinlich den Namen der `.swo`-Datei geben - was nicht * Sie * löschen möchten. Lqueryvg vor 6 Jahren 0
0
Kaleem Ullah

Wenn Sie gefragt werden, drücken Sie D, um die Auslagerungsdatei der aktuellen Datei zu löschen.

Wenn Sie nicht sind, müssen Sie es manuell tun.

Eine Alternative dazu ist:

Datei suchen / suchen:

find | grep ".searchRefineVertTabs.jsp.swp" 

und dann diese Datei löschen:

rm ./.searchRefineVertTabs.jsp.swp 
Ich werde gefragt, aber ich habe die Wahl, mich zu erholen. Die Frage ist, wie man es löschen kann * nachdem * ich mich erholt habe, da es nicht mehr nötig ist. Es scheint ein Versagen von vim zu sein, das nicht für mich zu tun. Die akzeptierte Antwort ist jedoch der sauberste Workflow, den ich bisher gefunden habe. Peeja vor 8 Jahren 1