Jak pozbyć się ostrzeżeń podczas otwierania pliku zawierającego plik .swp?


46

Jak pozbyć się irytujących ostrzeżeń, gdy otwieram plik z plikiem .swp? Lub jak w ogóle nie generować plików .swp? Przykładowe ostrzeżenie:

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:

Odpowiedzi:


44

Ta wiadomość jest bardzo ważna, jeśli zależy Ci na tym, aby nie stracić tekstu, którego potencjalnie nie zapisałeś. Nie powinno to być denerwujące i nie powinno powodować pośpiesznego usuwania pliku wymiany ani konfigurowania vimdziałania bez niego.

Każdy plik, który edytujesz, vimbędzie mieć podczas edycji odpowiedni plik wymiany , który vimsłuży do śledzenia zmian. Po wyjściu z edycji pliku vimautomatycznie odrzuci odpowiedni plik wymiany. W związku z tym istnienie pliku wymiany i próba zapisu pliku oryginalnego powinna być powodem do rozważenia i podjęcia odpowiednich działań.

Dwa scenariusze przedstawione w komunikacie ( E325: ATTENTION Found a swap file) są w rzeczywistości dość powszechne: (1) albo inny vimprogram edytuje ten sam plik, który próbujesz edytować (może to być inna osoba - w takim przypadku to naprawdę nie miałoby sensu po prostu ślepo usunąć plik wymiany - może to być Ty w innym oknie terminala lub karcie), lub (2)vim awaria poprzedniej sesji (najczęściej dzieje się tak, gdy edytujesz zdalnie, a sesja sieciowa jest przerywana - w której jeśli sesja vima nie została zakończona normalnie, a .swpplik pozostaje w tyle; innym przykładem tego drugiego scenariusza jest przypadkowe zamknięcie okna terminala lub karty, która miała aktywną lub działającą w tle vimsesję).

Gdy napotykam ten komunikat, najpierw zastanawiam się, czy edytuję ten plik w innym oknie terminala lub na karcie, ponieważ zwykle działam z kilkoma oknami terminalu z kilkoma kartami:

wprowadź opis zdjęcia tutaj

Jeśli zdam sobie sprawę, że edytuję w innym miejscu i mogę do niego wrócić , to nacisnę qklawisz (Q)uittej dodatkowej sesji i wrócę do edycji za pośrednictwem oryginalnej vimsesji.

Czasami, jeśli nie jestem do końca pewien, (Q)uitbiegnę, jobsaby sprawdzić, czy działam vimw tym samym terminalu; jeśli nic się nie pojawi, biegnę, ps -ef | grep vimaby sprawdzić, czy działam vimgdzie indziej (tj. w innym oknie terminala lub karcie). Chodzi o to, że zawsze staram się wznowić edycję w oryginalnej vimsesji.


Jeśli jestem pewien, że nie mogę powrócić do oryginalnej sesji edytorskiej, a mimo to nadal pojawiają się następujące opcje, naciskam przycisk rdo (R)ecover.

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

Naciśnięcie rspowoduje wyświetlenie następującego komunikatu:

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

Z drugiej strony, jeśli nie mam już do czynienia z tymi opcjami, ponieważ pojawia się monit powłoki, to uruchamiam się vimz tą -ropcją w następujący sposób:

vim -r notes

Wynikowa wiadomość będzie podobna:

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

Tak czy inaczej, naciśnij, ENTERaby kontynuować, a zobaczysz plik.

Uwaga: jeśli Vim ma wątpliwości co do tego, co znalazł, wyświetli komunikat o błędzie i wstawi wiersze z „???” w tekście. Jeśli podczas odzyskiwania pojawi się komunikat o błędzie, wyszukaj w pliku „???” aby zobaczyć, co jest nie tak. Możesz wyciąć i wkleić, aby uzyskać potrzebny tekst.

Najczęstszą uwagą jest „??? LINES MISSING”. Oznacza to, że Vim nie może odczytać tekstu z oryginalnego pliku. Może się to zdarzyć, jeśli system ulegnie awarii i części oryginalnego pliku nie zostaną zapisane.

