Wie kann ich die lästigen Warnungen beseitigen, 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:
Diese Meldung ist eigentlich ziemlich wichtig, wenn Sie möchten, dass kein Text verloren geht, den Sie möglicherweise nicht gespeichert haben. Es sollte nicht ärgerlich sein und nicht dazu führen, dass Sie die Auslagerungsdatei hastig löschen oder vim
so konfigurieren, dass sie ohne sie ausgeführt wird.
Jede Datei, die Sie mit vim
bearbeiten, verfügt über eine entsprechende Auslagerungsdatei , während Sie bearbeiten, mit der vim
Änderungen protokolliert. Wenn Sie die Bearbeitung einer Datei beenden, verwirft vim
die entsprechende Auslagerungsdatei automatisch. 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.
Die beiden in der Meldung (E325: ATTENTION Found a swap file
) dargestellten Szenarien sind tatsächlich recht häufig: (1) Entweder bearbeitet ein anderes vim
-Programm dieselbe Datei, die Sie versuchen zu bearbeiten (es könnte tatsächlich eine andere Person sein - in diesem Fall wäre es wirklich nicht sinnvoll, die Auslagerungsdatei einfach blind zu löschen - oder es könnten Sie in einem anderen Terminalfenster sein oder tab), oder (2) eine vorherige Sitzung mit vim
ist abgestürzt (am häufigsten passiert dies, wenn Sie eine Remote-Bearbeitung durchführen und die Netzwerksitzung getrennt wird) In diesem Fall wurde die vim-Sitzung nicht normal beendet und die Datei .swp
bleibt zurück. Ein weiteres Beispiel für dieses zweite Szenario besteht darin, dass Sie versehentlich das Terminalfenster oder die Registerkarte geschlossen haben, in der/der eine vim
-Sitzung aktiv oder im Hintergrund war.
Wenn ich auf diese Meldung stoße, überlege ich zuerst, ob ich diese Datei in einem anderen Terminalfenster oder einer anderen Registerkarte bearbeite, da ich normalerweise mit mehreren Terminalfenstern mit jeweils mehreren Registerkarten arbeite:
Wenn ich feststelle, dass ich an einem anderen Ort bearbeite und zu diesem zurückkehren kann , drücke ich die Taste q
, um (Q)uit
für diese zusätzliche Sitzung zu erhalten, und kehre über die ursprüngliche Sitzung vim
zur Bearbeitung zurück .
Manchmal, wenn ich nicht ganz sicher bin, (Q)uit
und dann jobs
ausführen, um zu überprüfen, ob ich vim
in genau demselben Terminal ausführe; Wenn nichts angezeigt wird, führe ich ps -ef | grep vim
aus, um zu überprüfen, ob ich vim
an einer anderen Stelle ausführe (d. h. in einem anderen Terminalfenster oder einer anderen Registerkarte). Der Punkt ist, ich versuche immer, die Bearbeitung über die ursprüngliche Sitzung vim
fortzusetzen.
Wenn ich sicher bin, dass ich nicht zur ursprünglichen Editiersitzung zurückkehren kann und immer noch die folgenden Optionen zur Verfügung stehen, drücke ich r
bis (R)ecover
.
Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
Wenn Sie r
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 mich an der Shell-Eingabeaufforderung befinde, führe ich vim
mit der Option -r
wie folgt aus:
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 in beiden Fällen ENTER
, 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 abgestürzt ist und Teile der Originaldatei nicht gespeichert wurden.
Das heißt, ich habe diese ???
-Marken noch nie gesehen, daher muss dies ein wirklich seltenes Vorkommen 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 die Sitzung mit vim
:
:q!
Vergleichen Sie als Nächstes die beiden Dateien:
diff notes notes2
Wenn der diff
nichts zurückgibt , bedeutet dies, dass es keinen Unterschied gibt und es sicher ist, sowohl die Auslagerungsdatei als auch die zweite Datei zu entfernen:
rm .notes.swp notes2
Öffnen Sie zu diesem Zeitpunkt die Originaldatei und fahren Sie fort, als ob noch nie ein Problem aufgetreten wäre:
vim notes
Wenn der diff
etwas zurückgibt , bedeutet dies, dass die ursprüngliche Datei (über die Auslagerungsdatei) Änderungen hatte, die dank der Wiederherstellung in der Sekunde gespeichert wurden Datei.
Da diese Änderungen in der zweiten Datei erfasst werden, können Sie die Auslagerungsdatei sicher löschen und die ursprüngliche Datei mit der zweiten Datei überschreiben:
rm .notes.swp
remove .notes.swp? y
mv notes2 notes
overwrite notes? (y/n [n]) y
Öffnen Sie zu diesem Zeitpunkt 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.
Die eingefügte Nachricht weist darauf hin, dass Sie die "Notizen" -Datei 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 Botschaft 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 fest entschlossen sind, Vim keine .swp-Dateien erstellen zu lassen, um Abstürze und andere Probleme zu beheben, können Sie "set noswapfile
" in ~/.vimrc
einfügen.
Sie können -n verwenden, um vim zu öffnen , ohne eine Auslagerungsdatei zu verwenden :
Um dies die ganze Zeit zu tun, setzen Sie einfach
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
vim entfernt die generierte .swp-Datei, wenn Sie sie ordnungsgemäß beenden.
Wie kann ich die lästigen Warnungen beseitigen, wenn ich eine Datei öffne, die eine .swp-Datei enthält?
Verwenden Sie die Option für Kurznachrichten in Ihrem ~/.vimrc
:
set shortmess=A
Dies ist auch die Standardeinstellung beim Ausführen des POSIX-Modus.
Tun Sie dies jedoch nicht : Es ist wie das Entfernen der Airbags Ihres Autos, um die Kraftstoffeffizienz zu erhöhen. Auf lange Sicht verbringen Sie mehr Zeit damit, sich zu erholen, als jemals zuvor, wenn Sie die Frage beantwortet haben.
Dies passierte mir, als mein Terminal unerwartet meine Verbindung mit vi open schloss.
Zum Glück hatte ich keine Änderungen verloren.
Um diese Warnung zu entfernen und den Swap zu verwerfen:
process ID: 2251 (still running)
. In diesem Fall ist es 2251ps 2251
kill 2251
Und das ist es.
Denken Sie daran, dass Auslagerungsdateien dazu dienen, Sie zu schützen, und Sie sollten sie nicht vollständig deaktivieren.