我该如何控制Emacs生成备份文件的方式?

363

Emacs在各处放置备份文件,文件名为foo~,我不喜欢要记得删除它们。此外,如果我编辑一个文件,在文件系统的其他位置有一个硬链接,则编辑完成后,硬链接指向备份文件,这很令人困惑和难受。如何消除这些备份文件或使它们进入其他目录?

7个回答

585
如果你曾经因为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)

虽然想到这个让我感到不舒服。


40
为什么要使用备份?为什么不使用Git/Mercurial?好的版本控制系统和编程方法应该胜过编辑器个人文件备份。 - vol7ron
58
备份是用于在您编辑某些未受版本控制的内容时使用的 - 比如配置文件或一些临时的东西,您还没有把它放入版本控制中。当您没有按照应该做的去做时,编辑器会挽救你的颈部。 - Eponymous
75
@vol7ron - 那是错的。你不应该把你不想要保留的垃圾放到版本控制中。这只会让寻找重要内容变得更加困难。相反,将你的编辑器备份用于它们擅长的领域(在紧急情况下备份更改),将版本控制用于它所擅长的领域(保留软件的重要版本并促进团队开发)。使用正确的工具来做正确的事情。 - T.E.D.
8
因为评判性原因而进行否定投票。备份文件增加了很多额外的负担,几乎没有什么价值。无论如何,您都必须保存以运行测试,因此很少超过5分钟没保存。即使我在编辑非版本控制的配置文件,Emacs也会经常崩溃吗?什么工作流需要这种负担呢? - Joshua Cheek
29
“备份文件增加了很多开销,几乎没有什么价值”:这不是一种评判吗? - Miserable Variable
显示剩余25条评论

88

Emacs备份/自动保存文件非常有用。但是这些功能很容易令人困惑。

备份文件

备份文件以波浪号(~~9~)结尾,应写入用户主目录。当make-backup-files为非nil时,Emacs会在从缓冲区第一次保存文件时自动创建原始文件的备份。如果你正在编辑新文件,则第二次保存文件时Emacs将创建备份。

无论你保存文件多少次,备份都不会改变。如果你杀死缓冲区并重新访问文件,或下一次启动新的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-s (save-buffer) 保存文件之前,Emacs 会根据计数击键(auto-save-interval)或停止输入(auto-save-timeout)自动保存文件。
  • 当 Emacs 崩溃时,包括使用 shell 命令杀死 Emacs 作业时,Emacs 也会自动保存。

当用户保存文件时,自动保存的版本将被删除。但是,如果用户退出而没有保存文件,Emacs 或 X 会话崩溃,则自动保存的文件仍然存在。

使用 revert-bufferrecover-file 来恢复自动保存的文件。请注意,Emacs 记录了以后要在文件 ~/.emacs.d/auto-save-list 中恢复的中断会话。 recover-session 函数将使用此信息。

从自动保存的文件中恢复的首选方法是 M-x revert-buffer RET。Emacs 会询问“缓冲区最近已经自动保存。从自动保存的文件还原?”或“从文件 FILENAME 还原缓冲区?”。如果是后者,则没有自动保存的文件。例如,因为您在输入另一个 auto-save-interval 击键之前保存了,此时 Emacs 已删除了自动保存的文件。

由于连接到慢速机器时它可能会减慢编辑速度,而且许多文件包含敏感数据,因此现在默认情况下禁用了自动保存。

配置

以下是我认为最好的配置:

(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)
      )

敏感数据

