Emacsがハードリンクを壊すのを防ぐ方法は?


13

のは、私は2つのファイルを持っていると言うfile1file2

$ echo aaa >file1
$ ln file1 file2

次に、iノードが同じであることを確認します。

$ ls -i
18749779 file1  18749779 file2

これは、2つのファイルが実際には同じであることを示しています。次にfile1、Emacsで編集し、たとえばテキストを含む行を追加してbbb、保存してEmacsを終了します。

今私は得る:

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

したがって、ハードリンクが壊れています。これは、でファイルを編集するvim場合、または単に編集する場合には発生しませんecho bbb >>file1

Emacsがハードリンクを壊さないようにするにはどうすればよいですか?

更新:

私が持っていることに注意してください

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

私の~/.emacsinitファイルで。代わりにをfile1使用して編集するemacs -Q file1file1~、現在のディレクトリにリンクされているfile2(同じiノードを持つ)ファイルが取得されますが、file1~変更されていません(そのため、古いと同じですfile1)。これは私が望んでいることではありません。両方file1file2同じファイルにして、更新されたファイルの内容を含めたいです。


3
わかりました、私は解決策を見つけたと思います:initファイルに追加する(setq backup-by-copying t)と、~/.emacs期待どおりに機能します。
HåkonHæglandDec

回答:


10

@Hakonは彼自身の問題を解決しました:

(setq backup-by-copying t)

デフォルトの動作を保持し、back-up-by-copyingハードリンクされたファイルにのみ使用する場合は、代わりにこれを使用できます(backup-by-copying設定をのままにしておきますnil)。

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

さらに、@ Haraldが指摘したback-up-by-copyingように、代わりにファイルローカル変数として設定して、個々のファイルに対してのみこの機能をオンにすることができます。

Emacs マニュアルからのこの動作の説明

古いファイルをコピーするか、名前を変更することで、バックアップファイルを作成できます。これは、古いファイルに複数の名前(ハードリンク)がある場合に違いがあります。古いファイルの名前がバックアップファイルに変更されると、代替名がバックアップファイルの名前になります。代わりに古いファイルがコピーされる場合、代替名は編集中のファイルの名前のままであり、それらの名前によってアクセスされるコンテンツは新しいコンテンツになります。

詳細については、リンク先のページをご覧ください。


2
すべてのファイルに対してこの動作を望まない場合は、これをファイルローカル変数として設定できることに注意してください。
Harald Hanche-Olsen 2014

@ HaraldHanche-Olsenに注目!
タイラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.