我如何控制Emacs如何制作备份文件?
Emacs将备份文件命名为foo~
,我不喜欢必须记住删除它们。 另外,如果我编辑文件系统中其他位置有硬链接的文件,当我完成编辑时,硬链接指向备份,这令人困惑和可怕。 我该如何消除这些备份文件,或让它们进入除同一目录以外的其他位置?
如果您曾经被Emacs备份文件保存过,那么您可能需要更多这些文件,而不是更少。 令人讨厌的是,它们与您正在编辑的文件位于同一目录中,但很容易更改。 通过在.emacs
类似以下内容,可以使所有备份文件进入目录。
(setq backup-directory-alist `(("." . "~/.saves")))
有许多与Emacs如何创建备份文件相关的奥术细节。 它应该重命名原始并写出编辑的缓冲区? 如果原文链接? 一般来说,最安全但最慢的选择是始终通过复制进行备份。
(setq backup-by-copying t)
如果由于某种原因,速度太慢,那么您可能还会看到链接时的backup-by-copying-when-linked
。
由于您的备份现在都在他们自己的位置,您可能需要更多备份,而不是更少。 查看这些变量的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备份/自动保存文件可能非常有用。 但是这些功能令人困惑。
备份文件
备份文件有波浪线( ~
或~9~
末),并应写入用户的主目录。 当make-backup-files
不为零时Emacs会在第一次从缓冲区中保存文件时自动创建原始文件的备份。 如果您正在编辑新文件,Emacs将在您第二次保存文件时创建备份。
无论您保存文件多少次,备份都保持不变。 如果您终止缓冲区,然后再次访问该文件,或者下一次启动新的Emacs会话时,将创建一个新的备份文件。 新的备份反映了重新打开后或编辑会话开始时的文件内容。 但现有的备份永远不会再次触及。 因此,我发现它对创建编号的备份非常有用(请参阅下面的配置)。
要显式创建备份,请使用带前缀参数的save-buffer
( Cx Cs
)。
diff-backup
和dired-diff-backup
将文件与其备份进行比较,反之亦然。 但是没有功能来恢复备份文件。 例如,在Windows下,恢复备份文件
C:UsersUSERNAME.emacs.dbackups!drive_c!Users!USERNAME!.emacs.el.~7~
它必须手动复制为
C:UsersUSERNAME.emacs.el
自动保存文件
自动保存文件使用哈希标记( #
),并且应该在项目目录中(与实际文件一起)本地编写。 原因是自动保存文件只是Emacs创建的临时文件,直到文件再次保存为止(就像匆忙顺从)。
Cx Cs
( save-buffer
)保存文件之前,Emacs自动保存文件 - 基于计数击键( auto-save-interval
)或停止输入时( auto-save-timeout
)。 当用户保存文件时,自动保存的版本将被删除。 但是当用户退出文件而不保存它时,Emacs或X会话崩溃,自动保存的文件仍然存在。
使用revert-buffer
或recover-file
来恢复自动保存文件。 请注意,Emacs会记录中断的会话以供以后在名为〜/ .emacs.d / auto-save-list的文件中恢复。 recover-session
函数将使用这些信息。
从自动保存的文件中恢复的首选方法是Mx 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-*-
在文件中。
接受的答案是好的,但可以通过额外备份每次保存和备份版本化文件来大大提高。
首先,在接受的答案中描述的基本设置:
(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)
最后,在每次保存时进行备份,而不仅仅是第一次。 我们做两种备份:
每个会话备份:在每个Emacs会话中首次保存缓冲区时执行一次。 这些模拟Emac的默认备份行为。
每次保存备份:每次保存一次。 Emacs默认不会这样做,但如果您让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页面。
链接地址: http://www.djcxy.com/p/6559.html上一篇: How do I control how Emacs makes backup files?
下一篇: Send Depthbuffer and TextureBuffer to same Fragment OpenGL3