]> code.delx.au - gnu-emacs/commitdiff
Make `make-auto-save-file-name' a magic operation.
authorMichael Albinus <michael.albinus@gmx.de>
Tue, 30 Aug 2005 22:41:02 +0000 (22:41 +0000)
committerMichael Albinus <michael.albinus@gmx.de>
Tue, 30 Aug 2005 22:41:02 +0000 (22:41 +0000)
etc/ChangeLog
etc/NEWS
lisp/ChangeLog
lisp/files.el
lisp/net/tramp.el
lispref/ChangeLog
lispref/files.texi

index e803b5bef69857709f45b46d59e257bd39d332b9..bf83b688b17d51b9cfaec6960a45b1d8eada9781 100644 (file)
@@ -1,3 +1,7 @@
+2005-08-31  Michael Albinus  <michael.albinus@gmx.de>
+
+       * NEWS: Add entry for `make-auto-save-file-name'.
+
 2005-08-19  Emilio C. Lopes  <eclig@gmx.net>
 
        * emacsclient.1 (DESCRIPTION): Reflect inclusion in the
index 08479a5579e31e5ea5397534db83d190be357258..62eb51502ab2db225649cb6ff157e84831b9a9a7 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -3908,6 +3908,10 @@ operations.
 This is useful for autoloaded handlers, to prevent them from being
 autoloaded when not really necessary.
 
++++
+*** The function `make-auto-save-file-name' is now handled by file
+name handlers.  This will be exploited for remote files mainly.
+
 ** Input changes:
 
 +++
index 4167c8c679d96bb015ccf402093c7eb6defeb42f..7f3d83d46b4cd0de1768b2b5d65134c1f9886a95 100644 (file)
@@ -1,3 +1,16 @@
+2005-08-31  Michael Albinus  <michael.albinus@gmx.de>
+
+       * files.el (make-auto-save-file-name): Add file name handler call
+       if applicable.
+
+       * net/tramp.el (tramp-file-name-handler-alist)
+       (tramp-file-name-for-operation): Add `make-auto-save-file-name'.
+       (tramp-handle-make-auto-save-file-name): Renamed from
+       `tramp-make-auto-save-file-name'.
+       (tramp-exists-file-name-handler): New defun.
+       (tramp-advice-make-auto-save-file-name): Make defadvice only when
+       `make-auto-save-file-name' is not a magic file name operation.
+
 2005-08-30  Carsten Dominik  <dominik@science.uva.nl>
 
        * textmodes/org.el (org-special-keyword): New face.
