[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 !"