Qual è il modo più semplice per eliminare i file swap di Vim da cui ho già recuperato?


84

A volte Vim si blocca e mi lascia un file di scambio. È fantastico Quindi apro il file che stavo modificando e Vim mi chiede se voglio ripristinarlo. Grazie. Al termine, Vim mi dice,

You may want to delete the .swp file now.

Perché sì. Come lo faccio? Ho pensato che avrebbe appena iniziato a usare di nuovo il vecchio file di scambio come file di scambio e lo avrei ripulito quando ho smesso, ma non è vero. Ne crea uno nuovo, lo pulisce e, quando apro di nuovo il file, mi chiede di nuovo di recuperare dal primo.

Sicuramente mi manca qualcosa.


Vedi qui vi.stackexchange.com/questions/13518/… "L'opzione" Elimina "non viene visualizzata se il processo Vim è ancora in esecuzione" e osserva il commento sulle sessioni TMUX, ovvero assicurati di non avere Vim ancora in esecuzione (anche, schermo GNU) in background da qualche parte, vedi qui vi.stackexchange.com/questions/13518/…
zenaan

Risposte:


81

Un modo leggermente più semplice:

Dall'emulatore di terminale:

vim filename

Quindi scegliere ripristina e se si desidera eliminare lo scambio che si scrive (salva) e quindi farlo da VIM:

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

... e scegli Elimina questa volta.

