Wie werden die Warnungen beim Öffnen einer Datei mit der Erweiterung .swp beseitigt?

46

Wie kann ich die nervigen Warnungen loswerden, wenn ich eine Datei öffne, die eine .swp-Datei enthält? Oder wie erstelle ich überhaupt keine .swp-Dateien? Beispiel Warnung:

E325: ATTENTION
Found a swap file by the name ".notes.swp"
          owned by: james   dated: Fri Dec  3 17:38:07 2010
         file name: ~james/school/se/project-dir/rottencucumber/doc/notes
          modified: no
         user name: james   host name: james-laptop
        process ID: 2251 (still running)
While opening file "notes"
             dated: Fri Dec  3 18:46:10 2010
      NEWER than swap file!

(1) Another program may be editing the same file.
    If this is the case, be careful not to end up with two
    different instances of the same file when making changes.
    Quit, or continue with caution.

(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r notes"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".notes.swp"
    to avoid this message.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
James
quelle

Antworten:

44

Diese Meldung ist eigentlich ziemlich wichtig, wenn Sie darauf bedacht sind, keinen Text zu verlieren, den Sie möglicherweise nicht gespeichert haben. Es sollte nicht als ärgerlich angesehen werden und Sie sollten die Auslagerungsdatei nicht hastig löschen oder so konfigurieren vim, dass sie ohne sie ausgeführt wird.

Jede Datei, mit der Sie bearbeiten , verfügt während der Bearbeitungvim über eine entsprechende Auslagerungsdatei , mit der Sie Änderungen nachverfolgen können. Wenn Sie die Bearbeitung einer Datei beenden, wird die entsprechende Auslagerungsdatei automatisch verworfen. Das Vorhandensein einer Auslagerungsdatei und Ihr Versuch, über die ursprüngliche Datei zu schreiben, sollten daher Anlass zur Überlegung und zu geeigneten Maßnahmen geben.vimvim

Die beiden in der Meldung ( E325: ATTENTION Found a swap file) dargestellten Szenarien sind tatsächlich recht häufig: (1) Entweder vimbearbeitet ein anderes Programm dieselbe Datei, die Sie gerade bearbeiten möchten (es könnte sich tatsächlich um eine andere Person handeln - in diesem Fall ist dies wirklich nicht sinnvoll um die Auslagerungsdatei einfach blind zu löschen (oder Sie könnten sich in einem anderen Terminalfenster oder einer anderen Registerkarte befinden), oder (2) eine vorherige vimSitzung ist abgestürzt (am häufigsten passiert dies, wenn Sie eine Remote-Bearbeitung durchführen und die Netzwerksitzung getrennt wird) Wenn die vim-Sitzung nicht normal beendet wurde und die .swpDatei zurückbleibt, besteht ein weiteres Beispiel für dieses zweite Szenario darin, dass Sie versehentlich das Terminalfenster oder die Registerkarte geschlossen haben, in der eine vimSitzung aktiv oder im Hintergrund ausgeführt wurde .

Wenn ich auf diese Meldung stoße, denke ich zuerst darüber nach, ob ich diese Datei in einem anderen Terminalfenster oder einer anderen Registerkarte bearbeite, da ich normalerweise mit mehreren Terminalfenstern mit jeweils mehreren Registerkarten arbeite:

Bildbeschreibung hier eingeben

Wenn ich feststelle, dass ich an einem anderen Ort bearbeite und zurückkehren kann , drücke ich die qTaste für (Q)uitdiese zusätzliche Sitzung und kehre über die ursprüngliche vimSitzung zur Bearbeitung zurück .

Manchmal, wenn ich mir nicht ganz sicher bin, starte ich (Q)uitund jobsstarte dann, um zu überprüfen, ob ich auf vimdemselben Terminal starte. Wenn sich nichts ergibt, starte ich, um ps -ef | grep vimzu prüfen, ob ich an einer vimanderen Stelle (z. B. in einem anderen Terminalfenster oder einer anderen Registerkarte) aktiv bin . Der Punkt ist, ich versuche immer, die Bearbeitung über die ursprüngliche vimSitzung fortzusetzen.


Wenn ich sicher bin, dass ich nicht zur ursprünglichen Bearbeitungssitzung zurückkehren kann und immer noch die folgenden Optionen angezeigt werden, drücke ich rauf (R)ecover.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

Wenn rSie auf drücken , wird eine Nachricht wie die folgende angezeigt:

Swap file ".notes.swp" already exists!
"notes" 18L, 46C
Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

Wenn ich andererseits nicht mehr mit diesen Optionen konfrontiert bin, weil ich an der Shell-Eingabeaufforderung bin, dann starte ich vimmit der -rOption wie folgt:

vim -r notes

Die resultierende Nachricht wird ähnlich sein:

Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

Drücken Sie ENTERin beiden Fällen, um fortzufahren, und Ihre Datei wird angezeigt.

Hinweis: Wenn Vim Zweifel daran hat, was es gefunden hat, wird eine Fehlermeldung ausgegeben und Zeilen mit "???" im Text. Wenn beim Wiederherstellen eine Fehlermeldung angezeigt wird, suchen Sie in der Datei nach "???" um zu sehen, was los ist. Möglicherweise möchten Sie Ausschneiden und Einfügen, um den gewünschten Text zu erhalten.

Die häufigste Bemerkung ist "??? LINES MISSING". Dies bedeutet, dass Vim den Text aus der Originaldatei nicht lesen kann. Dies kann passieren, wenn das System abstürzt und Teile der Originaldatei nicht gespeichert wurden.

Das heißt, ich habe diese ???Zeichen noch nie gesehen , also muss dies ein wirklich seltenes Ereignis sein.


Speichern Sie als nächstes den Inhalt in einer anderen Datei (normalerweise füge ich einfach "2" an das Ende des ursprünglichen Dateinamens an):

:w notes2

Beenden Sie als Nächstes diese vimSitzung:

:q!

Vergleichen Sie als Nächstes die beiden Dateien:

diff notes notes2

Wenn das diffnichts zurückgibt , gibt es keinen Unterschied und es ist sicher, sowohl die Auslagerungsdatei als auch die zweite Datei zu entfernen:

rm .notes.swp notes2

Öffnen Sie an dieser Stelle die Originaldatei und fahren Sie fort, als ob noch nie ein Problem aufgetreten wäre:

vim notes

Wenn diffetwas zurückgegeben wird, bedeutet dies, dass die ursprüngliche Datei (über die Auslagerungsdatei) Änderungen aufwies, die dank der Wiederherstellung in der zweiten Datei gespeichert wurden.

Da diese Änderungen in der zweiten Datei erfasst werden, können Sie die Auslagerungsdatei sicher löschen und die Originaldatei mit der zweiten Datei überschreiben:

rm .notes.swp
remove .notes.swp? y

mv notes2 notes
overwrite notes? (y/n [n]) y

Öffnen Sie an dieser Stelle die Originaldatei und fahren Sie fort, als ob noch nie ein Problem aufgetreten wäre:

vim notes

Dies scheint eine Menge Arbeit zu sein, aber sobald Sie sich an den Workflow gewöhnt haben, dauert es maximal 20 Sekunden.

user664833
quelle
2
Kann nicht glauben, dass dies nicht die akzeptierte Antwort ist. Es ist perfekt. +1
David
so viel besser als angenommene Antwort. Ich wünschte, wir hätten einen Weg, dies zu ändern!
Michael Durrant
1
Es ist nicht immer so, dass die Nachricht nützlich ist. Wenn ich eine Datei bearbeite, ist es mir wichtig, ob sich die Datei seit dem Beginn der Bearbeitung geändert hat. Im Moment versuche ich, sie zu speichern , und nicht, ob ich sie auch in einem anderen vim-Fenster bearbeite. Es ist für mich völlig in Ordnung, eine Datei in zwei Terminals zu öffnen, solange sich die in der Datei gespeicherten Daten nicht überlappen. Vim muss mich nur wirklich nörgeln, wenn ich versuche zu speichern, nicht, wenn ich es öffne.
Ken Simon
Leider beantwortet dies nicht die Frage, es heißt nur, dass ich den Nörgelbildschirm nicht ignorieren soll. Mein Szenario ist, dass ich die Datei bereits in vim geöffnet habe (zum Bearbeiten, vielleicht), verschiedene Teile der Datei gleichzeitig nebeneinander sehen möchte und keine geteilten Puffer haben möchte, da clang_complete die Größe der Puffer ständig ändert . In diesem Fall möchte ich eigentlich wissen, wie man eine Datei schreibgeschützt in Vim öffnet und die Auslagerungsdatei ignoriert.
Lelanthran
@Lelanthranvim -n file_name
user664833
19

Die eingefügte Nachricht weist darauf hin, dass Sie die Datei "notes" noch in einer anderen Vim-Sitzung geöffnet haben. Es ist definitiv keine gute Idee, eine Datei zu bearbeiten, die an anderer Stelle bearbeitet wird.

Wenn diese Nachricht falsch ist, müssen Sie feststellen, wie Ihre Vim-Sitzung nicht ordnungsgemäß beendet wurde, und dies in Zukunft vermeiden.

Die Wiederherstellung kann in diesem Fall problematisch sein, da "notes" neuer ist als die zugehörige Vim .swp-Datei, Sie können es jedoch trotzdem versuchen. Stellen Sie einfach sicher, dass Sie zuerst Ihre "Notizen" -Datei an einen Sicherungsort kopieren.

Es wäre eine gute Idee, " :help recover.txt" durchzulesen.

Die Lehre hier ist, dass Sie diese Nachricht nicht sehen sollen und dass Sie bedeuten, dass etwas irgendwo falsch gelaufen ist. Es ist (wahrscheinlich) nicht die Schuld von Vim.

Wenn Sie zu diesem Zeitpunkt immer noch absolut fest entschlossen sind, Vim keine .swp-Dateien erstellen zu lassen, damit Sie sich von Abstürzen und anderen verwandten Problemen " set noswapfile" erholen können, geben Sie möglicherweise Folgendes ein ~/.vimrc.

Heptit
quelle
1
ACHTUNG! Ich habe fast meine ganze Arbeit mit VIM verloren. Kopieren Sie Ihren Code, bevor Sie etwas versuchen.
Squirrl
Ich empfehle den Lesern nachdrücklich, die Antwort von user664833 zu lesen ( Diese Nachricht ist eigentlich ziemlich wichtig ... ), da sie meiner Meinung nach viel bessere Informationen und Ratschläge gibt, als diese Antwort imho
Michael Durrant
11

Sie können -n verwenden, um vim zu öffnen, ohne eine Auslagerungsdatei zu verwenden :

Um dies die ganze Zeit zu tun, einfach setzen

alias vim='vim -n' 

in Ihrer .bashrc- oder .bash_aliases-Datei

Wenn Sie vim jemals ohne die Option -n ausführen müssen, führen Sie es einfach aus

\vim
Brad Parks
quelle
3
Ich würde nicht empfehlen, immer ohne Swap-Datei zu laufen, aber "-n" ist genau das, was ich brauchte. Normalerweise verwende ich eine Auslagerungsdatei. Wenn ich Vim jedoch als Diff-Tool verwende, möchte ich in der Lage sein, Diffs von Dateien, die ich bearbeite, anzuzeigen, ohne dass mir diese Diffs diese Meldung geben oder meine Auslagerungsdatei beeinträchtigen.
Agentlien
1
Diese Antwort gefällt mir - sie ist kurz, genau und beantwortet die eigentliche Frage!
Lelanthran
2

vim entfernt die generierte .swp-Datei, wenn Sie sie ordnungsgemäß beenden.

Ignacio Vazquez-Abrams
quelle
1

Wie kann ich die nervigen Warnungen loswerden, wenn ich eine Datei öffne, die eine .swp-Datei enthält?

Verwenden Sie die Option für Kurznachrichten in ~/.vimrc:

set shortmess=A

Dies ist auch die Standardeinstellung beim Ausführen des POSIX-Modus.

Allerdings tun dies nicht : es ist wie Ihr Auto Airbags Entfernen der Kraftstoffeffizienz zu erhöhen. Auf lange Sicht verbringen Sie mehr Zeit damit, sich zu erholen, als jemals zuvor, um die Frage zu beantworten.

Bischof
quelle
1
Unter der Annahme eines Einzelbenutzersystems ist eine Konfiguration nicht so schlimm. Ich habe gerne viele Terminal-Registerkarten geöffnet, und manchmal möchte ich eine Datei bearbeiten, die ich bereits in einer anderen Registerkarte vergraben habe. Wenn ich ein paar schnelle Änderungen vornehmen möchte, ist das in Ordnung. Wenn ich mich selbst wieder in den anderen vim Fenstern finden, ist die Schönheit , dass es mich warnen würde dann , dass die Datei , bevor ich spart sie sich geändert hat, und ich kann schnell tun , :eum zu sehen , was (auch schnell passiert ist urückgängig zu machen auf dem, was Ich hatte im Puffer.) Ich mag das viel besser, als mich darüber zu ärgern, dass ich bereits eine Datei geöffnet habe.
Ken Simon
1

Dies passierte mir, als mein Terminal unerwartet meine Verbindung mit vi open schloss.

Zum Glück hatte ich keine Änderungen verloren.

So entfernen Sie diese Warnung und verwerfen den Swap:

  1. Suchen Sie die Prozess-ID, die angezeigt process ID: 2251 (still running)wird. In diesem Fall ist es 2251
  2. Stellen Sie sicher, dass Sie die richtige ID habenps 2251
  3. Beenden Sie den Vorgang mitkill 2251

Und das ist es.

Denken Sie daran, dass Auslagerungsdateien dazu dienen, Sie zu schützen, und dass Sie sie nicht vollständig deaktivieren sollten.

kintsukuroi
quelle
Aber was ist, wenn es keinen vi(m)Prozess gibt?
Scott
-2

Ich habe dieses Problem in drei einfachen Schritten gelöst:

1 :) Führen Sie "ls -la" aus, wo die Datei vorhanden ist, damit Sie die .swp-Datei für dieselbe anzeigen können.

2 :) Jetzt "rm -i * .swp" dh die ".swp" -Datei aus dem Verzeichnis entfernen.

3 :) Bestätigen Sie nun, ob die ".swp" -Datei entfernt wurde.

4 :) Nun viel Spaß mit diesen Warnungen.

Ankur Srivastava
quelle
3
Warum in aller Welt würden Sie vorschlagen rm -rf, eine Datei zu entfernen? Ich ersetzte -rfmit einem vernünftigeren-i
Nifle