Function: make-auto-save-file-name
make-auto-save-file-name is a byte-compiled function defined in
files.el.gz.
Signature
(make-auto-save-file-name)
Documentation
Return file name to use for auto-saves of current buffer.
Does not consider auto-save-visited-file-name as that variable is checked
before calling this function.
See also auto-save-file-name-p.
Probably introduced at or before Emacs version 1.6.
Source Code
;; Defined in /usr/src/emacs/lisp/files.el.gz
(defun make-auto-save-file-name ()
"Return file name to use for auto-saves of current buffer.
Does not consider `auto-save-visited-file-name' as that variable is checked
before calling this function.
See also `auto-save-file-name-p'."
(if buffer-file-name
(let ((handler (find-file-name-handler
buffer-file-name 'make-auto-save-file-name)))
(if handler
(funcall handler 'make-auto-save-file-name)
(files--transform-file-name
buffer-file-name auto-save-file-name-transforms
"#" "#")))
;; Deal with buffers that don't have any associated files. (Mail
;; mode tends to create a good number of these.)
(let ((buffer-name (buffer-name))
(limit 0)
file-name)
;; Restrict the characters used in the file name to those that
;; are known to be safe on all filesystems, url-encoding the
;; rest.
;; We do this on all platforms, because even if we are not
;; running on DOS/Windows, the current directory may be on a
;; mounted VFAT filesystem, such as a USB memory stick.
(while (string-match "[^A-Za-z0-9_.~#+-]" buffer-name limit)
(let* ((character (aref buffer-name (match-beginning 0)))
(replacement
;; For multibyte characters, this will produce more than
;; 2 hex digits, so is not true URL encoding.
(format "%%%02X" character)))
(setq buffer-name (replace-match replacement t t buffer-name))
(setq limit (1+ (match-end 0)))))
;; Generate the file name.
(setq file-name
(make-temp-file
(let ((fname
(expand-file-name
(format "#%s#" buffer-name)
;; Try a few alternative directories, to get one we can
;; write it.
(cond
((file-writable-p default-directory) default-directory)
((file-writable-p "/var/tmp/") "/var/tmp/")
("~/")))))
(if (and (memq system-type '(ms-dos windows-nt cygwin))
;; Don't modify remote filenames
(not (file-remote-p fname)))
;; The call to convert-standard-filename is in case
;; buffer-name includes characters not allowed by the
;; DOS/Windows filesystems. make-temp-file writes to the
;; file it creates, so we must fix the file name _before_
;; make-temp-file is called.
(convert-standard-filename fname)
fname))
nil "#"))
;; make-temp-file creates the file,
;; but we don't want it to exist until we do an auto-save.
(condition-case ()
(delete-file file-name)
(file-error nil))
file-name)))