Emacsがバックアップファイルを作成する方法をどのように制御しますか?


326

Emacsはfoo~どこにでも名前が付けられたバックアップファイルを置いており、それらを削除することを覚える必要がないのが好きです。また、ファイルシステム内の別の場所にハードリンクがあるファイルを編集すると、編集が完了したときにハードリンクがバックアップを指すため、混乱を招き、ひどいものになります。これらのバックアップファイルを削除したり、同じディレクトリ以外の場所に移動したりするにはどうすればよいですか?

回答:


518

Emacsのバックアップファイルで保存したことがある場合は、それらのファイルを少なくするのではなく、より多く必要とするでしょう。編集中のファイルと同じディレクトリに移動するのは面倒ですが、簡単に変更できます。次のようなものをに置くことで、すべてのバックアップファイルをディレクトリに入れることができます .emacs

(setq backup-directory-alist `(("." . "~/.saves")))

Emacsがバックアップファイルを作成する方法に関連する難解な詳細がいくつかあります。オリジナルの名前を変更し、編集したバッファを書き出す必要がありますか?オリジナルがリンクされている場合はどうなりますか?一般に、最も安全ですが最も遅い方法は、常にコピーしてバックアップを作成することです。

(setq backup-by-copying t)

何らかの理由でそれが遅すぎる場合は、も参照してください backup-by-copying-when-linked

現在、バックアップはすべて独自の場所にあるため、バックアップの数を減らすのではなく、増やしたい場合があります。これらの変数については、Emacsのドキュメントをご覧ください(C-h v)。

(setq delete-old-versions t
  kept-new-versions 6
  kept-old-versions 2
  version-control t)

最後に、絶対にバックアップファイルを用意する必要がない場合:

(setq make-backup-files nil)

でもそれを考えるとうんざりします。


6
でも、このような名前のバックアップを作成しています!home!svradmin!
foo〜で

33
なぜバックアップを使用するのですか?なぜgit / mercurialを使わないのですか?良いバージョンエディタによる制御システムおよびプログラミング方法論がすべき切り札個々のファイルのバックアップ
vol7ron

52
@ vol7ron:バックアップは、バージョン管理下にないものを編集しているときのためのものです-構成ファイルや、まだバージョン管理に取り掛かっていない迅速で汚れたものなど。そして、あなたがすべきことをしていないとき、エディタはあなたの首を救います。
町の名を冠した

69
@ vol7ron-それは間違っています。残したくないリビジョン管理にがらくたを置くべきではありません。重要なものを見つけるのが非常に難しくなります。代わりに、エディターのバックアップを使用して(緊急の場合は変更をバックアップ)、リビジョン管理を使用して(ソフトウェアの重要なバージョンを維持し、チームの開発を促進)してください。ジョブに適したツールを使用します。
TED 2013

26
「バックアップファイルは多くのオーバーヘッドを追加し、ほとんど価値がありません」:その判断は違いますか?
悲惨な変数

70

Emacsのバックアップ/自動保存ファイルは非常に役立ちます。しかし、これらの機能は混乱しています。

バックアップファイル

バックアップファイルの最後にはチルダ(~または~9~)があり、ユーザーのホームディレクトリに書き込まれます。make-backup-filesが非nilの場合、Emacsは最初にファイルがバッファーから保存されるときに、元のファイルのバックアップを自動的に作成します。新しいファイルを編集している場合、Emacsはファイルを2回保存したときにバックアップを作成します。

ファイルを何度保存しても、バックアップは変更されません。バッファを削除してからファイルに再度アクセスした場合、または次回新しいEmacsセッションを開始したときに、新しいバックアップファイルが作成されます。新しいバックアップには、再び開いた後、または編集セッションの開始時にファイルの内容が反映されます。ただし、既存のバックアップに再度触れることはありません。したがって、番号付きバックアップを作成すると便利です(以下の構成を参照)。

バックアップを作成するには、プレフィックス引数を指定してsave-bufferC-x C-s)を明示的に使用します。

diff-backupdired-diff-backupファイルをそのバックアップと比較したり、その逆を行います。ただし、バックアップファイルを復元する機能はありません。たとえば、Windowsでバックアップファイルを復元するには

C:\Users\USERNAME\.emacs.d\backups\!drive_c!Users!USERNAME!.emacs.el.~7~

手動でコピーする必要があります

C:\Users\USERNAME\.emacs.el

ファイルを自動保存

自動保存ファイルはハッシュマーク(#)を使用し、プロジェクトディレクトリ内でローカルに書き込まれます(実際のファイルとともに)。その理由は、自動保存ファイルは、ファイルが再び保存されるまで(急いで従う場合など)、Emacsが作成する単なる一時ファイルであるためです。

  • ユーザーがC-x C-ssave-buffer)を押してファイルを保存する前Emacsはファイルを自動保存します-キーストロークのカウントに基づいて(auto-save-interval)、または入力を停止したとき(auto-save-timeout)。
  • Emacsは、シェルコマンドを使用してEmacsジョブを強制終了するなど、クラッシュしたときにも自動保存します。

ユーザーがファイルを保存すると、自動保存されたバージョンが削除されます。しかし、ユーザーがファイルを保存せずに終了すると、EmacsまたはXセッションがクラッシュし、自動保存されたファイルがまだ存在します。

revert-bufferまたはrecover-fileを使用して、自動保存ファイルを復元します。Emacsは、中断されたセッションを後でリカバリするために〜/ .emacs.d / auto-save-listという名前のファイルに記録することに注意してください。recover-session関数は、この情報を使用します。

自動保存されたファイルから回復するための推奨される方法はM-x revert-buffer RETです。Emacsは「バッファは最近自動保存されました。自動保存ファイルから戻しますか?」または「ファイルFILENAMEからバッファを元に戻しますか?」後者の場合、自動保存ファイルはありません。たとえば、別のauto-save-intervallキーストロークを入力する前に保存したため、その場合Emacsは自動保存ファイルを削除しました。

自動保存は現在、デフォルトで無効になっています。低速のマシンに接続すると編集が遅くなる可能性があり、多くのファイルには機密データが含まれているためです。

構成

IMHOが最適に機能する構成を次に示します。

(defvar --backup-directory (concat user-emacs-directory "backups"))
(if (not (file-exists-p --backup-directory))
        (make-directory --backup-directory t))
(setq backup-directory-alist `(("." . ,--backup-directory)))
(setq make-backup-files t               ; backup of a file the first time it is saved.
      backup-by-copying t               ; don't clobber symlinks
      version-control t                 ; version numbers for backup files
      delete-old-versions t             ; delete excess backup files silently
      delete-by-moving-to-trash t
      kept-old-versions 6               ; oldest versions to keep when a new numbered backup is made (default: 2)
      kept-new-versions 9               ; newest versions to keep when a new numbered backup is made (default: 2)
      auto-save-default t               ; auto-save every buffer that visits a file
      auto-save-timeout 20              ; number of seconds idle time before auto-save (default: 30)
      auto-save-interval 200            ; number of keystrokes between auto-saves (default: 300)
      )

