Jaki jest najprostszy sposób na usunięcie plików wymiany Vima, z których już odzyskałem?

84

Czasami Vim ulega awarii i pozostawia plik wymiany. To cudownie. Następnie otwieram plik, który edytowałem i Vim pyta mnie, czy chcę odzyskać. Dziękuję. Po zakończeniu Vim mówi mi:

You may want to delete the .swp file now.

Dlaczego tak. W jaki sposób mogę to zrobić? Uznałem, że po prostu zacznie ponownie używać starego pliku wymiany jako pliku wymiany i wyczyści go, gdy odejdę, ale to nieprawda. Tworzy nowy, czyści go, a kiedy ponownie otwieram plik, ponownie każe mi odzyskać od pierwszego.

Z pewnością coś mi umknęło.

Peeja
źródło
Zobacz tutaj vi.stackexchange.com/questions/13518/... „Opcja„ Usuń to ”nie jest wyświetlana, jeśli proces Vima nadal działa” i zwróć uwagę na komentarz do sesji TMUX, tj. Upewnij się, że nadal nie masz uruchomionego Vima (także ekran GNU) gdzieś w tle, patrz tutaj vi.stackexchange.com/questions/13518/…
zenaan

Odpowiedzi:

81

Nieco prostszy sposób:

Z emulatora terminala:

vim filename

Następnie wybierz odzyskaj , a jeśli chcesz usunąć swap, który napiszesz (zapisz), a następnie zrób to z poziomu vima:

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

... i wybierz Usuń tym razem.

Właśnie się o tym dowiedziałem i myślę, że odtąd to zrobię. Wtedy też nie przypadkowo nadpisuję działający plik, jeśli odzyskiwanie okaże się uszkodzone (chociaż nigdy wcześniej tego nie próbowałem).

Istnieją również istotne wskazówki dotyczące tego pytania na temat przepełnienia stosu (gdzie znalazłem tę wskazówkę).

miyalys
źródło
16
Nie mam deleteopcji, są tylko: [O] długopis (E) dit (R) ecover (Q) uit (A) bort, co powinienem zrobić?
Arne,
4
@Arne: Z mojego doświadczenia wynika, że ​​zwykle oznacza to, że plik jest obecnie otwarty w innej instancji vima?
miyalys,
1
Opcja [D] elete pojawiła się dopiero po aktualizacji do Vima 7.4
jmlarson
@Arne Miałem ten sam problem. Ale po jakimś czasie, około godziny, ponownie uruchomiłem vima i opcja była dostępna. Komputer nie został ponownie uruchomiony w tym czasie. vim może myśleć, że działa inny proces vim. Dlatego nie pokazuje opcji.
ka3ak
6
Dla tych, którzy mówią, że nie widzą (D)eleteopcji, zobacz :help swap-exists; cytuj On Unix this choice is only offered when the process that created the swap file does not appear to be running.Tj. być może masz uruchomiony inny proces vim, który powoduje ukrycie tej opcji. Może to również wyjaśniać, dlaczego masz swpplik!
Lqueryvg
39

Aby wyczyścić WSZYSTKIE pliki wymiany vim w katalogu:

Jeśli jesteś pewien, że nie potrzebujesz żadnych plików wymiany vima w drzewie katalogów i chcesz się ich pozbyć, możesz użyć następującego polecenia w katalogu, gdy vim nie jest uruchomiony (nawet w innym oknie lub nawet innym logowaniu sesja):

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

Inspiracje i przemyślenia pochodzą z usuwania niepotrzebnych plików .swp w Grupach dyskusyjnych Google. Spowoduje to usunięcie wszystkich plików, których nazwy kończą się .swk, .swl, .swm, .swn, .swo, lub .swp w bieżącym drzewie katalogów.

To może nie być to, czego chcesz, z kilku powodów:

  • Jak wspomniano, przeszukuje bieżące drzewo katalogów  ; tzn. bieżący katalog i wszystkie podkatalogi rekurencyjnie. To wykracza poza to, o co pyta pytanie, i może być uznane za przesadę.
  • Jak już wspomniano, będzie usunąć wszystkie pliki, których nazwy kończą się .swk, .swl, .swm, .swn, .swo, lub .swp, i nie tylko .swpGary Johnson mówi :

    Ponadto nie wszystkie pliki wymiany kończą się rozszerzeniem .swp. Jeśli Vim musi utworzyć plik wymiany, a plik z rozszerzeniem .swp już istnieje, Vim użyje rozszerzenia .swo dla nowego, a następnie .swn. Myślę, że po prostu kontynuuje alfabet. Więc używając czegoś takiego

      \*.sw[nop] 
    

    lub nawet

      \*.sw? 
    

    byłoby dokładniejsze.

    Oryginalny autor tego postu mówi:

    „klmnop” może być przesadą, ale zwykle gwarantuje, że dostanę je wszystkie.

  • Z drugiej strony może to być niewystarczające.  sugeruje rubel

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

    który pasuje do wszystkich (małych liter) trzyliterowych rozszerzeń od .saado .swp. Dodaje: „Bądź jednak ostrożny, ponieważ jest to bardziej kompletne rozwiązanie, ale usunie wszystkie pliki graficzne .svg i pliki flash Adobe .swf. Możesz modyfikować regex, jeśli pracujesz z tymi plikami.”Pasuje również .sav, .snd(dane dźwiękowe) .sql, .src, .srt(SubRip format napisów wideo), i wiele innych wspólnych rozszerzeń.

  • To może być przesada. Jak już wspomniano, będzie usunąć wszystkie pliki, których nazwy kończą się .swk, .swl, .swm, .swn, .swo, lub .swp. Ale najwyraźniej pliki wymiany vim są zwykle plikami „kropkowymi”. Jeśli edytujesz hello.cpp, plik wymiany może być .hello.cpp.swp. Jak pokazano (ale nie wyjaśniono) w odpowiedzi rouble , bezpieczniej jest usuwać tylko pliki, których nazwy zaczynają się od kropki; np. z

    find . -type f -name ".*.sw[klmnop]" -delete
    