To powiedziawszy, nigdy nie widziałem tych ???znaków, więc to musi być naprawdę rzadkie zdarzenie.


Następnie zapisz (tj. Zapisz) zawartość do innego pliku (zwykle po prostu dołączam „2” na końcu oryginalnej nazwy pliku):

:w notes2

Następnie wymuś zakończenie tej vimsesji:

:q!

Następnie porównaj dwa pliki:

diff notes notes2

Jeśli diffnic nie zwraca , oznacza to, że nie ma różnicy i można bezpiecznie usunąć zarówno plik wymiany, jak i drugi plik:

rm .notes.swp notes2

W tym momencie otwórz oryginalny plik i postępuj tak, jakby nigdy nie było problemu:

vim notes

Jeśli diffcoś zwraca , oznacza to, że oryginalny plik (poprzez plik wymiany) miał zmiany, które dzięki odzyskiwaniu zostały zapisane w drugim pliku.

Ponieważ zmiany te są przechwytywane w drugim pliku, możesz bezpiecznie usunąć plik wymiany i zastąpić oryginalny plik drugim:

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

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

W tym momencie otwórz oryginalny plik i postępuj tak, jakby nigdy nie było problemu:

vim notes

Wydaje się, że to dużo pracy, ale po przyzwyczajeniu się do przepływu pracy zajmuje to maksymalnie 20 sekund.


2
Nie mogę uwierzyć, że to nie jest zaakceptowana odpowiedź. Jest idealny. +1
David

o wiele lepsza niż zaakceptowana odpowiedź. Szkoda, że ​​nie mamy sposobu, aby rozwiązać ten problem!
Michael Durrant

1
Wiadomość nie zawsze jest przydatna. Jeśli edytuję plik, dbam o to, czy plik się zmienił od momentu rozpoczęcia edycji , w tej chwili próbuję go zapisać , a nie to , czy edytuję go również w innym oknie vim. Otwieranie pliku w dwóch terminalach jest dla mnie całkowicie w porządku, o ile zapisy w pliku się nie przeplatają. Vim naprawdę musi mnie nękać, kiedy próbuję uratować, a nie kiedy go otwieram.
Ken Simon

Niestety to nie odpowiada na pytanie, mówi tylko, że nie powinienem ignorować ekranu nag. MOIM scenariuszem jest to, że mam już otwarty plik w vimie (być może do edycji), chcę widzieć różne części pliku jednocześnie i nie chcę dzielonych buforów, ponieważ clang_complete ciągle zmienia rozmiar buforów . W tym przypadku tak naprawdę chcę wiedzieć, jak otworzyć plik tylko do odczytu w Vimie i pozwolić mu zignorować plik wymiany.
Lelanthran

@Lelanthranvim -n file_name
user664833

19

Wklejona wiadomość sugeruje, że nadal masz otwarty plik „notatek” w innej sesji Vima. Zdecydowanie nie jest dobrym pomysłem edytowanie pliku, który jest edytowany w innym miejscu.

Jeśli ten komunikat jest nieprawidłowy, musisz ustalić, w jaki sposób sesja Vima zakończyła się niepoprawnie i uniknąć tego w przyszłości.

Jeśli chodzi o odzyskiwanie, może to być problem w tym jednym przypadku, ponieważ „notatki” są nowsze niż powiązany z nim plik .swp Vima, ale nadal możesz spróbować. Tylko najpierw skopiuj plik „notatek” do lokalizacji kopii zapasowej.

Warto przeczytać „ :help recover.txt”.

Lekcja tutaj polega na tym, że nie powinieneś widzieć tej wiadomości i że masz na myśli Coś poszło nie tak. To (prawdopodobnie) nie wina Vima.

Jeśli w tym momencie nadal jesteś absolutnie zdeterminowany, aby nie pozwolić Vimowi tworzyć plików .swp, abyś mógł odzyskać system po awariach i innych powiązanych problemach, możesz wstawić „ set noswapfile~/.vimrc.


