Was ist der einfachste Weg, um Vim-Swap-Dateien zu löschen, von denen ich mich bereits erholt habe?

84

Manchmal stürzt Vim ab und hinterlässt eine Swap-Datei. Das ist großartig. Dann öffne ich die Datei, die ich gerade bearbeitete, und Vim fragt mich, ob ich sie wiederherstellen möchte. Ich mache, danke. Wenn es fertig ist, sagt Vim mir,

You may want to delete the .swp file now.

Warum, ja, ich tue es. Wie mache ich das? Ich dachte, es würde einfach anfangen, die alte Auslagerungsdatei wieder als Auslagerungsdatei zu verwenden und sie beim Beenden zu bereinigen, aber das stimmt nicht. Es erstellt eine neue Datei, räumt diese auf und fordert mich beim erneuten Öffnen der Datei erneut auf, die erste wiederherzustellen.

Ich vermisse sicher etwas.

Peeja
quelle
Siehe hier vi.stackexchange.com/questions/13518/… "Die Option" Löschen "wird nicht angezeigt, wenn der Vim-Prozess noch ausgeführt wird" und notieren Sie den Kommentar zu TMUX-Sitzungen, dh stellen Sie sicher, dass Vim noch nicht ausgeführt wird (auch GNU-Bildschirm) irgendwo im Hintergrund, siehe hier vi.stackexchange.com/questions/13518/…
zenaan

Antworten:

81

Ein etwas einfacherer Weg:

Vom Terminalemulator aus:

vim filename

Wählen Sie dann " Wiederherstellen" und wenn Sie den Swap löschen möchten, den Sie schreiben (speichern), tun Sie dies in vim:

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

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

Ich habe gerade davon erfahren, und ich denke, ich werde das von jetzt an tun. Dann überschreibe ich auch nicht versehentlich eine Arbeitsdatei, wenn die Wiederherstellung fehlerhaft verlaufen ist (obwohl ich das noch nie versucht habe).

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

miyalys
quelle
16
Ich habe keine deleteOption, es gibt nur: [O] pen (E) dit (R) ecover (Q) uit (A) bort, was soll ich tun?
Arne
4
@Arne: Aus meiner Erfahrung bedeutet das normalerweise, dass die Datei derzeit in einer anderen Instanz von vim geöffnet ist?
Miyalys
1
Die Option [D] elete wurde erst angezeigt, nachdem ich
Uhr
@Arne Ich hatte das gleiche Problem. Aber nach einiger Zeit, ungefähr einer Stunde, habe ich vim neu gestartet und die Option war verfügbar. Der PC wurde in dieser Zeit nicht neu gestartet. vim glaubt möglicherweise, dass ein anderer vim-prozess ausgeführt wird. Aus diesem Grund wird die Option nicht angezeigt.
Ka3ak
6
Für diejenigen, die sagen, dass sie keine (D)eleteOption sehen, siehe :help swap-exists; Zitat Zitat Zitat On Unix this choice is only offered when the process that created the swap file does not appear to be running.Vielleicht haben Sie einen anderen vim-Prozess, der dazu führt, dass diese Option ausgeblendet wird. Es könnte auch erklären, warum Sie überhaupt eine swpDatei haben !
Lqueryvg
39

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

Wenn Sie sicher sind, dass Sie keine vim-Auslagerungsdateien in einem Verzeichnisbaum benötigen und diese entfernen möchten, können Sie den folgenden Befehl im Verzeichnis verwenden, während vim nicht ausgeführt wird (auch nicht in einem anderen Fenster oder bei einem anderen Login) Session):

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

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

Dies könnte aus mehreren 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 der Endung .swp vorhanden ist, verwendet Vim die Erweiterung .swo für die neue und anschließend .swn. Ich denke, es geht einfach rückwärts durch das Alphabet. Also mit 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 unterbewertet sein.  Rubel schlägt vor

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

    das passt zu allen (Kleinbuchstaben-) Dreibuchstaben-Erweiterungen von .saabis .swp. Er fügt hinzu: „Seien Sie vorsichtig, obwohl dies eine vollständigere Lösung ist, werden alle .svg-Image-Dateien 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. Offensichtlich handelt es sich bei VIM-Auslagerungsdateien jedoch im Allgemeinen um Punktdateien. Wenn Sie bearbeiten hello.cpp, ist die Auslagerungsdatei möglicherweise .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
    
