all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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




  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.