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

6
有时候我会删除一些不该删除的文件,最糟糕的是我自己写的文件。因此,Emacs 的备份功能多次拯救了我。
但我的问题是,Emacs 只在第一次保存缓冲区时进行备份。有没有办法让 Emacs 每次按下 C-x C-s 都进行备份呢?
这是我当前的 .emacs 文件(只包含与备份相关的部分):
;; ===== Backups =====                                                                    

;; Enable backup files.                                                                   
(setq make-backup-files t)

;; Save all backup file in this directory.                                                
(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))

;; Always backup by copying (safest, but slowest)                                         
(setq backup-by-copying t)

;; Append .~1~ (and increasing numbers) to end of file when saving backup                 
(setq version-control t)

;; Defining how many old versions of a file to keep (starting from the                    
;; most recent and counting backward                                                      
(setq kept-new-versions 100)

2
刚刚发现这个.. http://www.emacswiki.org/emacs/ForceBackups - dala
2
还有这个.. http://www.emacswiki.org/emacs/BackupEachSave - dala
2
这解决了一个我在读到这个问题之前从未意识到的问题。很酷,谢谢:D - sk29910
你应该将那些链接作为答案放置,dala。它们确实解决了你的问题。另外,你是否经常删除自己的文件,以至于需要这样的东西?如果我正在处理源代码,我通常依赖版本控制系统来防止意外删除,而这种情况发生得非常少。 - Noufal Ibrahim
1
@Noufal 我会在很短的时间内(比如一个小时)对一个文件进行多次修改。我不想那么频繁地提交该文件。 - maxelost
显示剩余2条评论
3个回答

10
阅读完这篇文章后:EmacsWiki: Force Backups 我在我的 .emacs 文件中添加了以下内容:
(defun force-backup-of-buffer ()
  (setq buffer-backed-up nil))

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

它使用标准的备份/版本控制,但在保存之前重置指示缓冲区是否在本次会话中已备份的标志。

前两行定义了一个函数,该函数重置指示缓冲区在本次会话期间是否已进行备份的标志。

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

这正是我想要的。


1
不错。我一直在为此苦苦挣扎。文档让我相信emacs可以本地完成这个任务,但我就是无法让它工作。这个方法可以。 - user2567544

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

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


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
  )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接