Emacs 将备份文件放在foo~
任何地方,我不喜欢记住删除它们。此外,如果我编辑的文件在文件系统的其他位置具有硬链接,那么当我完成编辑时,硬链接会指向备份,这会让人感到困惑和糟糕。我怎样才能消除这些备份文件,或者让它们放在同一个目录以外的地方?
5 回答
如果您曾经被 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)
想到这我就恶心。
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-buffer
或recover-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-*-
在文件中。
接受的答案很好,但可以通过在每次保存时额外备份 和备份版本化文件来大大改进。
首先,接受的答案中描述的基本设置:
(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 会自动创建它们:
;; 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 页面。
另一种配置备份选项的方法是通过自定义界面。进入:
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
文件,您需要设置一个自定义文件。
您可以通过以下方式完全禁用它们
(setq make-backup-files nil)