]> code.delx.au - gnu-emacs/blobdiff - lisp/files.el
(calendar-print-french-date): Label French date in echo area.
[gnu-emacs] / lisp / files.el
index 6d36275e365988cd8d2773f97640ba70403400bd..15f9c3af56470b8e724b3691a7eb6f9aad666b31 100644 (file)
@@ -1063,6 +1063,7 @@ run `normal-mode' explicitly."
     ("\\.oak\\'" . scheme-mode)
     ("\\.sgml?\\'" . sgml-mode)
     ("\\.dtd\\'" . sgml-mode)
+    ("\\.ds\\(ss\\)?l\\'" . dsssl-mode)
     ("\\.s?html?\\'" . html-mode)
     ;; .emacs following a directory delimiter
     ;; in either Unix or VMS syntax.
@@ -1864,16 +1865,28 @@ If the value is nil, don't make a backup."
   (car (cdr (file-attributes filename))))
 
 (defun file-relative-name (filename &optional directory)
-  "Convert FILENAME to be relative to DIRECTORY (default: default-directory)."
+  "Convert FILENAME to be relative to DIRECTORY (default: default-directory).
+This function returns a relative file name which is equivalent to FILENAME
+when used with that default directory as the default.
+If this is impossible (which can happen on MSDOS and Windows
+when the file name and directory use different drive names)
+then it returns FILENAME."
   (save-match-data
-   (setq filename (expand-file-name filename)
-        directory (file-name-as-directory
-                   (expand-file-name (or directory default-directory))))
-   (let ((ancestor ""))
-     (while (not (string-match (concat "^" (regexp-quote directory)) filename))
-       (setq directory (file-name-directory (substring directory 0 -1))
-            ancestor (concat "../" ancestor)))
-     (concat ancestor (substring filename (match-end 0))))))
+    (setq fname (expand-file-name filename)
+         directory (file-name-as-directory
+                    (expand-file-name (or directory default-directory))))
+    ;; On Microsoft OSes, if FILENAME and DIRECTORY have different
+    ;; drive names, they can't be relative, so return the absolute name.
+    (if (and (or (eq system-type 'ms-dos)
+                (eq system-type 'windows-nt))
+            (not (string-equal (substring fname  0 2)
+                               (substring directory 0 2))))
+       filename
+      (let ((ancestor ""))
+       (while (not (string-match (concat "^" (regexp-quote directory)) fname))
+         (setq directory (file-name-directory (substring directory 0 -1))
+               ancestor (concat "../" ancestor)))
+       (concat ancestor (substring fname (match-end 0)))))))
 \f
 (defun save-buffer (&optional args)
   "Save current buffer in visited file if modified.  Versions described below.
@@ -2405,7 +2418,7 @@ non-nil, it is called instead of rereading visited file contents."
             (erase-buffer)
             (insert-file-contents file-name nil))
           (after-find-file nil nil t))
-         (t (error "Recover-file cancelled.")))))
+         (t (error "Recover-file cancelled")))))
 
 (defun recover-session ()
   "Recover auto save files from a previous Emacs session.