Come rilevare se i file swp contengono modifiche non salvate?


11

Quando modifico il codice sorgente usando gvim (v.7.4.488), voglio commettere alcune modifiche al vcs (sto usando git 2.1.4 dalla riga di comando in Ubuntu Linux).

git --status

mostra quali file ho modificato. Tuttavia, mostra anche la vim .*.swpdei buffer attualmente visibili (sia se il file contiene modifiche non salvate sia quando il file modificato è uguale al .*.swpfile -file). Ovviamente, git può ignorare questi file o vim può archiviare i file di scambio in una posizione diversa (vedi vim.wikia o questa domanda su StackOverflow ). Ma mi piacciono i file che .*.swpcompaiono git --statusquando contengono modifiche non salvate, poiché mi segnala che sto eseguendo il commit di file in uno stato diverso rispetto a quello in cui penso si trovino.

Come posso evitare i falsi positivi di .*.swp-file che appaiono git --statusquando il file salvato è uguale al .*.swp-file, mentre sono in grado di vedere che il file da commettere è in uno stato diverso da quelli che sto modificando con VIM?

  • È possibile avere solo .*.swp-file, quando file su disco e file in vim sono diversi?
  • Esiste un altro modo per rilevare i file non salvati?

La combinazione dei commenti di @elyashiv e @VanLaser si traduce in un metodo più semplice rispetto al rilevamento se i file di scambio implicano file non salvati:

  1. non lasciare che git ignori i file. *. sw [po];
  2. quando si commette, se git --statusrivela qualche file, .*.sw[po]fare un :wain vi; e,
  3. aggiungere e impegnare.

1
puoi usare :waper assicurarti che non ci siano file non salvati.
elyashiv,

2
davvero, è molto "più sano" assicurarsi che tutti i tuoi file vengano salvati prima di te git commit...
VanLaser

Risposte:


8

vim -rdalla riga di comando elencherà tutti i file di scambio nella directory corrente e nelle directory temporanee e se contengono eventuali modifiche non salvate. Cerca la linea che dice modified: no/YES.

Non so come dire a Vim di cercare in una directory diversa, quindi dovrai passare a ciascuna directory che contiene un file di scambio ed eseguire vim -r. È possibile creare uno script che analizzi git statuso utilizzi l'output find -name '.*.sw[po]'e quindi venga eseguito vim -rin ciascuna directory per mostrare tutti i file di scambio con modifiche non salvate.

(Io uso .*.sw[po]invece di .*.swp, perché a volte i .swofile vengono creati in aggiunta ai .swpfile, quando si modifica un file che ha già un file di scambio. I .swnfile possono essere creati anche se si modifica un file con due file di scambio esistenti, ma non credo Ne ho mai visto uno in natura. Se sei davvero paranoico, potresti usarlo .*.sw[a-p]o semplicemente .*.sw?.)

Per :help -rulteriori informazioni -rsull'opzione, :help recover.txtconsultare o per ulteriori informazioni sul recupero e sui nomi dei file di scambio.


1
Bene, i file di scambio di Vim sono file nascosti (che portano .al nome del file) quindi lo schema giusto sarebbe .*.sw[a-p](anche se in casi patologici, potresti effettivamente arrivare fino in fondo .foo.saa). Ciò dovrebbe anche escludere la corrispondenza dei file Flash, poiché dubito che in genere si tratterebbe di un file nascosto.
Jamessan,

@jamessan Il lead .è richiesto in un glob shell, ma *.swpfunziona come argomento per find. Ma il leader .rende le cose più semplici. Grazie!
Lithis,

8
  • È possibile avere solo .*.swp-file, quando file su disco e file in vim sono diversi?

Sì. Lo snippet di seguito (adattato dal vimrc di tpope ) disabiliterà il file di scambio per un buffer quando non viene modificato, quindi i file di scambio esistono solo per i file modificati.

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

Avvertenza : poiché il file di scambio esiste solo quando il buffer viene modificato, si perde l'uso del file di scambio come blocco di avviso. Se il buffer non è modificato, un altro Vim può iniziare a modificarlo senza preavviso che è già aperto. Se il secondo Vim salva prima che il primo apporti più modifiche, non verranno notate finché l'utente non tenta di salvare o qualcosa innesca Vim per verificare se il file è stato modificato.

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.