为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米琪卡哇伊 2020-02-03 14:26:42
Emacs将备份文件命名为foo~无处不在,我不希望记住删除它们。另外,如果我编辑的文件在文件系统中的其他位置具有硬链接,则在完成编辑后,硬链接会指向备份,这会造成混乱和麻烦。如何删除这些备份文件,或者将它们放到同一目录之外的其他地方?
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

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

在文件中。


查看完整回答
反对 回复 2020-02-03
?
PIPIONE

TA贡献1829条经验 获得超9个赞

该接受的答案是好的,但它可以通过额外得到很大的提高上备份 每一个保存和备份版本的文件。


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


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

我开始对这个话题很感兴趣后,我写$<的,而不是 $@我的Makefile,约后,我的前三年时间内调动:P



查看完整回答
反对 回复 2020-02-03
  • 3 回答
  • 0 关注
  • 629 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信