From: Steven Arntson <steven@stevenarntson.com>
To: help-gnu-emacs@gnu.org
Subject: Re: numbered backups
Date: Wed, 21 May 2014 09:21:54 -0700 [thread overview]
Message-ID: <87ioozrtjx.fsf@stevenarntson.com> (raw)
In-Reply-To: 87y4xvg43z.fsf@kuiper.lan.informatimago.com
"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
next prev parent reply other threads:[~2014-05-21 16:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <mailman.1717.1400638422.1147.help-gnu-emacs@gnu.org>
2014-05-21 2:37 ` numbered backups Pascal J. Bourguignon
2014-05-21 3:00 ` Steven Arntson
[not found] ` <mailman.1721.1400641272.1147.help-gnu-emacs@gnu.org>
2014-05-21 4:14 ` Pascal J. Bourguignon
2014-05-21 16:21 ` Steven Arntson [this message]
2014-05-21 2:13 Steven Arntson
2014-05-21 17:26 ` Michael Heerdegen
2014-05-21 18:01 ` Steven Arntson
2014-05-21 20:27 ` Michael Heerdegen
2014-05-21 22:37 ` Steven Arntson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ioozrtjx.fsf@stevenarntson.com \
--to=steven@stevenarntson.com \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.