Shwaydogg
źródło
14

Wpisz ls -alistę WSZYSTKICH plików w katalogu

wpisz rm .whatever.your.swpi naciśnijenter

To takie proste.

Każdy plik pokazany z .przodu jest plikiem ukrytym i zwykle nie jest widoczny.

Pamiętaj, że zmiany są natychmiastowe i trwałe, więc bądź ostrożny.

Wolfy
źródło
4
Nie jest to jednak bardzo proste. Muszę zostawić Vima, przejdź do katalogu wymiany, pamiętam nazwy pliku i ewentualnie zdecydować, czy to file.swplub file.swo. Potem muszę wrócić do miejsca, w którym byłem. Uderzenie :ejest znacznie prostszym rozwiązaniem.
Peeja,
1
ls: cannot access +A: No such file or directory
Jonathan
to jest to, czego potrzebuję
user5510975
7

Btw. niektóre wtyczki robią to automatycznie: autoswap.vim

z opisu:

  1. Czy plik jest już otwarty w innej sesji Vima w innym oknie?
  2. Jeśli tak, przejdź do okna, w którym edytujemy ten plik.
  3. W przeciwnym razie, jeśli plik wymiany jest starszy niż sam plik, po prostu się go pozbyć.
  4. W przeciwnym razie otwórz plik tylko do odczytu, abyśmy mogli go obejrzeć i zapisać.
toogley
źródło
6
Czy ktoś może mi powiedzieć, dlaczego vim nie może domyślnie mieć rozsądnego zachowania bez wtyczek?
Pavel Šimerda
6

Nie, AFAIK niczego nie brakuje. Vimkontynuuje przechowywanie pliku wymiany jako kopii zapasowej, dopóki go nie usuniesz.

Po prostu zapisz, zamknij i ponownie otwórz ten sam plik. Zostaniesz poproszony (ponownie) o

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

Teraz wystarczy nacisnąć d:)

Avio
źródło
11
Naprawdę? To znaczy, wiedziałem o tym. Ale to głupie. Z pewnością nie jest to „proste”.
Peeja
1
Nawiasem mówiąc, jaka jest różnica między rezygnacją a przerwaniem?
trusktr
5
w moim przypadku nie ma opcji Usuń. co powinienem zrobić? (Uratowałem, odszedłem i ponownie otworzyłem)
Paschalis,
Nie musisz najpierw wychodzić z Vima, po prostu wpisz: e <powrót> po wybraniu „edytuj mimo wszystko” lub „odzyskaj” w pliku, a otrzymasz opcję jego usunięcia
00prometheus
2

Vim, podobnie jak większość poleceń Uniksa, jest prosty i wyraźny, a nie zakładający i niejawny.

Odzyskujesz za pomocą (r). Jeśli nie podoba ci się odzyskiwanie lub odzyskiwanie jest uszkodzone, możesz je odrzucić. Jeśli Ci się spodoba, możesz zapisać plik. Plik odzyskiwania nie jest dla Ciebie usuwany, ponieważ nie jest jawny i nie będzie poprawny w 100% sytuacji.

Więc ty (r) ecover, (w) rite i (q) uit, następnie edytuj ponownie i wybierz (d) elete lub „rm .myfile.js.swp” i edytuj ponownie. Jest to szybkie i zawsze, z punktu widzenia Vima, zachowanie w 100% prawidłowe.

