Jak zapobiec łamaniu twardych linków przez Emacsa?

13

Powiedzmy, że mam dwa pliki file1i file2:

$ echo aaa >file1
$ ln file1 file2

Następnie sprawdzam, czy i-węzły są takie same:

$ ls -i
18749779 file1  18749779 file2

co pokazuje, że dwa pliki są w rzeczywistości takie same. Teraz edytuję file1w Emacsie i dodaję wiersz z na przykład tekstem bbb, zapisuję go i wychodzę z Emacsa.

Teraz dostaję:

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

Więc twardy link jest zepsuty. Pamiętaj, że tak się nie dzieje, gdy edytuję plik vimlub po prostu robię echo bbb >>file1...

Jak mogę zapobiec zerwaniu przez Emacsa twardych linków?

Aktualizacja:

Zauważ, że mam

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

w moim ~/.emacspliku init. Jeśli zamiast tego file1dokonam edycji emacs -Q file1, otrzymam plik wywołany file1~w bieżącym katalogu, który prowadzi do file2(ma ten sam i-węzeł), ale file1~nie został zmodyfikowany (więc jest identyczny ze starym file1). Nie tego pragnę. Chciałbym zarówno file1i file2być tym samym plikiem, i obejmują zaktualizowaną zawartość plików ..

Håkon Hægland
źródło
3
Ok, myślę, że znalazłem rozwiązanie: jeśli dodam (setq backup-by-copying t)do mojego ~/.emacspliku init, to działa zgodnie z potrzebami.
Håkon Hægland

Odpowiedzi:

10

@Hakon rozwiązał swój problem z:

(setq backup-by-copying t)

Jeśli wolisz zachować domyślne zachowanie i używać back-up-by-copyingtylko w przypadku plików połączonych na stałe, możesz użyć tego zamiast tego (i pozostaw backup-by-copyingustawione na nil):

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

Ponadto, jak wskazał @Harald, można back-up-by-copyingzamiast tego ustawić jako zmienną lokalną pliku, aby włączyć tę funkcję tylko dla pojedynczych plików.

Wyjaśnienie tego zachowania z podręcznika Emacsa :

Pliki kopii zapasowej można wykonać, kopiując stary plik lub zmieniając jego nazwę. To robi różnicę, gdy stary plik ma wiele nazw (twarde linki). Jeśli stary plik zostanie zmieniony na plik kopii zapasowej, alternatywne nazwy stają się nazwami pliku kopii zapasowej. Jeśli zamiast tego zostanie skopiowany stary plik, alternatywne nazwy pozostaną nazwami edytowanego pliku, a zawartość, do której te nazwy będą dostępne, będzie nową treścią.

Zobacz link do dalszej dyskusji.

Tyler
źródło
2
Pamiętaj, że możesz ustawić to jako lokalną zmienną pliku, na wypadek, gdyby nie chcesz tego zachowania dla wszystkich plików.
Harald Hanche-Olsen,
@ HaraldHanche-Olsen odnotował!
Tyler,