354

Emacs 将备份文件放在foo~任何地方,我不喜欢记住删除它们。此外,如果我编辑的文件在文件系统的其他位置具有硬链接,那么当我完成编辑时,硬链接会指向备份,这会让人感到困惑和糟糕。我怎样才能消除这些备份文件,或者让它们放在同一个目录以外的地方?

4

5 回答 5

564

如果您曾经被 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)

想到这我就恶心。

于 2008-09-30T06:15:25.427 回答
78

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

备份文件

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

无论您保存文件多少次,备份都保持不变。如果您杀死缓冲区然后再次访问该文件,或者下次启动新的 Emacs 会话时,将创建一个新的备份文件。新备份在重新打开后或在编辑会话开始时反映文件的内容。但是现有的备份永远不会再被触及。因此,我发现创建编号备份很有用(请参阅下面的配置)。

要显式创建备份,请使用带有前缀参数的save-buffer( )。C-x C-s

diff-backup并将dired-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 或 X 会话崩溃,自动保存的文件仍然存在。

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

从自动保存的文件中恢复的首选方法是M-x revert-buffer RET. Emacs 将询问“缓冲区最近已自动保存。从自动保存文件恢复?” 或“从文件 FILENAME 恢复缓冲区?”。如果是后者,则没有自动保存文件。例如,因为您在键入另一个auto-save-intervall击键之前已经保存,在这种情况下,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-*-

在文件中。

于 2013-08-20T08:47:43.157 回答
71

接受的答案很好,但可以通过在每次保存时额外备份 和备份版本化文件来大大改进。

首先,接受的答案中描述的基本设置:

(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 会话中第一次保存缓冲区时执行一次。这些模拟 Emac 的默认备份行为。

  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)

在我之前提交大约三个小时后,我开始对这个话题产生了浓厚的兴趣,$<而不是 $@在我的 :PMakefile

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

于 2013-12-29T11:22:45.143 回答
32

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

M-x customize-group

然后在Customize group:提示符处输入backup.

如果您滚动到缓冲区的底部,您将看到Backup Directory Alist。单击Show Value并将列表的第一个条目设置如下:

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

或者,您可以关闭备份我的设置将备份文件设置为off.

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

于 2008-09-30T08:14:27.683 回答
32

您可以通过以下方式完全禁用它们

(setq make-backup-files nil)
于 2009-01-21T21:24:48.493 回答