每次保存时如何进行Emacs备份?

时间:2011-08-02 18:07:09

标签: emacs backup

我会不时删除我不应该删除的文件,最糟糕的是我自己编写的文件。因此,Emacs的备份功能已经多次保存。

但我的问题是Emacs只在您第一次保存缓冲区时进行备份。有没有办法让Emacs每次按下C-x C-s时都这样做?

这就是我的.emacs目前的样子(只有处理备份的部分):

* snip *

;; =====备份=====

;;启用备份文件 (setq make-backup-files t)

;;将所有备份文件保存在此目录中 (setq backup-directory-alist(quote((“。*”。“〜/ .emacs_backups /”)))))

;;始终通过复制进行备份(最安全,但最慢) (setq copy-by-copying t)

;;保存备份时,将~~~(和递增的数字)附加到文件末尾 (setq version-control t)

;;定义要保留多少旧版本的文件(从 ;;最近的,倒计时的 (setq keep-new-versions 100)

* snip *

3 个答案:

答案 0 :(得分:6)

阅读本文后:EmacsWiki: Force Backups

我将这些行添加到我的.emacs:

(defun force-backup-of-buffer ()
  (setq buffer-backed-up nil))

(add-hook 'before-save-hook  'force-backup-of-buffer)

它利用标准备份/版本控制,但在保存之前重置指示缓冲区已备份的标记。

前两行定义了一个重置​​标志的函数,该标志表示在此会话期间缓冲区已备份。

最后一行添加一个事件挂钩,在保存之前执行该函数。

这正是我想要的。

答案 1 :(得分:3)

如果你想自己做,这是一个开始:

(defun backup-and-save ()
  (interactive)
  (setq filename (buffer-file-name))
  (write-file (concat filename (format-time-string "_" "%Y%m%d%H%M%S")))
  (write-file filename)
  )

originalfilename_timestamp副本与时间戳相关联。

您当然可以调整它以将其存储在单独的备份文件夹中或添加其他“调整”。

答案 2 :(得分:0)

这是我使用的。它将备份放在目录的子目录中 文件在里面。每次保存文件时它也会保存一个备份。

(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)
      )
;; make backup to a designated dir, mirroring the full path

;; backup to dir hung on source dir...

(add-hook 'write-file-hooks 'setBackUp)
(defun setBackUp ()
  "Called by before-save-hook to set up backup location"
  (defvar backupdirname "BackUps~")     ; you can chose the sub dir name here
  (if (not (file-exists-p  backupdirname))
      (make-directory  backupdirname t))
  (setq backup-directory-alist `(("." . ,backupdirname)))
  (setq buffer-backed-up nil)            ; force backup every save
  nil
  )