1
BĄDŹ OSTROŻNY! Prawie straciłem całą pracę związaną z VIM. Skopiuj kod, zanim spróbujesz cokolwiek.
Squirrl 16.04.15

Zdecydowanie sugeruję, aby czytelnicy przejrzeli odpowiedź użytkownika 664833 ( Ta wiadomość jest naprawdę bardzo ważna ... ), ponieważ uważam, że daje ona znacznie lepszą informację i poradę, że ta odpowiedź imho
Michael Durrant

11

Możesz użyć -n, aby otworzyć vima bez użycia pliku wymiany :

Aby to zrobić cały czas, po prostu włóż

alias vim='vim -n' 

w pliku .bashrc lub .bash_aliases

jeśli kiedykolwiek będziesz chciał uruchomić vima bez opcji -n, po prostu uruchom

\vim

3
Nie polecałbym zawsze uruchamiania bez pliku wymiany, ale „-n” jest dokładnie tym, czego potrzebowałem. Zwykle używam pliku wymiany. Jednakże, gdy używam Vima jako narzędzia różnicowego, chciałbym móc wyświetlać różnice w plikach, które edytuję, bez różnic, które dawałyby mi ten komunikat lub kolidowały z plikiem wymiany.
Agentlien

1
Podoba mi się ta odpowiedź - jest krótka, dokładna i odpowiada na aktualne pytanie!
Lelanthran


1

Jak pozbyć się irytujących ostrzeżeń, gdy otwieram plik z plikiem .swp?

Użyj opcji krótkiej wiadomości w ~/.vimrc:

set shortmess=A

Co jest również domyślnym trybem POSIX.

Jednak nie rób tego : to jest jak usunięcie poduszek powietrznych w samochodzie w celu zwiększenia wydajności paliwa. Na dłuższą metę poświęcisz więcej czasu na regenerację, niż kiedykolwiek odpowiadałeś na pytanie.


1
Zakładając system dla jednego użytkownika, konfiguracja nie jest aż tak straszna. Lubię mieć otwartych wiele kart terminalu i czasami chcę edytować plik, który już zakopałem w innej karcie. Jeśli chcę dokonać kilku szybkich zmian, to w porządku. Jeśli znów znajdę się w innym oknie vima, piękno polega na tym, że ostrzeże mnie to, że plik się zmienił, zanim go zapiszę, i mogę szybko :esprawdzić, co się stało (w tym szybko ucofnąć to, co się stało Miałem w buforze). Podoba mi się to znacznie bardziej niż dręczenie się, że mam już otwarty plik.
Ken Simon

1

Stało się tak, gdy mój terminal niespodziewanie zamknął moje połączenie z vi open.

Na szczęście nie straciłem żadnych zmian.

Aby usunąć to ostrzeżenie i odrzucić swap:

  1. Znajdź identyfikator procesu, na który patrzy process ID: 2251 (still running), w tym przypadku jest to 2251
  2. Sprawdź, czy masz odpowiedni identyfikatorps 2251
  3. Zabij proces za pomocąkill 2251

I to wszystko.

Pamiętaj, że pliki wymiany są po to, aby cię chronić i nie powinieneś ich całkowicie wyłączać.


Ale co, jeśli nie ma vi(m)procesu?
Scott

-2

Rozwiązałem ten problem w trzech prostych krokach:

1 :) Uruchom „ls -la” tam, gdzie plik istnieje, abyś mógł zobaczyć plik .swp dla tego samego.

2 :) Teraz „rm -i * .swp”, tj. Usuń plik „.swp” z katalogu.

3 :) Teraz potwierdź, czy plik „.swp” został usunięty.

4 :) Teraz korzystaj z tych ostrzeżeń.


3
Dlaczego na świecie sugerujesz rm -rfusunięcie pliku? Zastąpiłem -rfbardziej sensownym-i
Nifle
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.