¿Cómo evitar que Emacs rompa enlaces duros?

13

Digamos que tengo dos archivos file1y file2:

$ echo aaa >file1
$ ln file1 file2

Luego verifico que los inodes son los mismos:

$ ls -i
18749779 file1  18749779 file2

lo que muestra que los dos archivos son realmente iguales. Ahora edito file1en Emacs, y agrego una línea con, por ejemplo, el texto bbb, y lo guardo y salgo de Emacs.

Ahora obtengo:

$ ls -i
18749781 file1  18749779 file2
$ cat file1
aaa
bbb
$ cat file2
aaa

Entonces el enlace duro está roto. Tenga en cuenta que esto no sucede cuando edito el archivo vim, o si simplemente lo hago echo bbb >>file1...

¿Cómo puedo evitar que Emacs rompa enlaces duros?

Actualizar:

Tenga en cuenta que tengo

(require 'backup-dir)
(setq bkup-backup-directory-info
      '((t  "~/.emacs-backups/" ok-create full-path )))

en mi ~/.emacsarchivo init Si edito file1usando en su emacs -Q file1lugar, obtengo un archivo llamado file1~en el directorio actual que enlaza file2(tiene el mismo inodo) pero file1~no ha sido modificado (por lo que es idéntico al anterior file1). Esto no es lo que deseo. Me gustan los dos file1, y file2al ser el mismo archivo, e incluya el contenido del archivo actualizado ..

Håkon Hægland
fuente
3
Ok, creo que encontré la solución: si agrego (setq backup-by-copying t)a mi ~/.emacsarchivo init, funciona como se desea ..
Håkon Hægland

Respuestas:

10

@Hakon resolvió su propio problema con:

(setq backup-by-copying t)

Si prefiere mantener el comportamiento predeterminado y usar back-up-by-copyingsolo para archivos vinculados, puede usar esto en su lugar (y dejarlo backup-by-copyingconfigurado en nil):

(setq backup-by-copying-when-linked t)

Además, como señaló @Harald, puede establecer back-up-by-copyingcomo una variable local de archivo en su lugar, para activar esta función solo para archivos individuales.

La explicación de este comportamiento del manual de Emacs :

Los archivos de respaldo se pueden hacer copiando el archivo antiguo o renombrándolo. Esto hace la diferencia cuando el archivo antiguo tiene varios nombres (enlaces duros). Si el archivo antiguo se renombra en el archivo de respaldo, los nombres alternativos se convierten en nombres para el archivo de respaldo. Si se copia el archivo antiguo, los nombres alternativos seguirán siendo nombres para el archivo que está editando, y los contenidos a los que acceden esos nombres serán los nuevos contenidos.

Vea la página vinculada para más discusión.

Tyler
fuente
2
Tenga en cuenta que puede establecer esto como una variable local de archivo, en caso de que no desee este comportamiento para todos los archivos.
Harald Hanche-Olsen
@ HaraldHanche-Olsen señaló!
Tyler