Emacs在各处放置备份文件,文件名为foo~
,我不喜欢要记得删除它们。此外,如果我编辑一个文件,在文件系统的其他位置有一个硬链接,则编辑完成后,硬链接指向备份文件,这很令人困惑和难受。如何消除这些备份文件或使它们进入其他目录?
Emacs在各处放置备份文件,文件名为foo~
,我不喜欢要记得删除它们。此外,如果我编辑一个文件,在文件系统的其他位置有一个硬链接,则编辑完成后,硬链接指向备份文件,这很令人困惑和难受。如何消除这些备份文件或使它们进入其他目录?
.emacs
中添加类似以下内容来将所有备份文件放入一个目录中。(setq backup-directory-alist `(("." . "~/.saves")))
Emacs可能会创建备份文件,这涉及许多晦涩的细节。它应该重命名原始文件并写出编辑后的缓冲区吗?如果原始文件已链接怎么办?总的来说,最安全但最慢的方法是通过复制始终进行备份。
(setq backup-by-copying t)
(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
为非nil时,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 或 X 会话崩溃,则自动保存的文件仍然存在。
使用 revert-buffer
或 recover-file
来恢复自动保存的文件。请注意,Emacs 记录了以后要在文件 ~/.emacs.d/auto-save-list 中恢复的中断会话。 recover-session
函数将使用此信息。
从自动保存的文件中恢复的首选方法是 M-x revert-buffer RET
。Emacs 会询问“缓冲区最近已经自动保存。从自动保存的文件还原?”或“从文件 FILENAME 还原缓冲区?”。如果是后者,则没有自动保存的文件。例如,因为您在输入另一个 auto-save-interval
击键之前保存了,此时 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.
(setq vc-make-backup-files t)
最后,每次保存都备份而不仅仅是第一次。我们有两种备份方式:
会话级别备份:在每个 Emacs 会话中缓冲区首次保存时进行备份。这模拟了 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页面。
你可以通过以下方法完全禁用它们:
(setq make-backup-files nil)
emacs --eval "(setq make-backup-files nil)"
- Dave Morse通过自定义界面,配置备份选项的另一种方法。输入:
M-x customize-group
然后在 自定义组:
提示处输入 backup
。
如果您滚动到缓冲区底部,将会看到 备份目录列表。点击 显示值 并将列表的第一个条目设置如下:
Regexp matching filename: .*
Backup directory name: /path/to/your/backup/dir
或者,您可以通过设置备份文件为off
来关闭备份。
如果您不希望Emacs自动编辑您的.emacs
文件,则需要设置自定义文件。
customize-group
。谢谢! - wprl(setq delete-auto-save-files t)
当缓冲区被保存或在其中没有更改的情况下被杀死时,删除缓冲区的自动保存文件。因此,您仍然可以获得一些自动保存文件的安全性,因为它们只会在缓冲区带有未保存的更改或Emacs意外退出时留下。如果您想这样做,但确实需要某些文件的历史记录,请考虑将它们放在源代码控制下。
# -*- backup-inhibited:1 -*-
#
是该文件的注释样式。