Como impedir o Emacs de quebrar links físicos?

13

Digamos que eu tenho dois arquivos file1e file2:

$ echo aaa >file1
$ ln file1 file2

Então eu verifico se os inodes são os mesmos:

$ ls -i
18749779 file1  18749779 file2

o que mostra que os dois arquivos são realmente iguais. Agora edito file1no Emacs e adiciono uma linha com, por exemplo, o texto bbb, salve-o e saia do Emacs.

Agora eu recebo:

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

Portanto, o link rígido está quebrado. Observe que isso não acontece quando edito o arquivo vimou simplesmente o faço echo bbb >>file1.

Como posso impedir que o Emacs quebre links físicos?

Atualizar:

Note que eu tenho

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

no meu ~/.emacsarquivo init. Se eu editar file1usando emacs -Q file1, em vez disso, recebo um arquivo chamado file1~no diretório atual vinculado a file2(tem o mesmo inode), mas o file1~não foi modificado (portanto, é idêntico ao antigo file1) .. Não é isso que desejo. Eu gostaria tanto file1e file2ser o mesmo arquivo, e para incluir o conteúdo do arquivo atualizado ..

Håkon Hægland
fonte
3
Ok, acho que encontrei a solução: se eu adicionar (setq backup-by-copying t)ao meu ~/.emacsarquivo init, ele funcionará como desejado .. #
702 Håkon Hægland

Respostas:

10

@Hakon resolveu seu próprio problema com:

(setq backup-by-copying t)

Se você preferir manter o comportamento padrão e usar back-up-by-copyingapenas arquivos vinculados, você pode usá-lo (e deixar backup-by-copyingdefinido como nil):

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

Além disso, como apontado por @Harald, você pode definir back-up-by-copyingcomo uma variável local do arquivo, para ativar esse recurso apenas para arquivos individuais.

A explicação desse comportamento no manual do Emacs :

Os arquivos de backup podem ser criados copiando o arquivo antigo ou renomeando-o. Isso faz diferença quando o arquivo antigo possui vários nomes (links físicos). Se o arquivo antigo for renomeado para o arquivo de backup, os nomes alternativos se tornarão nomes para o arquivo de backup. Se o arquivo antigo for copiado, os nomes alternativos permanecem como nomes para o arquivo que você está editando e o conteúdo acessado por esses nomes será o novo conteúdo.

Veja a página vinculada para mais discussões.

Tyler
fonte
2
Observe que você pode definir isso como uma variável local do arquivo, caso não queira esse comportamento para todos os arquivos.
Harald Hanche-Olsen
@ HaraldHanche-Olsen observou!
Tyler