我如何控制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-bufferCx Cs )。

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

C:UsersUSERNAME.emacs.dbackups!drive_c!Users!USERNAME!.emacs.el.~7~

它必须手动复制为

C:UsersUSERNAME.emacs.el

自动保存文件

自动保存文件使用哈希标记( # ),并且应该在项目目录中(与实际文件一起)本地编写。 原因是自动保存文件只是Emacs创建的临时文件,直到文件再次保存为止(就像匆忙顺从)。

  • 在用户按下Cx Cssave-buffer )保存文件之前,Emacs自动保存文件 - 基于计数击键( auto-save-interval )或停止输入时( auto-save-timeout )。
  • Emacs在崩溃时也会自动保存,包括使用shell命令来杀死Emacs作业。
  • 当用户保存文件时,自动保存的版本将被删除。 但是当用户退出文件而不保存它时,Emacs或X会话崩溃,自动保存的文件仍然存在。

    使用revert-bufferrecover-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