2012-06-15 15 views
5

Normalmente, in realtà non modificare un file in vim. Se si esegue vim foo, modificare, scrivere e uscire, vim scollega foo e crea un nuovo file e un nuovo collegamento denominato foo. Ma, se il file ha più di un collegamento, allora vim modifica effettivamente il file. Ad esempio:Modifica un file sul posto in vim

$ ls -i foo 
19428852 foo 
$ vi foo 
$ ls -i foo 
19428857 foo 
$ ln foo bar 
$ vi bar 
$ ls -i bar 
19428857 bar 

Ho cercato un modo per modificare effettivamente un file e sembra che ci siano due scelte. Utilizzare ed o utilizzare vim ma assicurarsi che vi siano almeno due collegamenti al file prima di modificare. Suppongo che la domanda sia accademica, in quanto non importa che Vim crei un nuovo file se c'è un solo link, e vim sembra fare la cosa giusta se i collegamenti vengono creati mentre il montaggio è in corso, ma sono curioso :

è possibile fare vim modificare sempre il file, e non crearne uno nuovo?

+0

Alcuni motivi per cui si fa la differenza ... vantaggio di creare un nuovo file e scambiare il link: impedisce altri programmi di vedere un file parzialmente scritta. Vantaggio di scrivere il file al suo posto: il programma fileschaged (che usa fam) sembra vedere prima il cambiamento (immediatamente, contro 6 secondi circa quando il file viene cancellato e il link scambiato, per qualche motivo ... questo è discutibilmente una idiosincrasia in fam o fileschanged) –

risposta

9

Controllare l'aiuto per l'opzione backupcopy e le note su crontab in particolare. La risposta breve è

:set backupcopy=yes 
+1

Grazie. Trovo che la documentazione non è chiara, però. "Quando il file è un collegamento, il nuovo file non sarà un collegamento". WTF ?? !! Ogni link è un link e l'unico modo per accedere a un file è attraverso un link! –

2

Il trucco è quello di dire a Vim di usare un backupfile per consentire il file originale per essere sovrascritto in modo sicuro, altrimenti Vim avrebbe scritto in un nuovo file e poi rinominarlo per sostituire l'originale.

E poi dire a Vim di scrivere il backupfile da nessuna parte. In questo modo il normale comando di scrittura fallirà e la scrittura deve essere forzata.

:set noswapfile 
:set backupcopy=yes 
:set backupdir='' 
:e big 
(hit Crtl-C to stopo line count and syntax highlight) 
(edit the file) 
:w! 

Per vedere realmente ciò che sta accadendo a livello di file system, ho usato gli strumenti inotify:

inotifywait -m -r /path/to/my_test_dir/ 

Ma attenzione, questo non funziona bene per i file molto grandi, per esempio, ho stava provando a modificare un file 10G sul posto con questo metodo e ha finito con un file troncato di 1.5 GB, e il resto dei dati è stato perso. E Vim finito per usare quasi 2GB di RAM ...

altra opzione sarebbe quella di utilizzare le funzioni di mmap, ad es. in una riga di comando Python.