Wie erkenne ich, ob SWP-Dateien nicht gespeicherte Änderungen enthalten?

11

Wenn ich den Quellcode mit gvim (v.7.4.488) bearbeite, möchte ich einige Änderungen an den vcs vornehmen (ich verwende git 2.1.4 über die Befehlszeile unter Ubuntu Linux).

git --status

zeigt, welche Dateien ich geändert habe. Es wird jedoch auch die vim .*.swpder aktuell sichtbaren Puffer .*.swpangezeigt (sowohl wenn die Datei nicht gespeicherte Änderungen enthält als auch wenn die bearbeitete Datei mit der -file identisch ist). Natürlich kann git diese Dateien ignorieren oder vim kann die Auslagerungsdateien an einem anderen Ort speichern (siehe vim.wikia oder diese Frage bei stackoverflow ). Aber ich mag .*.swpes, git --statuswenn die -files angezeigt werden, wenn sie nicht gespeicherte Änderungen enthalten, da sie mir signalisieren, dass ich Dateien in einem anderen Zustand festschreibe als dem, in dem sie sich befinden.

Wie kann ich vermeiden, dass Fehlalarme von .*.swp-files angezeigt werden, git --statuswenn die gespeicherte Datei mit der .*.swp-file identisch ist, während die festzuschreibende Datei in einem anderen Zustand ist als die, die ich mit vim bearbeite?

  • Ist es möglich, nur .*.swp-files zu haben , wenn Datei auf Festplatte und Datei in vim unterschiedlich sind?
  • Gibt es eine andere Möglichkeit, nicht gespeicherte Dateien zu erkennen?

Das Kombinieren der Kommentare von @elyashiv und @VanLaser führt zu einer einfacheren Methode als das Erkennen, ob Auslagerungsdateien nicht gespeicherte Dateien implizieren:

  1. lass git die. *. sw [po] -Dateien nicht ignorieren;
  2. wenn zu begehen, wenn git --statusoffenbart alle .*.sw[po]-Dateien tun ein :wain vi; und,
  3. hinzufügen und festschreiben.
Kasper van den Berg
quelle
1
Sie können :wadamit sicherstellen, dass keine nicht gespeicherten Dateien vorhanden sind.
Elyashiv
2
Es ist wirklich viel "vernünftiger", sicherzustellen, dass alle Ihre Dateien vor Ihnen gespeichert werden git commit...
VanLaser

Antworten:

8

vim -rIn der Befehlszeile werden alle Auslagerungsdateien im aktuellen Verzeichnis und in den temporären Verzeichnissen aufgelistet und ob sie nicht gespeicherte Änderungen enthalten. Suchen Sie nach der Zeile, die sagt modified: no/YES.

Ich weiß nicht, wie ich Vim anweisen soll, in einem anderen Verzeichnis zu suchen, daher müssen Sie zu jedem Verzeichnis wechseln, das eine Auslagerungsdatei enthält, und ausführen vim -r. Sie könnten ein Skript erstellen, das die Ausgabe von analysiert git statusoder verwendet find -name '.*.sw[po]'und dann vim -rin jedem Verzeichnis ausgeführt wird, um alle Auslagerungsdateien mit nicht gespeicherten Änderungen anzuzeigen.

(Ich verwende .*.sw[po]stattdessen .*.swp, weil manchmal .swoDateien zusätzlich zu .swpDateien erstellt werden, wenn Sie eine Datei bearbeiten, die bereits eine Auslagerungsdatei enthält. .swnDateien können auch erstellt werden, wenn Sie eine Datei mit zwei vorhandenen Auslagerungsdateien bearbeiten, aber ich denke nicht Ich habe jemals einen in freier Wildbahn gesehen. Wenn Sie wirklich paranoid sind, können Sie ihn verwenden .*.sw[a-p]oder einfach .*.sw?.)

Siehe :help -rfür (etwas) mehr Informationen über die -rOption, oder :help recover.txtfür weitere Informationen über die Verwertung und Swap - Dateinamen.

Lithis
quelle
1
Nun, Vims Auslagerungsdateien sind versteckte Dateien ( .im Dateinamen führend ), also wäre das richtige Muster .*.sw[a-p](obwohl Sie in pathologischen Fällen tatsächlich den ganzen Weg dorthin gelangen könnten .foo.saa). Das sollte auch übereinstimmende Flash-Dateien ausschließen, da ich bezweifle, dass dies normalerweise eine versteckte Datei ist.
Jamessan
@jamessan Die Führung .wird in einem Shell-Glob benötigt, *.swpfunktioniert aber als Argument für find. Aber die Führung .macht die Dinge einfacher. Vielen Dank!
Lithis
8
  • Ist es möglich, nur .*.swp-files zu haben , wenn Datei auf Festplatte und Datei in vim unterschiedlich sind?

Ja. Das folgende Snippet (angepasst von tpopes vimrc ) deaktiviert die Auslagerungsdatei für einen Puffer, wenn sie nicht geändert wird, sodass Auslagerungsdateien nur für geänderte Dateien vorhanden sind.

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

Vorsichtsmaßnahme : Da die Auslagerungsdatei nur vorhanden ist, wenn der Puffer geändert wird, verlieren Sie die Verwendung der Auslagerungsdatei als Hinweis. Wenn der Puffer nicht geändert wird, kann ein anderer Vim ihn bearbeiten, ohne zu bemerken, dass er bereits geöffnet ist. Wenn der zweite Vim speichert, bevor der erste weitere Änderungen vornimmt, werden sie erst bemerkt, wenn der Benutzer versucht zu speichern oder etwas Vim dazu veranlasst, zu überprüfen, ob die Datei geändert wurde.

Jamessan
quelle