機密データ

もう1つの問題は、Emacsに機密データを含むファイルのコピーを配布させたくないということです。このモードはファイルごとに使用します。これはマイナーモードなので、私の目的のために名前を変更しましたsensitive-minor-mode

すべての.vcfおよび.gpgファイルに対してそれを有効にするには、.emacsで次のようなものを使用します。

(setq auto-mode-alist
      (append
       (list
        '("\\.\\(vcf\\|gpg\\)$" . sensitive-minor-mode)
        )
       auto-mode-alist))

または、一部の.txtファイルなどの一部のファイルのみを保護するには、次のような行を使用します。

// -*-mode:asciidoc; mode:sensitive-minor; fill-column:132-*-

ファイル内。


自動保存を使用しないのですか?これらの設定により、フォルダ内の厄介な#filename.tex#ファイルを表示する必要がなくなりますか?
PascalVKooten 2013年

3
機密データを含むファイルを除き、私は常にデフォルトで自動保存ファイルとバックアップファイルを使用します。機密モードでは、自動保存とバックアップが無効になります。ところで、Emacsは必要に応じてそれらを作成および削除するため、#file.ext#ファイルは実際には厄介ではありません。Emacsがまだ実行されているか、クラッシュしたEmacsのアーティファクトである場合は、どちらの場合も、彼らはその日を救うことができます;-)
Andreas Spindler

ああ、その追加情報をありがとう。確かに私は彼らとほとんど前向きな経験をしています(彼らは私の日を救いました)。醜さを探しているときだけ、うまくいきました:)
PascalVKooten 2013年

ところで、バックアップを作成することと、バックアップを復元することは別のものです。したがって、自動保存で遊んでください。Emacsジョブまたはsshセッションを終了します。自動保存ファイルがあるdiff場合は、実際のファイルと一緒に保存します。次に、Emacsを起動して、自分で何revert-bufferができるかを調べます。これは緊急の場合にすぐに報われます。
Andreas Spindler、2015

