Bagaimana mencegah Emacs memutus tautan keras?

13

Katakanlah saya punya dua file file1dan file2:

$ echo aaa >file1
$ ln file1 file2

Lalu saya periksa apakah inodenya sama:

$ ls -i
18749779 file1  18749779 file2

yang menunjukkan bahwa kedua file tersebut sebenarnya sama. Sekarang saya mengedit file1di Emacs, dan menambahkan baris dengan misalnya teks bbb, dan menyimpannya dan keluar dari Emacs.

Sekarang saya dapat:

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

Jadi tautannya rusak. Perhatikan bahwa ini tidak terjadi ketika saya mengedit file vim, atau jika saya hanya melakukan echo bbb >>file1..

Bagaimana saya bisa mencegah Emacs dari putus tautan keras?

Memperbarui:

Perhatikan bahwa saya punya

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

dalam ~/.emacsfile init saya . Jika saya mengedit file1menggunakan emacs -Q file1sebagai gantinya, saya mendapatkan file yang dipanggil file1~di direktori saat ini yang terhubung ke file2(memiliki inode yang sama) tetapi file1~belum dimodifikasi (jadi identik dengan yang lama file1) .. Ini bukan yang saya inginkan. Saya ingin keduanya file1dan file2menjadi file yang sama, dan untuk memasukkan konten file yang diperbarui.

Håkon Hægland
sumber
3
Ok, saya pikir saya menemukan solusinya: Jika saya menambahkan (setq backup-by-copying t)ke ~/.emacsfile init saya itu berfungsi seperti yang diinginkan ..
Håkon Hægland

Jawaban:

10

@ Hakon memecahkan masalahnya sendiri dengan:

(setq backup-by-copying t)

Jika Anda lebih memilih untuk mempertahankan perilaku default, dan menggunakan back-up-by-copyinghanya untuk file hard-linked, Anda dapat menggunakan ini sebagai gantinya (dan cuti backup-by-copyingset untuk nil):

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

Selain itu, seperti yang ditunjukkan oleh @Harald Anda dapat menetapkan back-up-by-copyingsebagai variabel file-lokal sebagai gantinya, untuk mengaktifkan fitur ini hanya untuk file individual.

Penjelasan tentang perilaku ini dari manual Emacs :

File cadangan dapat dibuat dengan menyalin file lama atau dengan mengubah nama file. Ini membuat perbedaan ketika file lama memiliki banyak nama (tautan keras). Jika file lama diubah namanya menjadi file cadangan, maka nama alternatif menjadi nama untuk file cadangan. Jika file lama disalin sebagai gantinya, maka nama alternatif tetap nama untuk file yang sedang Anda edit, dan konten yang diakses oleh nama-nama itu akan menjadi konten baru.

Lihat halaman tertaut untuk diskusi lebih lanjut.

Tyler
sumber
2
Perhatikan bahwa Anda dapat mengatur ini sebagai file variabel lokal, jika Anda tidak ingin perilaku ini untuk semua file.
Harald Hanche-Olsen
@ HaraldHanche-Olsen mencatat!
Tyler