我如何控制Emacs如何制作备份文件?

Emacs把备份文件命名为foo~我不喜欢必须记住删除它们。 另外,如果我在文件系统中编辑一个有硬链接的文件,当我完成编辑时,硬链接指向备份,这是令人困惑和可怕的。 我怎样才能消除这些备份文件,或让他们去其他目录以外的地方?

如果您曾经被Emacs备份文件保存过,那么您可能需要更多的文件,而不是更less。 令人讨厌的是,他们进入与您正在编辑的文件相同的目录,但是这很容易改变。 您可以将所有备份文件放在您的.emacs ,如下所示。

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

Emacs可能会如何创build备份文件有许多神秘的细节。 它应该重命名原始和写出编辑的缓冲区? 如果原文链接? 一般来说,最安全但最慢的赌注是总是通过复制来进行备份。

 (setq backup-by-copying t) 

如果由于某些原因,速度太慢,那么您可能还会考虑链接时的backup-by-copying-when-linked

由于您的备份现在都在自己的位置,您可能需要更多的备份,而不是更less。 查看这些variables的Emacs文档(使用Ch v )。

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

最后,如果你绝对不需要备份文件:

 (setq make-backup-files nil) 

这让我觉得不舒服。

Emacs备份/自动保存文件可以是非常有用的。 但是这些function令人困惑。

备份文件

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

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

要显式创build备份,请使用带前缀参数的save-bufferCx Cs )。

diff-backupdired-diff-backup将文件与其备份进行比较,反之亦然。 但是没有function来恢复备份文件。 例如,在Windows下,恢复备份文件

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

它必须被手动复制为

 C:\Users\USERNAME\.emacs.el 

自动保存文件

自动保存文件使用哈希标记( # ),并应在本地写入项目目录(以及实际的文件)。 原因是自动保存文件只是Emacs创build的临时文件,直到文件再次保存为止(就像匆忙的服从)。

  • 在用户按下Cx Cssave-buffer )保存文件之前,Emacs自动保存文件 – 基于计数击键( auto-save-interval )或停止input时( auto-save-timeout )。
  • Emacs也会在崩溃时自动保存,包括使用shell命令查杀Emacs作业。

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

使用revert-bufferrecover-file恢复自动保存文件。 请注意,Emacs会logging中断的会话,以便以后在名为〜/ .emacs.d / auto-save-list的文件中进行恢复。 recover-session函数将使用这个信息。

从自动保存的文件中恢复的首选方法是Mx revert-buffer RET 。 Emacs会询问“缓冲区最近是否自动保存,恢复自动保存文件? 或“从文件FILENAME恢复缓冲区?”。 在后者的情况下,没有自动保存文件。 例如,因为在input另一个auto-save-intervall键击之前已经保存了,在这种情况下Emacs已经删除了自动保存文件。

现在自动保存是默认禁用的,因为它可以在连接到慢速机器时减慢编辑速度,并且由于许多文件包含敏感数据。

组态

这是一个恕我直言最适合的configuration:

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

在文件中。

被接受的答案是好的,但是可以通过额外备份每个保存和备份版本化文件来大大提高。

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

 (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不存在,Emacs将自动创build备份目录:

 ;; 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页面 。

configuration备份选项的另一种方法是通过“自定义”界面。 input:

 Mx customize-group 

然后在“ Customize group:提示inputbackup

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

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

或者,您可以closures“备份文件” off

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

你可以完全禁用它们

 (setq make-backup-files nil)