index 4004cb2324b114e847d0452ab6fb1e7085ece52d..90fb586cd303e0f168602a21e9271563c99a4396 100644 (file)
@@ -4062,53 +4062,57 @@ Does not consider `auto-save-visited-file-name' as that variable is checked
 before calling this function.  You can redefine this for customization.
 See also `auto-save-file-name-p'."
   (if buffer-file-name
-      (let ((list auto-save-file-name-transforms)
-           (filename buffer-file-name)
-           result uniq)
-       ;; Apply user-specified translations
-       ;; to the file name.
-       (while (and list (not result))
-         (if (string-match (car (car list)) filename)
-             (setq result (replace-match (cadr (car list)) t nil
-                                         filename)
-                   uniq (car (cddr (car list)))))
-         (setq list (cdr list)))
-       (if result
-           (if uniq
-               (setq filename (concat
-                               (file-name-directory result)
-                               (subst-char-in-string
-                                ?/ ?!
-                                (replace-regexp-in-string "!" "!!"
-                                                          filename))))
-             (setq filename result)))
-       (setq result
-             (if (and (eq system-type 'ms-dos)
-                      (not (msdos-long-file-names)))
-                 ;; We truncate the file name to DOS 8+3 limits
-                 ;; before doing anything else, because the regexp
-                 ;; passed to string-match below cannot handle
-                 ;; extensions longer than 3 characters, multiple
-                 ;; dots, and other atrocities.
-                 (let ((fn (dos-8+3-filename
-                            (file-name-nondirectory buffer-file-name))))
-                   (string-match
-                    "\\`\\([^.]+\\)\\(\\.\\(..?\\)?.?\\|\\)\\'"
-                    fn)
-                   (concat (file-name-directory buffer-file-name)
-                           "#" (match-string 1 fn)
-                           "." (match-string 3 fn) "#"))
-               (concat (file-name-directory filename)
-                       "#"
-                       (file-name-nondirectory filename)
-                       "#")))
-       ;; Make sure auto-save file names don't contain characters
-       ;; invalid for the underlying filesystem.
-       (if (and (memq system-type '(ms-dos windows-nt))
-                ;; Don't modify remote (ange-ftp) filenames
-                (not (string-match "^/\\w+@[-A-Za-z0-9._]+:" result)))
-           (convert-standard-filename result)
-         result))
+      (let ((handler (find-file-name-handler buffer-file-name
+                                            'make-auto-save-file-name)))
+       (if handler
+           (funcall handler 'make-auto-save-file-name)
+         (let ((list auto-save-file-name-transforms)
+               (filename buffer-file-name)
+               result uniq)
+           ;; Apply user-specified translations
+           ;; to the file name.
+           (while (and list (not result))
+             (if (string-match (car (car list)) filename)
+                 (setq result (replace-match (cadr (car list)) t nil
+                                             filename)
+                       uniq (car (cddr (car list)))))
+             (setq list (cdr list)))
+           (if result
+               (if uniq
+                   (setq filename (concat
+                                   (file-name-directory result)
+                                   (subst-char-in-string
+                                    ?/ ?!
+                                    (replace-regexp-in-string "!" "!!"
+                                                              filename))))
+                 (setq filename result)))
+           (setq result
+                 (if (and (eq system-type 'ms-dos)
+                          (not (msdos-long-file-names)))
+                     ;; We truncate the file name to DOS 8+3 limits
+                     ;; before doing anything else, because the regexp
+                     ;; passed to string-match below cannot handle
+                     ;; extensions longer than 3 characters, multiple
+                     ;; dots, and other atrocities.
+                     (let ((fn (dos-8+3-filename
+                                (file-name-nondirectory buffer-file-name))))
+                       (string-match
+                        "\\`\\([^.]+\\)\\(\\.\\(..?\\)?.?\\|\\)\\'"
+                        fn)
+                       (concat (file-name-directory buffer-file-name)
+                               "#" (match-string 1 fn)
+                               "." (match-string 3 fn) "#"))
+                   (concat (file-name-directory filename)
+                           "#"
+                           (file-name-nondirectory filename)
+                           "#")))
+           ;; Make sure auto-save file names don't contain characters
+           ;; invalid for the underlying filesystem.
+           (if (and (memq system-type '(ms-dos windows-nt))
+                    ;; Don't modify remote (ange-ftp) filenames
+                    (not (string-match "^/\\w+@[-A-Za-z0-9._]+:" result)))
+               (convert-standard-filename result)
+             result))))
 
     ;; Deal with buffers that don't have any associated files.  (Mail
     ;; mode tends to create a good number of these.)
index e3ad3959591e522f22b6322db05898cb9ba5be34..7dda7bc0d4c5339feda31588d7587df1a497f5fb 100644 (file)
@@ -1856,6 +1856,7 @@ on the FILENAME argument, even if VISIT was a string.")
     (insert-file-contents . tramp-handle-insert-file-contents)
     (write-region . tramp-handle-write-region)
     (find-backup-file-name . tramp-handle-find-backup-file-name)
+    (make-auto-save-file-name . tramp-handle-make-auto-save-file-name)
     (unhandled-file-name-directory . tramp-handle-unhandled-file-name-directory)
     (dired-compress-file . tramp-handle-dired-compress-file)
     (dired-call-process . tramp-handle-dired-call-process)
@@ -1863,7 +1864,7 @@ on the FILENAME argument, even if VISIT was a string.")
      . tramp-handle-dired-recursive-delete-directory)
     (set-visited-file-modtime . tramp-handle-set-visited-file-modtime)
     (verify-visited-file-modtime . tramp-handle-verify-visited-file-modtime))
-        "Alist of handler functions.
+  "Alist of handler functions.
 Operations not mentioned here will be handled by the normal Emacs functions.")
 
 ;; Handlers for partial tramp file names. For GNU Emacs just
@@ -3807,6 +3808,34 @@ This will break if COMMAND prints a newline, followed by the value of
 
       (tramp-run-real-handler 'find-backup-file-name (list filename)))))
 
+(defun tramp-handle-make-auto-save-file-name ()
+  "Like `make-auto-save-file-name' for tramp files.
+Returns a file name in `tramp-auto-save-directory' for autosaving this file."
+  (when tramp-auto-save-directory
+    (unless (file-exists-p tramp-auto-save-directory)
+      (make-directory tramp-auto-save-directory t)))
+  ;; jka-compr doesn't like auto-saving, so by appending "~" to the
+  ;; file name we make sure that jka-compr isn't used for the
+  ;; auto-save file.
+  (let ((buffer-file-name
+        (if tramp-auto-save-directory
+            (expand-file-name
+             (tramp-subst-strs-in-string
+              '(("_" . "|")
+                ("/" . "_a")
+                (":" . "_b")
+                ("|" . "__")
+                ("[" . "_l")
+                ("]" . "_r"))
+              (buffer-file-name))
+             tramp-auto-save-directory)
+          (buffer-file-name)))
+       ;; We set it to nil because `make-auto-save-file-name' shouldn't
+       ;; recurse infinitely.
+       tramp-auto-save-directory)
+      (tramp-run-real-handler
+       'make-auto-save-file-name)))
+
 
 ;; CCC grok APPEND, LOCKNAME, CONFIRM
 (defun tramp-handle-write-region
@@ -4086,8 +4115,9 @@ ARGS are the arguments OPERATION has been called with."
     (nth 2 args))
    ; BUF
    ((member operation
-           (list 'set-visited-file-modtime 'verify-visited-file-modtime
-                 ; XEmacs only
+           (list 'make-auto-save-file-name
+                 'set-visited-file-modtime 'verify-visited-file-modtime
+                 ; XEmacs only
                  'backup-buffer))
     (buffer-file-name
      (if (bufferp (nth 0 args)) (nth 0 args) (current-buffer))))
@@ -6905,33 +6935,17 @@ as default."
 
 ;; Auto saving to a special directory.
 
-(defun tramp-make-auto-save-file-name (fn)
-  "Returns a file name in `tramp-auto-save-directory' for autosaving this file."
-  (when tramp-auto-save-directory
-    (unless (file-exists-p tramp-auto-save-directory)
-      (make-directory tramp-auto-save-directory t)))
-  ;; jka-compr doesn't like auto-saving, so by appending "~" to the
-  ;; file name we make sure that jka-compr isn't used for the
-  ;; auto-save file.
-  (let ((buffer-file-name (expand-file-name
-                          (tramp-subst-strs-in-string '(("_" . "|")
-                                                        ("/" . "_a")
-                                                        (":" . "_b")
-                                                        ("|" . "__")
-                                                        ("[" . "_l")
-                                                        ("]" . "_r"))
-                                                      fn)
-                          tramp-auto-save-directory)))
-    (make-auto-save-file-name)))
-
-(defadvice make-auto-save-file-name
-  (around tramp-advice-make-auto-save-file-name () activate)
-  "Invoke `tramp-make-auto-save-file-name' for tramp files."
-  (if (and (buffer-file-name) (tramp-tramp-file-p (buffer-file-name))
-          tramp-auto-save-directory)
-      (setq ad-return-value
-            (tramp-make-auto-save-file-name (buffer-file-name)))
-    ad-do-it))
+(defun tramp-exists-file-name-handler (operation)
+  (let ((file-name-handler-alist (list (cons "/" 'identity))))
+    (eq (find-file-name-handler "/" operation) 'identity)))
+
+(unless (tramp-exists-file-name-handler 'make-auto-save-file-name)
+  (defadvice make-auto-save-file-name
+    (around tramp-advice-make-auto-save-file-name () activate)
+    "Invoke `tramp-handle-make-auto-save-file-name' for tramp files."
+    (if (and (buffer-file-name) (tramp-tramp-file-p (buffer-file-name)))
+       (setq ad-return-value (tramp-make-auto-save-file-name))
+      ad-do-it)))
 
 ;; In Emacs < 22 and XEmacs < 21.5 autosaved remote files have
 ;; permission 0666 minus umask. This is a security threat.
index cc5384fdf0891f13dd97f04f59c97f00d0a4c0c9..9f71006f79af30533d05e5f00d823143dff36eb8 100644 (file)
@@ -1,3 +1,7 @@
+2005-08-31  Michael Albinus  <michael.albinus@gmx.de>
+
+       * files.texi (Magic File Names): Add `make-auto-save-file-name'.
+
 2005-08-29  Richard M. Stallman  <rms@gnu.org>
 
        * elisp.texi (Top): Update subnode menu.
@@ -20,7 +24,7 @@
 
        * display.texi (Finding Overlays): Fix `find-overlay-prop' in
        `next-overlay-change' example.
-  
+
 2005-08-22  Juri Linkov  <juri@jurta.org>
 
        * display.texi (Attribute Functions): Add set-face-inverse-video-p.
@@ -65,7 +69,7 @@
        (Frame Parameters): Refer to Geometry.
 
        * buffers.texi (The Buffer List): Fix xrefs.
-       
+
        * windows.texi (Splitting Windows): Fix xref.
 
        * frames.texi (Layout Parameters): Add xref.
index d8d47964cdf1569c4c51314bd9338231fd291dcf..1ec4b2e5dc2396be84edafedc3a768ca47cfde1e 100644 (file)
@@ -2580,7 +2580,9 @@ Here are the operations that a magic file name handler gets to handle:
 @code{get-file-buffer},
 @code{insert-directory},
 @code{insert-file-contents},@*
-@code{load}, @code{make-directory},
+@code{load},
+@code{make-auto-save-file-name},
+@code{make-directory},
 @code{make-directory-internal},
 @code{make-symbolic-link},@*
 @code{rename-file}, @code{set-file-modes}, @code{set-file-times},