2012-06-15 7 views
5

Normalmente, no edita un archivo en vim. Si ejecuta vim foo, edite, escriba y salga, vim unlinks foo y crea un nuevo archivo y un nuevo enlace llamado foo. Pero, si el archivo tiene más de un enlace, entonces vim realmente modifica el archivo. Por ejemplo:Edite un archivo in situ en vim

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

He estado buscando una manera de editar realmente un archivo, y parece que hay dos opciones. Use ed, o use vim, pero asegúrese de que haya al menos dos enlaces al archivo antes de editar. Supongo que la pregunta es académica, ya que en realidad no importa que vim cree un nuevo archivo si solo hay un enlace, y vim parece hacer lo correcto si se crean enlaces mientras la edición está en marcha, pero tengo curiosidad :

¿es posible hacer que vim siempre edite el archivo y no cree uno nuevo?

+0

Algunas razones por las que hace la diferencia ... ventaja de crear un archivo nuevo e intercambiar el enlace: impide que otros programas vean un archivo parcialmente escrito. Ventaja de escribir el archivo en su lugar: el programa fileschanged (que usa fam) parece ver el cambio más pronto (inmediatamente, en lugar de 6 segundos más o menos cuando el archivo se elimina y el enlace se intercambia, por alguna razón ... esto es discutible una idiosincrasia en fam o fileschanged) –

Respuesta

9

Consulte la ayuda para la opción backupcopy y las notas en crontab en particular. La respuesta corta es

:set backupcopy=yes 
+1

Gracias. Sin embargo, encuentro que la documentación no es clara. "Cuando el archivo es un enlace, el nuevo archivo no será un enlace". WTF ?? !! ¡Cada enlace es un enlace, y la única forma de acceder a un archivo es a través de un enlace! –

2

El truco es decirle a Vim utilizar un backupfile para permitir que el archivo original que se sobrescribe con seguridad, de lo contrario Vim escribiría en un nuevo archivo y luego cambiarle el nombre para reemplazar el original.

Y luego dile a Vim que no escriba el archivo de copia de seguridad en ninguna parte. De esta forma, el comando de escritura normal fallará y la escritura deberá ser forzada.

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

Para ver realmente lo que está pasando a nivel de sistema de archivos, he usado herramientas inotify:

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

Pero cuidado, esto no funciona bien para archivos muy grandes, por ejemplo, me estaba tratando de editar un archivo 10G en su lugar con este método y terminó con un archivo truncado de 1.5 GB, y el resto de los datos se perdió. Y Vim terminó usando casi 2GB de RAM ...

Otra opción sería usar funciones MMap, ej. en una línea de comando de Python.

Cuestiones relacionadas