Come sbarazzarsi degli avvisi quando si apre un file che ha un file .swp?


46

Come posso eliminare i fastidiosi avvisi quando apro un file con un file .swp? Oppure, come non generare affatto i file .swp? Esempio di avviso:

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:

Risposte:


44

Questo messaggio è in realtà piuttosto importante se ti interessa non perdere testo che potenzialmente non hai salvato. Dovrebbe non essere considerato fastidioso, e dovrebbe non causare di cancellare in fretta il file di swap o configurare vimper funzionare senza di essa.

Ogni file con cui modifichi vimavrà un file di scambio corrispondente durante la modifica , che vimutilizza per tenere traccia delle modifiche. Quando si termina la modifica di un file, vimverrà automaticamente eliminato il file di scambio corrispondente. Pertanto, l'esistenza di un file di scambio e il tentativo di scrivere sopra il file originale dovrebbero essere motivo di considerazione e azione appropriata.

I due scenari presentati nel messaggio ( E325: ATTENTION Found a swap file) sono in realtà abbastanza comuni: (1) un altro vimprogramma sta modificando lo stesso file che si sta tentando di modificare (potrebbe effettivamente essere un'altra persona - nel qual caso non avrebbe davvero senso per eliminare semplicemente alla cieca il file di scambio - o potresti essere tu in un'altra finestra o scheda di un terminale) o (2) una vimsessione precedente si è arrestata in modo anomalo (molto spesso ciò accade quando si modifica in remoto e la sessione di rete è interrotta) in cui nel caso in cui la sessione vim non sia stata .swpchiusa normalmente e il file rimanga indietro; un altro esempio di questo secondo scenario è che hai accidentalmente chiuso la finestra del terminale o la scheda che aveva una vimsessione attiva o in background ).

Quando trovo questo messaggio, penso innanzitutto se sto modificando questo file in un'altra finestra o scheda di un terminale, poiché normalmente opero con più finestre di terminale con più schede ciascuna:

inserisci qui la descrizione dell'immagine

Se mi rendo conto che sto modificando in un altro posto e posso tornare ad esso , quindi premo il qtasto per (Q)uitquesta sessione aggiuntiva e torno alla modifica tramite la vimsessione originale .