Shwaydogg
quelle
14

Geben Sie ein, in ls -adem ALLE Dateien im Verzeichnis aufgelistet sind

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

So einfach ist das.

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

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

Wolfy
quelle
4
Das ist allerdings nicht ganz einfach. Ich muss Vim verlassen, im Auslagerungsverzeichnis navigieren, mich an den Namen der Datei erinnern und möglicherweise entscheiden, ob dies der Fall ist file.swpoder nicht file.swo. Dann muss ich zurück, wo ich war. Schlagen :eist eine viel einfachere Lösung.
Peeja
1
ls: cannot access +A: No such file or directory
Jonathan
Das ist, was ich brauche
user5510975
7

Btw. 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 in das Fenster, in dem wir diese Datei bearbeiten.
  3. Wenn die Auslagerungsdatei älter als die Datei selbst ist, entfernen Sie sie einfach.
  4. Andernfalls öffnen Sie die Datei schreibgeschützt, damit wir sie anzeigen und speichern können.
toogley
quelle
6
Kann mir jemand sagen, warum vim ohne Plugins standardmäßig kein vernünftiges Verhalten haben kann?
Pavel Šimerda
6

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

Einfach speichern und beenden und dieselbe Datei erneut öffnen. Sie werden (erneut) aufgefordert mit

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

Drücken Sie jetzt einfach d:)

Avio
quelle
11
"Ja wirklich?" Ich meine, das wusste ich. Aber das ist doch blöd. Es ist sicherlich nicht "einfach".
Peeja
1
Was ist übrigens der Unterschied zwischen Beenden und Abbrechen?
Trusktr
5
In meinem Fall gibt es keine Löschoption. was soll ich machen? (Ich habe gespeichert, beendet und wieder geöffnet)
Paschalis
Sie müssen vim nicht zuerst beenden, sondern geben einfach Folgendes ein: e <return>, sobald Sie für die Datei "
Trotzdem
2

Vim ist, wie die meisten Unix-Befehle, einfach und explizit, nicht vorausgesetzt und implizit.

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

Sie können also (r) entdecken, (w) riten und (q) beenden, dann entweder erneut bearbeiten und (d) elete oder "rm .myfile.js.swp" auswählen und erneut bearbeiten. Dies ist schnell erledigt und aus Sicht von Vim immer zu 100% korrekt.

Oli Comber
quelle
Okay, gibt es dann eine Möglichkeit, vim dazu zu bringen, mir den Pfad zur Auslagerungsdatei zu geben? Ich möchte gerne einen zweiten Befehl ausführen, um die Auslagerungsdatei zu löschen (tatsächlich gefällt mir die Aussage dazu), aber ich möchte einen Befehl, um die Auslagerungsdatei zu löschen, wo immer sie ist. Zum Beispiel habe ich ein separates Swap-Verzeichnis. Wenn zwei geöffnete Dateien denselben Basisnamen haben, kann ich nicht programmgesteuert entscheiden, welches die richtige Auslagerungsdatei für den aktuellen Puffer ist.
Peeja
1
Stimmt, aber eine einfache Option "Wiederherstellen und Löschen" wäre schön. Es ist wahrscheinlich auch einfach zu implementieren. Ich mache es eines Tages, wenn ich fertig bin, wenn ich noch nicht fertig bin.
Trusktr
1
Die meisten Unix-Befehle sind einfach, explizit und haben ein vernünftiges Standardverhalten. Die Wiederherstellung von Vim ist nicht einfach, das UX ist genauso schlecht wie in LibreOffice, das Verhalten ist einfach falsch und das Ergebnis ist in vielen Fällen ein Datenverlust.
Pavel Šimerda
1

