Come posso impedire a Vim di lasciare troppi file (come scambio, backup, annullamento)?


13

Per impostazione predefinita, vimlascia i file di scambio nella directory del mio progetto e, in caso di arresto anomalo, lascia i file di backup.

Posso impedirlo? O devo aggiornare tutti i .VCSignorefile dei miei progetti ?

Risposte:


16

File di backup

Per impostazione predefinita, Vim non lascia indietro i file di backup. Sono semplicemente file temporanei che esistono mentre Vim sta salvando il buffer su disco. Come descritto in :help backup-tablequesto comportamento, può essere controllato dalle opzioni 'backup'e 'writebackup':

'backup' 'writebackup'  action  ~
   off       off    no backup made
   off       on     backup current file, deleted afterwards (default)
   on        off    delete old backup, backup current file
   on        on     delete old backup, backup current file

Scambia file

Per quanto riguarda i file di scambio, può essere utile raccoglierli in una directory dedicata. Questo può essere fatto con l' 'directory'opzione. Per esempio

:set directory^=$HOME/.vim/tmp//

verrà aggiunto $HOME/.vim/tmpalla testa dell'elenco di directory che Vim proverà a utilizzare durante la creazione di un file di scambio. Il trailing //fa in modo che Vim codifichi l'intero nome del percorso nel file in modo che non vi siano collisioni con file con nomi simili da directory diverse.

Avvertenza : questo disabilita efficacemente la possibilità per Vim di notare se più utenti stanno provando a modificare lo stesso file poiché i file di scambio sono memorizzati in posizioni diverse.

Lo snippet di seguito (adattato dal vimrc di tpope ) disabiliterà anche il file di scambio per un buffer quando non viene modificato, in questo modo se Vim / il tuo computer si arresta in modo anomalo quando hai un mucchio di file aperti, i file di scambio lasciati indietro saranno solo per 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, questo ha un effetto simile all'impostazione 'directory'. Se il buffer non è modificato, un altro Vim può iniziare a modificarlo senza preavviso. 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.


5

Uso il mio .vimrcsu più macchine, inclusi i server condivisi. Non voglio necessariamente che le persone siano in grado di vedere i file su cui sto lavorando e mi piace mantenere la mia directory home relativamente pulita. Quindi questa è la mia soluzione che funzionerà bene su Linux e Mac OS X.

" Sets central temp file location, to prevent local default behavior.
if isdirectory($HOME . '/.vim/.tmp') == 0
  :silent !mkdir -m 700 -p ~/.vim/.tmp > /dev/null 2>&1
endif

set backupdir=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,
set directory=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,

Nota che questo creerà una .tmpdirectory sotto ~/.vimse non esiste già. Questa sarebbe la nuova home dei tuoi file di scambio. Per i file di annullamento, ho anche quanto segue nel mio .vimrc(che è abbastanza simile):

if exists("+undofile")
  " undofile -- This allows you to use undos after exiting and 
  "             restarting. NOTE: only present in 7.3+
  "             :help undo-persistence
  if isdirectory( $HOME . '/.vim/.undo' ) == 0
    :silent !mkdir -m 700 -p ~/.vim/.undo > /dev/null 2>&1
  endif
  set undodir=~/.vim/.undo
  set undofile
endif

1

Questo è ciò che faccio nel mio vimrc:

fun! MkdirIfNeeded(dir, flags, permissions)
    if !isdirectory(a:dir)
        call mkdir(a:dir, a:flags, a:permissions)
    endif
endfun

" Set (& create if needed) a temp directory to keep backup & swap files
if has('win32')
    let whoami = substitute(system("whoami /LOGONID"), '\n', '', '')
    let tmpdir = 'C:/tmp/vim_' . whoami
else
    let whoami = substitute(system("whoami"), '\n', '', '')
    let tmpdir = '/var/tmp/vim_' . whoami
endif
call MkdirIfNeeded(tmpdir, 'p', 0700)

let &backupdir = tmpdir
let &dir = tmpdir
let &undodir = tmpdir

Verrà creato /var/tmp/vim_<username>e utilizzato per archiviare tutti i file relativi a VIM. Mantenere pulita la directory del progetto.

L'uso di whoamiassicura che è possibile utilizzare vimrc a livello globale (ad es. Per l'utente e root) mentre si utilizzano ancora directory separate; se non ti serve, puoi sostituirlo con una directory codificata per un avvio più rapido. Puoi anche usare la ~/.vim/directory, ma mi piace usarla /var/tmpperché di solito è un filesystem separato.

Uso /var/tmpperché /tmpviene spesso cancellato al riavvio. Probabilmente non vuoi che questa directory sia scrivibile in tutto il mondo, poiché le persone potrebbero quindi posizionare i file lì per fare cose potenzialmente dannose quando apri un file.


1
/var/tmpè sempre scrivibile dal mondo, è una directory temp di sistema. (Beh, puoi cambiarlo in non essere, ma questa è una di quelle cose in cui i sistemi simili a Unix sono felici di lasciarti tenere i pezzi dopo averlo rotto). Se hai un altro utente sul sistema, lui / lei potrebbe creare /var/tmp/vim_«your_username»con le autorizzazioni di sua scelta. E poi riempilo con collegamenti simbolici ai tuoi file importanti, che probabilmente saranno distrutti dai tempfile di VIM.
derobert,

@derobert Solo se non esiste. Se usi questo sistema e hai molti utenti, probabilmente vorrai aggiungere la creazione di questa directory addusero qualunque cosa tu stia usando per creare utenti. In ogni caso, la maggior parte delle persone usa Vim su macchine affidabili (ma il tuo commento è buono, in quanto tale).
Martin Tournoij,

Corretto, solo se non esiste. Il che, trovandosi in una directory temporanea di sistema, avviene in modo imprevedibile in base alla ripulitura di quei file temporanei. Non so perché non lo metti da $HOMEqualche parte.
derobert,

@derobert Bene, /var/è un filesystem diverso. La teoria è che impedirà un sacco di scritture su /, /usro /home, portando a meno frammentazione e rischio di corruzione dei file in caso di crash ... Questo è anche il motivo per cui le cassette postali e le cose sono attive /varper impostazione predefinita, e non nella homedir ...
Martin Tournoij,
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.