help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: numbered backups


From: Pascal J. Bourguignon
Subject: Re: numbered backups
Date: Wed, 21 May 2014 06:14:40 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

Steven Arntson <steven@stevenarntson.com> writes:

> "Pascal J. Bourguignon" <pjb@informatimago.com> writes:
>
>> Steven Arntson <steven@stevenarntson.com> writes:
>>
>>> I know I read how to do this somewhere, but can't find it now. I'd like
>>> emacs to name my backup files not as
>>>
>>> file.org.~1~
>>> file.org.~2~
>>>
>>> but rather as
>>>
>>> file.org.~001~
>>> file.org.~002~
>>>
>>> is there a variable I could call up from M-x customize to influence this
>>> behavior?
>>
>> See the variable make-backup-file-name-function 
>> and the function make-backup-file-name
>
> This looks promising, but I'm too much of a beginner to accomplish much
> with it! Under "value menu" for "Make Backup File Name Function" it asks
> me, "Your function: ______". I don't know what to put there to achieve
> my desired result.

Reading the source of make-backup-file-name we can see that it's
actually the function find-backup-file-name that formats the backup file
names.


This function has to be changed to allow for smooth migration from
.~%d~ to .~%03d~ version numbers, and to allow parameterisation of the
version number format. 

Here is the new find-backup-file-name function, with the additions.


(defcustom backup-file-version-format "%d"
  "format specifier for version numbers in backup files."
  :group 'backup
  :type 'string)

(defun format-backup-file-name (name &optional version)
  (if version
      (concat name ".~" (format backup-file-version-format version) "~")
      (concat name ".~")))

(defun find-backup-file-name (fn)
  "Find a file name for a backup file FN, and suggestions for deletions.
Value is a list whose car is the name for the backup file
and whose cdr is a list of old versions to consider deleting now.
If the value is nil, don't make a backup.
Uses `backup-directory-alist' in the same way as does
`make-backup-file-name'."
  (let ((handler (find-file-name-handler fn 'find-backup-file-name)))
    ;; Run a handler for this function so that ange-ftp can refuse to do it.
    (if handler
        (funcall handler 'find-backup-file-name fn)
        (if (or (eq version-control 'never)
                ;; We don't support numbered backups on plain MS-DOS
                ;; when long file names are unavailable.
                (and (eq system-type 'ms-dos)
                     (not (msdos-long-file-names))))
            (list (make-backup-file-name fn))
            (let* ((basic-name (make-backup-file-name-1 fn))
                   (base-versions (format-backup-file-name 
(file-name-nondirectory basic-name)))
                   (backup-extract-version-start (length base-versions))
                   (high-water-mark 0)
                   (number-to-delete 0)
                   possibilities deserve-versions-p versions)
              (condition-case ()
                              (setq possibilities (file-name-all-completions
                                                   base-versions
                                                   (file-name-directory 
basic-name))
                                    versions (sort (mapcar
                                                    (lambda (file)
                                                      (cons 
(backup-extract-version file)
                                                            file))
                                                    possibilities)
                                                   (lambda (a b) (< (car a) 
(car b))))
                                    high-water-mark (apply (function max) 0 
(mapcar (function car) versions))
                                    deserve-versions-p (or version-control
                                                           (> high-water-mark 
0))
                                    number-to-delete (- (length versions)
                                                        kept-old-versions
                                                        kept-new-versions
                                                        -1))
                              (file-error (setq possibilities nil)))
              (if (not deserve-versions-p)
                  (list (make-backup-file-name fn))
                  (cons (format-backup-file-name basic-name (1+ 
high-water-mark))
                        (if (and (> number-to-delete 0)
                                 ;; Delete nothing if there is overflow
                                 ;; in the number of versions to keep.
                                 (>= (+ kept-new-versions kept-old-versions -1) 
0))
                            (let ((new-versions (let ((v (nthcdr 
kept-old-versions versions)))
                                                  (rplacd (nthcdr (1- 
number-to-delete) v) ())
                                                  v)))
                              (mapcar (function cdr) new-versions))))))))))


So now you can change the format:

(setf backup-file-version-format "%03d")
(find-backup-file-name "/home/pjb/scratch.txt")
--> ("/home/pjb/scratch.txt.~013~" "scratch.txt.~4~")


-- 
__Pascal Bourguignon__
http://www.informatimago.com/
"Le mercure monte ?  C'est le moment d'acheter !"


reply via email to

[Prev in Thread] Current Thread [Next in Thread]