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

Emacs将名为foo~的备份文件放在任何地方,我不喜欢记得删除它们。此外,如果我编辑的文件在文件系统的其他地方有一个硬链接,当我完成编辑时,硬链接指向备份,这是令人困惑和可怕的。我如何消除这些备份文件,或者将它们放到不同于相同目录的其他地方?

128305 次浏览

如果您曾经被Emacs备份文件保存过,那么您 可能想要更多,而不是更少。这很烦人 它们和你正在编辑的文件在同一个目录下, 但这很容易改变。你可以启动所有备份文件 通过将以下内容放入目录 .emacs . < / p >

(setq backup-directory-alist `(("." . "~/.saves")))
有许多神秘的细节与如何Emacs 可能会创建你的备份文件。它应该重新命名原文吗 然后写出编辑过的缓冲区?如果原件是相连的呢? 一般来说,最安全但最慢的方法是始终进行备份 通过复制。< / p >
(setq backup-by-copying t)
如果因为某些原因,这太慢了,你也可以看看 backup-by-copying-when-linked . < / p >

由于您的备份现在都在自己的位置,您可能需要 多一些,而不是少一些。看看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)

但我一想到这事就恶心。

配置备份选项的另一种方法是通过Customize接口。输入:

M-x customize-group

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

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

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

或者,你可以关闭我的设置制作备份文件off的备份。

如果你不想让Emacs自动编辑你的.emacs文件,你需要建立一个定制文件

您可以通过

(setq make-backup-files nil)

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

备份文件

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

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

要显式地创建备份,请使用带有前缀参数的save-buffer (C-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

自动保存文件

自动保存文件使用hashmarks (#),并应在项目目录中本地写入(与实际文件一起)。原因是自动保存文件只是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-*-

在文件中。

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

首先,基本设置如所述 回答< / >:< / p >

(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会话。

  2. per-save backups:在每一个保存一次。Emacs不是通过 默认,但如果让Emacs长时间运行,它是非常有用的 李。< / p > < / >

备份不同 和Emacs 如果备份dirs不存在,则自动创建备份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)
我在写了$<之后对这个话题非常感兴趣 在我的Makefile$@,大约在我上次提交后3小时:P

以上是基于Emacs维基页面我重度 编辑< / > . < / p >

(setq delete-auto-save-files t)

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