Ho appena scoperto questo, e penso che lo farò da ora in poi. Quindi non sovrascriverò nemmeno accidentalmente un file di lavoro, se il ripristino si è rivelato corrotto (anche se non l'ho mai provato prima).

Ci sono anche suggerimenti rilevanti su questa domanda su Stack Overflow (dove ho trovato questo suggerimento).


16
Non ho deleteun'opzione, c'è solo: [O] pen (E) dit (R) ecover (Q) uit (A) bort, cosa devo fare?
Arne,

4
@Arne: dalla mia esperienza che di solito significa che il file è attualmente aperto in un'altra istanza di vim?
Miyalys,

1
L'opzione [D] elete è apparsa solo dopo l'aggiornamento a Vim 7.4
jmlarson

@Arne Ho avuto lo stesso problema. Ma dopo qualche tempo, circa un'ora, ho riavviato Vim e l'opzione era disponibile. Il PC non è stato riavviato in quel momento. vim potrebbe pensare che sia in esecuzione un altro processo vim. Ecco perché non mostra l'opzione.
Ka3ak,

6
Per coloro che dicono di non vedere (D)eleteun'opzione, vedere :help swap-exists; quote On Unix this choice is only offered when the process that created the swap file does not appear to be running.Vale a dire forse hai un altro processo vim in esecuzione che sta causando questa opzione per essere nascosta. Potrebbe anche spiegare perché hai un swpfile in primo luogo!
Lqueryvg,

39

Per ripulire TUTTI i file di scambio vim in una directory:

Se sei sicuro di non aver bisogno di alcun file di scambio vim in un albero di directory e vuoi sbarazzartene, puoi usare il seguente comando nella directory mentre vim non è in esecuzione (nemmeno in un'altra finestra o anche con un login diverso sessione):

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

Alcuni suggerimenti e idee sono venuti dalla rimozione di file spazzatura .swp su Google Gruppi. Questo cancellerà tutti i file i cui nomi finiscono con .swk, .swl, .swm, .swn, .swo, o .swp nella struttura di directory corrente.

Questo potrebbe non essere quello che desideri, per diversi motivi:

  • Come detto, cerca l' albero delle directory corrente  ; vale a dire, la directory corrente e tutte le sottodirectory, ricorsivamente. Questo va oltre ciò che la domanda richiede e può essere considerato eccessivo.
  • Come detto, sarà eliminare tutti i file i cui nomi finiscono con .swk, .swl, .swm, .swn, .swo, o .swp, e non solo .swpGary Johnson dice :

    Inoltre, non tutti i file di scambio terminano con .swp. Se Vim deve creare un file di scambio e ne esiste già uno che termina con .swp, Vim utilizzerà l'estensione .swo per quello nuovo e .swn successivamente. Penso che continui all'indietro attraverso l'alfabeto. Quindi usando qualcosa di simile

      \*.sw[nop] 
    

    o anche

      \*.sw? 
    

    sarebbe più approfondito.

    L'autore originale di questo post dice:

    'klmnop' può essere eccessivo, ma questo di solito mi assicura che li ottenga tutti.

  • D'altra parte, potrebbe essere sottostimato.  suggerisce il rublo

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

    che corrisponde a tutte le estensioni di tre lettere (minuscole) che vanno da .saaa .swp. Aggiunge: “Stai attento, sebbene questa sia una soluzione più completa, eliminerà qualsiasi file immagine .svg e file flash adobe .swf. Si consiglia di modificare la regex se si lavora con i file.”E corrisponde anche .sav, .snd(dati audio), .sql, .src, .srt(SubRip formato video sottotitolo), e molte altre estensioni comuni.

  • Potrebbe essere eccessivo. Come detto, sarà eliminare tutti i file i cui nomi finiscono con .swk, .swl, .swm, .swn, .swo, o .swp. Ma, a quanto pare, i file di scambio vim sono comunemente file "punto". Se si modifica hello.cpp, il file di scambio potrebbe essere .hello.cpp.swp. Come mostrato (ma non spiegato) nella risposta di Rouble , è più sicuro eliminare solo i file i cui nomi iniziano con un punto; ad es. con

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

14

Digitare ls -aquale elenca TUTTI i file nella directory

digitare rm .whatever.your.swpè e premereenter

È così semplice.

Qualsiasi file che mostra .davanti è un file nascosto e normalmente non viene visto.

Ricorda che i cambiamenti sono immediati e permanenti, quindi fai attenzione.


4
Non è molto semplice, però. Devo lasciare Vim, navigare nella directory di scambio, ricordare il nome del file ed eventualmente decidere se è file.swpo file.swo. Quindi devo tornare dove ero. Colpire :eè una soluzione molto più semplice.
Peeja,

1
ls: cannot access +A: No such file or directory
Jonathan,

questo è quello di cui ho bisogno
user5510975

7

Btw. alcuni plugin lo fanno automaticamente per te: autoswap.vim

dalla descrizione:

  1. Il file è già aperto in un'altra sessione di Vim in un'altra finestra?
  2. In tal caso, passare alla finestra in cui stiamo modificando quel file.
  3. Altrimenti, se swapfile è più vecchio del file stesso, eliminalo.
  4. Altrimenti, apri il file di sola lettura in modo che possiamo dare un'occhiata e salvarlo.

6
Qualcuno può dirmi perché vim non può avere un comportamento sensibile per impostazione predefinita, senza plugin?
Pavel Šimerda,

6

No, AFAIK non ti stai perdendo nulla. Vimcontinua a conservare il file di scambio come backup fino a quando non viene eliminato esplicitamente.

Basta salvare, chiudere e riaprire di nuovo lo stesso file. Ti verrà richiesto (di nuovo) con

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

Ora basta premere d:)


11
Veramente? Voglio dire, lo sapevo. Ma è stupido. Non è certamente "semplice".
Peeja,

1
A proposito, qual è la differenza tra smettere e interrompere?
trusktr,

5
non esiste alcuna opzione Elimina nel mio caso. cosa dovrei fare? (Ho salvato, abbandonato e riaperto)
Paschalis,

Non è necessario uscire prima da Vim, basta digitare: e <return> dopo aver scelto "modifica comunque" o "ripristina" sul file, e avrai la possibilità di eliminarlo
00prometheus

2

Vim, come la maggior parte dei comandi Unix, è semplice ed esplicito, piuttosto che assumere e implicito.

Ti riprendi con (r). Se non ti piace il recupero o il recupero è corrotto, puoi scartarlo. Se ti piace, puoi salvare il file. Il file di ripristino non viene eliminato per te perché non è esplicito e non sarà corretto per il 100% delle situazioni.

Quindi (r) ecover, (w) rite e (q) uit, quindi modifica nuovamente e scegli (d) elete o "rm .myfile.js.swp" e modifica di nuovo. Questo è veloce da fare ed è sempre, dal punto di vista di Vim, un comportamento corretto al 100%.


Bene, allora c'è un modo per ottenere VIM che mi dia il percorso del file di scambio? Sono felice di eseguire un secondo comando per eliminare il file di scambio (in effetti, mi piace la spiegazione di ciò), ma mi piacerebbe un comando per eliminare il file di scambio ovunque si trovi. Ad esempio, ho una directory di file di swap separata. Se due file aperti hanno lo stesso nome di base, non posso decidere a livello di programmazione quale sia il file di scambio corretto per il buffer corrente.
Peeja,

1
Vero, ma fornire una semplice opzione "Ripristina ed elimina" sarebbe utile. Probabilmente è anche un semplice attrezzo tom. Lo farò un giorno quando avrò finito di andare a scuola se non è già stato fatto.
trusktr,

1
La maggior parte dei comandi unix sono semplici, espliciti e hanno un comportamento predefinito ragionevole. Il recupero di Vim non è semplice, l'UX è cattivo come in LibreOffice, il comportamento è chiaramente sbagliato e il risultato, in molti casi, è la perdita di dati.
Pavel Šimerda,

1

Questi file sono stati fastidiosi anche per me, ma ho impostato l'opzione in .vimrc - set noswapfile per impedire a vim di crearlo e, invece, mantenere i file in memoria.


Secondo l'OP, i file di scambio sono utili, quindi disattivarli potrebbe non essere l'opzione migliore.
Kusalananda,

Non disattivare i file di scambio. Se la macchina si arresta in modo anomalo, perderai il lavoro.
Lqueryvg,

Ovviamente questa opzione comporta rischi e, come so, questi file di scambio sono stati creati all'emergere di vi * editiors quando i suoi arresti si sono verificati molto spesso. Ora potrei dire che Vim funziona in modo stabile e che esiste come cosa legacy, imho.
Dmitrii,

1

Ecco una regex più completa per pulire tutti i file di scambio vim basati sul file gitignore di Github per Vim

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

Fai attenzione, sebbene questa sia una soluzione più completa, eliminerà qualsiasi file immagine .svg e file flash adobe .swf. Potresti voler modificare la regex se lavori con quei file.


1

Ecco uno snippet da aggiungere .vimrc. Elimina tutti i file di scambio associati al buffer di file corrente e reimposta l'estensione di scambio.

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

Una volta che si incontra la situazione, si può eseguire :DeleteFileSwaps Questo è fantastico se combinato con :windoo :tabdocomandi.

:tabdo DeleteFileSwaps 

Ulteriori dettagli : un file può avere più di 1 file di scambio. Il motivo perché il file di scambio, con estensione .swp, esiste ancora e vimcontinuerà a crearne di nuovi a causa di esso. Per scoprire se .swpesistono:

  • Con il file di destinazione aperto in vim, eseguire :swper ottenere il file di scambio corrente.
  • Controllare la directory in cui è contenuto il file di scambio corrente.
  • Quindi controlla se la directory contiene un file di scambio con il nome del file aperto e ha un'estensione di .swp.

Lo snippet sopra segue lo stesso processo, ma rimuove tutti i file di scambio.

Spero che sia di aiuto.


0

Dal manuale :h swap:

Puoi vedere il nome del file di scambio corrente utilizzato con il comando: :sw[apname]


Avviso ... che probabilmente non è il nome del file che devi eliminare. Fino a quando non avrai eliminato il .swpfile, il :swcomando ti darà probabilmente il nome del .swofile, che non è quello che vuoi eliminare.
Lqueryvg,

0

se ti viene chiesto, premi Dper eliminare il file di scambio del file corrente.

se non lo sei, devi farlo manualmente.

un modo alternativo per farlo è:

per individuare / cercare il file:

find | grep ".searchRefineVertTabs.jsp.swp"

e quindi eliminare questo file:

rm ./.searchRefineVertTabs.jsp.swp

1
Mi viene chiesto, ma la mia scelta è quella di recuperare . La domanda è come eliminarlo subito dopo che ho recuperato, poiché non è più necessario. Sembra un fallimento di Vim non farlo per me. Ma la risposta accettata è il flusso di lavoro più pulito che ho trovato finora.
Peeja,

-1

Puoi usare,

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

Esempio:

rm -f .rc.local.swp

Funziona tecnicamente, ma non è affatto facile con l'attuale risposta accettata.
Peeja,

Inoltre <ext>qui è ridondante poiché almeno un nome file su Linux include zero o più estensioni.
Pavel Šimerda,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.