Come impedire ad Emacs di interrompere collegamenti duri?


13

Diciamo che ho due file file1e file2:

$ echo aaa >file1
$ ln file1 file2

Quindi controllo che gli inode siano gli stessi:

$ ls -i
18749779 file1  18749779 file2

il che dimostra che i due file sono effettivamente gli stessi. Ora modifico file1in Emacs e aggiungo una riga con ad esempio il testo bbb, lo salvo e esco da Emacs.

Ora ottengo:

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

Quindi il collegamento reale è interrotto. Nota che questo non accade quando modifico il file vimo se lo faccio semplicemente echo bbb >>file1..

Come posso evitare che Emacs interrompa i collegamenti reali?

Aggiornare:

Si noti che ho

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

nel mio ~/.emacsfile init. Se modifico file1usando emacs -Q file1invece, ottengo un file chiamato file1~nella directory corrente che collega file2(ha lo stesso inode) ma file1~non è stato modificato (quindi è identico al vecchio file1) .. Questo non è quello che desidero. Mi piacciono entrambi file1e file2di essere lo stesso file, e di includere il contenuto del file aggiornati ..


3
Ok, penso di aver trovato la soluzione: se aggiungo (setq backup-by-copying t)al mio ~/.emacsfile init funziona come desiderato ..
Håkon Hægland

Risposte:


10

@Hakon ha risolto il proprio problema con:

(setq backup-by-copying t)

Se si preferisce mantenere il comportamento predefinito e utilizzarlo back-up-by-copyingsolo per i file con collegamento fisico, è possibile utilizzare questo (e lasciare backup-by-copyingimpostato su nil):

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

Inoltre, come sottolineato da @Harald, puoi invece impostare back-up-by-copyingcome variabile file-local, per attivare questa funzione solo per i singoli file.

La spiegazione di questo comportamento dal manuale di Emacs :

I file di backup possono essere creati copiando il vecchio file o rinominandolo. Questo fa la differenza quando il vecchio file ha più nomi (hard link). Se il vecchio file viene rinominato nel file di backup, i nomi alternativi diventano nomi per il file di backup. Se invece viene copiato il vecchio file, i nomi alternativi rimangono nomi per il file che si sta modificando e i contenuti a cui accedono questi nomi saranno i nuovi contenuti.

Vedi la pagina collegata per ulteriori discussioni.


2
Nota che puoi impostarlo come variabile locale del file, nel caso in cui non desideri questo comportamento per tutti i file.
Harald Hanche-Olsen,

@ HaraldHanche-Olsen notato!
Tyler,
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.