A volte, se non sono del tutto sicuro, (Q)uitcorro e poi corro jobsper verificare se sto correndo vimesattamente nello stesso terminale; se non succede nulla, corro ps -ef | grep vimper verificare se sto correndo vimaltrove (cioè in un'altra finestra o scheda del terminale). Il punto è che cerco sempre di riprendere la modifica tramite la vimsessione originale .


Se io sono certo che non posso tornare alla sessione di modifica originale, e sto ancora presentato con le seguenti opzioni, quindi premo ra (R)ecover.

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

Premendo r, vedrai un messaggio come questo:

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

Se, d'altra parte, non mi trovo più di fronte a quelle opzioni, perché sono al prompt della shell, allora corro vimcon l' -ropzione, come segue:

vim -r notes

Il messaggio risultante sarà simile:

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

In entrambi i casi, premi ENTERper continuare e vedrai il tuo file.

Nota: se Vim ha dei dubbi su ciò che ha trovato, emetterà un messaggio di errore e inserirà le righe con "???" nel testo. Se durante il ripristino viene visualizzato un messaggio di errore, cercare "???" nel file per vedere cosa c'è che non va. Potresti voler tagliare e incollare per ottenere il testo che ti serve.

L'osservazione più comune è "??? LINES MISSING". Ciò significa che Vim non può leggere il testo dal file originale. Ciò può accadere se il sistema si è arrestato in modo anomalo e parti del file originale non sono state salvate.

Detto questo, non ho mai visto quei ???segni, quindi questo deve essere un evento davvero raro .


Quindi, salva (cioè scrivi) il contenuto in un altro file (di solito aggiungo "2" alla fine del nome del file originale):

:w notes2

Quindi, uscire forzatamente da questa vimsessione:

:q!

Quindi, confronta i due file:

diff notes notes2

Se diffnon restituisce nulla , ciò significa che non vi è alcuna differenza ed è sicuro rimuovere sia il file di scambio che il secondo file:

rm .notes.swp notes2

A questo punto, apri il file originale e procedi come se non ci fosse mai stato un problema:

vim notes

Se diffrestituisce qualcosa , significa che il file originale (tramite il file di scambio) ha subito delle modifiche che, grazie al recupero, sono state salvate nel secondo file.

Poiché tali modifiche vengono acquisite nel secondo file, è possibile eliminare il file di scambio in modo sicuro e sovrascrivere il file originale con il secondo:

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

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

A questo punto, apri il file originale e procedi come se non ci fosse mai stato un problema:

vim notes

Sembra un sacco di lavoro, ma una volta che ti abitui al flusso di lavoro ci vogliono circa 20 secondi al massimo.


2
Non riesco a credere che questa non sia la risposta accettata. È perfetto. +1
David,

molto meglio della risposta accettata. Vorrei che avessimo un modo per affrontare questo!
Michael Durrant,

1
Non è sempre il caso che il messaggio sia utile. Se sto modificando un file, mi importa se il file è cambiato da quando ho iniziato a modificarlo , al momento provo a salvarlo , non se lo sto modificando anche in un'altra finestra di VIM. Va benissimo per me aprire un file in due terminali, purché i salvataggi nel file non intervengano. Vim ha solo bisogno di tormentarmi quando provo a salvare, non quando lo apro.
Ken Simon,

Purtroppo questo non risponde alla domanda, dice solo che non dovrei ignorare la schermata del nag. Il mio scenario è che ho già aperto il file in vim (per la modifica, forse), voglio vedere diverse parti del file contemporaneamente e non voglio dividere i buffer perché clang_complete continua a ridimensionare i buffer . In questo caso, in realtà voglio sapere come aprire un file in sola lettura in Vim e farlo ignorare il file di scambio.
Lelanthran,

@Lelanthranvim -n file_name
user664833

19

Il messaggio incollato suggerisce che hai ancora il file "notes" aperto in un'altra sessione di Vim. Non è sicuramente una buona idea modificare un file che viene modificato altrove.

Se quel messaggio è sbagliato, devi determinare come la tua sessione Vim è uscita in modo improprio ed evitarlo in futuro.

Per quanto riguarda il recupero, questo potrebbe essere un problema in questa unica istanza poiché "notes" è più recente del file .swp di Vim ad esso associato, ma puoi ancora provare. Assicurati solo di copiare prima il file "notes" in una posizione di backup.

Sarebbe una buona idea leggere " :help recover.txt".

La lezione qui è che non dovresti vedere questo messaggio e che sei qualcosa che è andato storto da qualche parte. Non è (probabilmente) colpa di Vim.

Se a questo punto sei ancora assolutamente determinato a non consentire a Vim di creare file .swp in modo da poter recuperare da arresti anomali e altri problemi correlati, puoi inserire " set noswapfile" ~/.vimrc.


1
STAI ATTENTO! Ho quasi perso tutto il mio lavoro giocando con VIM. Copia il tuo codice prima di provare qualsiasi cosa.
Squirrl,

Consiglio vivamente ai lettori di recensire la risposta dell'utente664833 ( Questo messaggio è in realtà piuttosto importante ... ) poiché penso che fornisca informazioni e consigli molto migliori che questa risposta imho
Michael Durrant,

11

Puoi usare -n per aprire vim senza usare un file di scambio :

Per farlo sempre, basta mettere

alias vim='vim -n' 

nel tuo file .bashrc o .bash_aliases

se hai mai bisogno di eseguire vim senza l'opzione -n, esegui semplicemente

\vim

3
Non consiglierei di correre sempre senza un file di scambio, ma "-n" è in realtà esattamente ciò di cui avevo bisogno. Uso un file di scambio, normalmente. Tuttavia, quando uso Vim come strumento diff, mi piacerebbe essere in grado di visualizzare le differenze di file che sto modificando senza quelle differenze che mi danno questo messaggio o interferiscono con il mio file di scambio.
Agentlien,

1
Mi piace questa risposta: è breve, è accurata e risponde alla domanda reale!
Lelanthran,


1

Come posso eliminare i fastidiosi avvisi quando apro un file con un file .swp?

Utilizzare l' opzione messaggio breve nel ~/.vimrc:

set shortmess=A

Quale è anche il valore predefinito quando si esegue la modalità POSIX.

Tuttavia, non farlo : è come rimuovere gli airbag della tua auto per aumentare il consumo di carburante. A lungo termine, passerai più tempo a recuperare di quanto tu abbia mai risposto alla domanda.


1
Supponendo un sistema a utente singolo, non è così orribile di una configurazione. Mi piace avere molte schede terminali aperte, e talvolta voglio modificare un file che ho già sepolto in qualche altra scheda. Se voglio apportare alcune modifiche rapide, va bene. Se mi trovo di nuovo in altra finestra vim, il bello è che mi sarà avvertono quindi che il file è stato modificato prima di salvarlo, e posso fare un rapido :eper vedere cosa è successo (tra cui un rapido ua undo indietro a quello che Ho avuto nel buffer.) Mi piace molto di più che essere tormentato dal fatto di avere già aperto un file.
Ken Simon,

1

Questo mi è successo quando il mio terminale ha inaspettatamente chiuso la mia connessione con vi open.

Per fortuna non ho perso modifiche.

Per rimuovere questo avviso e scartare lo scambio:

  1. Trova l'ID del processo che sta guardando process ID: 2251 (still running), in questo caso è 2251
  2. Verifica di avere l'ID giustops 2251
  3. Uccidi il processo usandokill 2251

E questo è tutto.

Ricorda che i file di scambio sono lì per proteggerti e non dovresti disabilitarli completamente.


E se non ci fosse un vi(m)processo?
Scott,

-2

Ho risolto questo problema in tre semplici passaggi:

1 :) Esegui "ls -la" dove esiste il file in modo da poter visualizzare il file .swp per lo stesso.

2 :) Ora "rm -i * .swp", cioè rimuovi il file ".swp" dalla directory.

3 :) Ora conferma se il file ".swp" è stato rimosso.

4 :) Ora goditi questi avvertimenti.


3
Perché nel mondo consiglieresti rm -rfdi rimuovere un file? Ho sostituito -rfcon un più sensato-i
Nifle
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.