Oli Comber
źródło
Okej, więc czy istnieje sposób na uzyskanie vima, który da mi ścieżkę do pliku wymiany? Z przyjemnością uruchamiam drugie polecenie, aby usunąć plik wymiany (w rzeczywistości podoba mi się jego jawność), ale chciałbym, aby polecenie usunęło plik wymiany gdziekolwiek się znajduje. Na przykład mam osobny katalog plików wymiany. Jeśli dwa otwarte pliki mają tę samą nazwę basename, nie mogę programowo zdecydować, który jest poprawnym plikiem wymiany dla bieżącego bufora.
Peeja
1
To prawda, ale fajna byłaby prosta opcja „Odzyskaj i usuń”. Prawdopodobnie jest to również łatwe wdrożenie tomu. Zrobię to kiedyś, kiedy skończę chodzić do szkoły, jeśli jeszcze tego nie zrobiono.
trusktr
1
Większość poleceń uniksowych jest prosta, wyraźna i ma rozsądne domyślne zachowanie. Odzyskiwanie Vima nie jest proste, UX jest tak samo zły jak w LibreOffice, zachowanie jest po prostu błędne, a rezultatem w wielu przypadkach jest utrata danych.
Pavel Šimerda
1

Te pliki również były dla mnie denerwujące, ale ustawiłem opcję w .vimrc - set noswapfile aby zapobiec tworzeniu go przez vima i zamiast tego utrzymywać pliki w pamięci.

Dmitrii
źródło
Według OP pliki wymiany są przydatne, więc ich wyłączenie może nie być najlepszą opcją.
Kusalananda
Nie wyłączaj plików wymiany. Jeśli Twój komputer ulegnie awarii, stracisz pracę.
Lqueryvg
Oczywiście ta opcja wiąże się z ryzykiem i jak wiem, te pliki wymiany powstały przy pojawianiu się edytorów vi *, gdy ich awarie zdarzały się bardzo często. Teraz mogę powiedzieć, że vim działa stabilnie i istnieją jako starsze rzeczy, imho.
Dmitrii
1

Oto bardziej kompletne wyrażenie regularne do czyszczenia wszystkich plików wymiany vim w oparciu o własny plik gitignore Githuba dla Vima

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

Bądź jednak ostrożny, ponieważ jest to bardziej kompletne rozwiązanie, usunie wszystkie pliki graficzne .svg i pliki flash Adobe .swf. Możesz zmodyfikować wyrażenie regularne, jeśli pracujesz z tymi plikami.

rubel
źródło
1

Oto fragment do dodania .vimrc. Usuwa wszystkie pliki wymiany skojarzone z bieżącym buforem plików i resetuje rozszerzenie wymiany.

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()

Po spotkaniu z sytuacją można wykonać. :DeleteFileSwaps Jest to świetne, jeśli łączy się z poleceniami :windolub :tabdo.

:tabdo DeleteFileSwaps 

Dalsze szczegóły : Plik może zawierać więcej niż 1 plik wymiany. Powód, ponieważ plik wymiany z rozszerzeniem .swpnadal istnieje i vimbędzie z tego powodu tworzyć nowe. Aby dowiedzieć się, czy .swpistnieją:

  • Gdy plik docelowy jest otwarty w vimie, uruchom, :swaby uzyskać bieżący plik wymiany.
  • Sprawdź katalog, w którym znajduje się bieżący plik wymiany.
  • Następnie sprawdź, czy katalog zawiera plik wymiany o nazwie otwartego pliku i ma rozszerzenie .swp.

Powyższy fragment kodu wykonuje ten sam proces, ale usuwa wszystkie pliki wymiany.

Mam nadzieję że to pomoże.

Nate
źródło
0

Z instrukcji :h swap:

Możesz zobaczyć nazwę bieżącego pliku wymiany używanego z poleceniem: :sw[apname]

JosephHarriott
źródło
Ostrzeżenie ... prawdopodobnie nie jest to nazwa pliku, który należy usunąć. Dopóki nie usuniesz .swppliku, :swpolecenie prawdopodobnie poda Ci nazwę .swopliku - co nie jest tym, co chcesz usunąć.
Lqueryvg
0

jeśli zostaniesz o to poproszony, naciśnij, Daby usunąć plik wymiany bieżącego pliku.

jeśli nie, musisz to zrobić ręcznie.

jednym z alternatywnych sposobów jest:

aby zlokalizować / przeszukać plik:

find | grep ".searchRefineVertTabs.jsp.swp"

a następnie usuń ten plik:

rm ./.searchRefineVertTabs.jsp.swp
Kaleem Ullah
źródło
1
Ja jestem proszony, ale mój wybór jest do odzyskania . Pytanie brzmi, jak go usunąć zaraz po odzyskaniu, ponieważ nie jest już konieczne. Wydaje mi się, że vim nie zrobił tego dla mnie. Ale zaakceptowana odpowiedź jest najczystszym przepływem pracy, jaki do tej pory znalazłem.
Peeja,
-1

Możesz użyć,

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

Przykład:

rm -f .rc.local.swp
RizonBarns
źródło
To technicznie działa, ale przy obecnej akceptowanej odpowiedzi nie jest to tak łatwe.
Peeja,
Plus <ext>jest tutaj zbędny, ponieważ nazwa pliku przynajmniej w systemie Linux zawiera zero lub więcej rozszerzeń.
Pavel Šimerda,