Diese Dateien waren auch für mich ärgerlich, aber ich habe die Option in .vimrc gesetzt set noswapfile , um zu verhindern, dass vim sie erstellt und stattdessen Dateien im Speicher hält.

Dmitrii
quelle
Laut OP sind Swap-Dateien nützlich, daher ist es möglicherweise nicht die beste Option, sie auszuschalten.
Kusalananda
Schalten Sie Swap-Dateien nicht aus. Wenn Ihre Maschine abstürzt, verlieren Sie Ihre Arbeit.
Lqueryvg
Natürlich ist diese Option mit Risiken verbunden, und wie ich weiß, wurden diese Auslagerungsdateien beim Erscheinen von vi * -Editoren erstellt, als es sehr oft zu Abstürzen kam. Jetzt könnte ich sagen, Vim arbeitet stabil und sie existieren als Legacy-Ding, imho.
Dmitrii
1

Hier ist ein vollständigerer regulärer Ausdruck, um alle vim-Auslagerungsdateien zu bereinigen, die auf Githubs eigener gitignore-Datei für Vim basieren

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

Beachten Sie jedoch, dass dies zwar eine umfassendere Lösung darstellt, jedoch alle .svg-Image-Dateien und .swf-Adobe-Flash-Dateien entfernt werden. Möglicherweise möchten Sie den regulären Ausdruck ändern, wenn Sie mit diesen Dateien arbeiten.

Rubel
quelle
1

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 man auf die missliche Lage stößt, kann man ausführen. :DeleteFileSwaps Dies ist großartig, wenn man sie mit :windooder :tabdoBefehlen kombiniert .

:tabdo DeleteFileSwaps 

Weitere Details : Eine Datei kann mehr als eine Auslagerungsdatei haben. Der Grund dafür ist, dass die Auslagerungsdatei mit der Erweiterung von .swpimmer noch vorhanden ist und vimdeswegen weiterhin neue erstellt. Um herauszufinden, ob es welche .swpgibt:

  • Führen Sie bei in vim geöffneter Zieldatei den Befehl aus, um :swdie aktuelle Auslagerungsdatei abzurufen.
  • Überprüfen Sie das Verzeichnis, in dem sich die aktuelle Auslagerungsdatei befindet.
  • Überprüfen Sie anschließend, ob das Verzeichnis eine Auslagerungsdatei mit dem Namen der geöffneten Datei und der Erweiterung "" enthält .swp.

Das obige Snippet folgt demselben Vorgang, entfernt jedoch alle Auslagerungsdateien.

Hoffe das hilft.

nate
quelle
0

Aus dem Handbuch :h swap:

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

JosephHarriott
quelle
Warnung ... das ist wahrscheinlich nicht der Name der zu löschenden Datei. Bis Sie die haben löschen .swpDatei, die :swwird wahrscheinlich Befehl geben Sie den Namen der .swoDatei - das ist nicht , was Sie löschen möchten.
Lqueryvg
0

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

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

Ein alternativer Weg, dies zu tun, ist:

Datei suchen / finden:

find | grep ".searchRefineVertTabs.jsp.swp"

und dann lösche diese Datei:

rm ./.searchRefineVertTabs.jsp.swp
Kaleem Ullah
quelle
1
Ich werde gefragt, aber ich möchte mich erholen . Die Frage ist, wie man es löscht, nachdem ich mich erholt habe, da es nicht mehr notwendig ist. Es scheint ein Versager zu sein, das nicht für mich zu tun. Die akzeptierte Antwort ist jedoch der sauberste Workflow, den ich bisher gefunden habe.
Peeja,
-1

Sie können verwenden,

rm -f .<filename>.<ext>.swp

Beispiel:

rm -f .rc.local.swp
RizonBarns
quelle
Das funktioniert technisch, ist aber bei der aktuell akzeptierten Antwort bei weitem nicht so einfach.
Peeja
Plus <ext>ist hier überflüssig, da ein Dateiname zumindest unter Linux keine oder mehrere Erweiterungen enthält.
Pavel Šimerda