センシティブモードはうまく機能します。ありがとう。あなたの投稿ではそれをsensitive-minor-modeと呼びますが、定義(リンク)ではsensitive-modeと呼ばれていることに注意してください。多分あなたはそれを調整したいでしょう。
HeyMan 2018

65

受け入れ答えは良いですが、それは非常に別途ことによって改善することができる上、バックアップ のすべての保存とバックアップバージョン管理ファイルを

まず、受け入れられた回答に記載されている基本設定:

(setq version-control t     ;; Use version numbers for backups.
      kept-new-versions 10  ;; Number of newest versions to keep.
      kept-old-versions 0   ;; Number of oldest versions to keep.
      delete-old-versions t ;; Don't ask to delete excess backup versions.
      backup-by-copying t)  ;; Copy all files, don't rename them.

次に、バージョン管理されたファイルもバックアップします。Emacsはデフォルトではこれを行いません(保存するたびにコミットするわけではありませんよね?):

(setq vc-make-backup-files t)

最後に、最初の保存だけでなく、保存ごとにバックアップを作成します。2種類のバックアップを作成します。

  1. セッションごとのバックアップ:各Emacsセッションでバッファの最初の保存時に1回。これらはEmacのデフォルトのバックアップ動作をシミュレートします。

  2. ごとの保存・バックアップ:上の一回ごとに保存。Emacsはデフォルトではこれを行いませんが、Emacsを長時間実行したままにしておくと非常に便利です。

バックアップは別の場所に行くと、彼らが存在しない場合はEmacsが自動的にバックアップのdirsを作成します。

;; Default and per-save backups go here:
(setq backup-directory-alist '(("" . "~/.emacs.d/backup/per-save")))

(defun force-backup-of-buffer ()
  ;; Make a special "per session" backup at the first save of each
  ;; emacs session.
  (when (not buffer-backed-up)
    ;; Override the default parameters for per-session backups.
    (let ((backup-directory-alist '(("" . "~/.emacs.d/backup/per-session")))
          (kept-new-versions 3))
      (backup-buffer)))
  ;; Make a "per save" backup on each save.  The first save results in
  ;; both a per-session and a per-save backup, to keep the numbering
  ;; of per-save backups consistent.
  (let ((buffer-backed-up nil))
    (backup-buffer)))

(add-hook 'before-save-hook  'force-backup-of-buffer)

以前のコミットから約3時間後、私のでは$<なく、 $@で書いた後、私はこのトピックに非常に興味を持ちましたMakefile:P

上記は、私が大幅に編集したEmacs Wikiページに基づいています


上記のコードをinit.elファイルに貼り付けましたが、バックアップディレクトリを取得できず、emacsはバックアップファイルをすべて作成します。私は何かを誤解したかもしれませんが、emacsは初めてです:P
Soeholm

@Soeholm:私の回答の先頭にあるsを含むすべてのコードを私の回答に貼り付けsetqましたか?上記はEmacs 24.5.1で動作します。
ntc2 2015年

それは今働き始めました。すべてのコードを貼り付けたので、新しい構成を受け入れるのに時間がかかった理由がわかりません。しかし、どうもありがとう!
Soeholm 2015年

1
フォローアップとして、なぜそれが今うまくいかなかったのか知っています。1台のマシンでは機能しましたが、もう1台では機能しませんでした。これは、ホームディレクトリに空の.emacsファイルがあり、.emacs.dディレクトリよりも優先されたためです。愚かな間違い..
Soeholm

31

バックアップオプションを設定する別の方法は、カスタマイズインターフェイスを使用することです。入る:

M-x customize-group

そしてCustomize group:プロンプトでと入力しbackupます。

バッファの一番下までスクロールすると、バックアップディレクトリリストが表示されます。[ 値の表示]をクリックして、リストの最初のエントリを次のように設定します。

Regexp matching filename: .*
Backup directory name: /path/to/your/backup/dir

または、[ バックアップファイルを作成する]の設定からバックアップをオフにすることもできますoff

Emacsで.emacsファイルを自動的に編集したくない場合は、カスタマイズファイル設定する必要があります


4
customize-group2年くらい前に知っていたらよかったのに。ありがとうございました!
wprl 2012

30

あなたはそれらを完全に無効にすることができます

(setq make-backup-files nil)

これをシェルプロンプトから設定します。ホストからホストにホッピングしているとき、.emacsファイルを使いたくありません。emacs--eval "(setq make-backup-files nil)"
Dave Morse
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.