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

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

Re: numbered backups


From: Steven Arntson
Subject: Re: numbered backups
Date: Wed, 21 May 2014 09:21:54 -0700
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

"Pascal J. Bourguignon" <pjb@informatimago.com> writes:

> 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~")

This is way over my head, but I will make a try to get it working, thank
you!

Steven




reply via email to

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