另一个问题是您不希望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
3
默认情况下,我总是使用自动保存和备份功能,但对于包含敏感信息的文件除外。敏感模式将禁用自动保存和备份。顺便说一句,“#file.ext#” 文件并不是真正讨厌,因为 Emacs 会根据需要创建和删除它们。如果它们仍然存在,则表示 Emacs 仍在运行,或者它们是崩溃的 Emacs 的遗留物。在这两种情况下,它们可以拯救全局 ;) - Andreas Spindler
啊,谢谢你提供的额外信息。我确实有大部分积极的经验(他们曾经拯救了我的一天)。只有当你在寻找丑陋的时候,你就会发现它在那里 :) - PascalVKooten
顺便提一下,备份文件和恢复备份是两回事。因此,尝试使用自动保存功能。终止 Emacs 任务或 SSH 会话。如果存在自动保存文件,请将其与实际文件进行“差异”比较。然后启动 Emacs,并亲自体验“revert-buffer”的功能。在紧急情况下,这将很快产生回报。 - Andreas Spindler
敏感模式非常好用。谢谢。请注意,在您的帖子中,您称其为sensitive-minor-mode,而在定义(链接)中它被称为sensitive-mode。也许您想要对齐一下。 - HeyMan
显示剩余3条评论

75

这篇被采纳的答案很不错,但是可以通过在每次保存时额外备份和备份版本化的文件来大大改进。

首先,按照被采纳的答案中描述的基本设置:

(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)

最后,每次保存都备份而不仅仅是第一次。我们有两种备份方式:

  1. 会话级别备份:在每个 Emacs 会话中缓冲区首次保存时进行备份。这模拟了 Emacs 的默认备份行为。

  2. 保存级别备份:每次保存时备份。Emacs 默认不会执行此操作,但如果您长时间运行 Emacs,则非常有用。

备份文件会存储在不同的位置,如果不存在备份目录,则 Emacs 会自动创建它们:

;; 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)

在我之前提交代码后的三个小时,当我在Makefile中写$<而不是$@时,我对这个主题产生了浓厚的兴趣 :P

以上内容基于我大量编辑过的Emacs Wiki页面


1
我将上述代码粘贴到了我的init.el文件中,但是我没有得到任何备份目录,而且emacs仍然在各个地方创建备份文件。我可能误解了什么,我是emacs的新手:P - Soeholm
1
现在它开始工作了。我已经把所有的代码粘贴进去了,所以我不确定为什么它在接受我的新配置时变得很慢。但非常感谢! - Soeholm
2
作为后续,我现在知道为什么它没有起作用了。它在一台机器上运行正常,但在另一台机器上却不行。这是因为我在我的主目录中有一个空的.emacs文件,它优先于我的.emacs.d目录。愚蠢的错误... - Soeholm
我不知道为什么它不保存我正在工作的文件,但它只保存新创建的文件。 - alper
1
@tkp:动机是能够完全将文件恢复到会话开始时的状态。如果没有“每个会话”备份,可能很难确定哪个“每次保存”备份是会话开始时的备份(但在许多情况下,我想这可能是当天的第一次保存)。 - ntc2
显示剩余2条评论

33

你可以通过以下方法完全禁用它们:

(setq make-backup-files nil)

我喜欢在Shell提示符中设置这个,当我从主机跳转到主机时,我不想拥有.emacs文件:emacs --eval "(setq make-backup-files nil)" - Dave Morse

33

通过自定义界面,配置备份选项的另一种方法。输入:

M-x customize-group

然后在 自定义组: 提示处输入 backup

如果您滚动到缓冲区底部,将会看到 备份目录列表。点击 显示值 并将列表的第一个条目设置如下:

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

或者,您可以通过设置备份文件off来关闭备份。

如果您不希望Emacs自动编辑您的.emacs文件,则需要设置自定义文件


5
我希望我两年前就知道 customize-group。谢谢! - wprl

1

(setq delete-auto-save-files t)

当缓冲区被保存或在其中没有更改的情况下被杀死时,删除缓冲区的自动保存文件。因此,您仍然可以获得一些自动保存文件的安全性,因为它们只会在缓冲区带有未保存的更改或Emacs意外退出时留下。如果您想这样做,但确实需要某些文件的历史记录,请考虑将它们放在源代码控制下。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接