]> code.delx.au - gnu-emacs/blobdiff - lisp/files.el
(tab-always-indent): Fix custom-type.
[gnu-emacs] / lisp / files.el
index 8c26b0bbfaf8aa6fd392a307f58c6a7fa1ff1bd1..99e818643d0a2cc9463453b7c891e0c74ab831ea 100644 (file)
@@ -2,7 +2,7 @@
 
 ;; Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994, 1995, 1996,
 ;;   1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-;;   2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+;;   2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 
@@ -56,7 +56,7 @@ when it has unsaved changes."
 A list of elements of the form (FROM . TO), each meaning to replace
 FROM with TO when it appears in a directory name.  This replacement is
 done when setting up the default directory of a newly visited file.
-*Every* FROM string should start with `^'.
+*Every* FROM string should start with \"\\\\`\".
 
 FROM and TO should be equivalent names, which refer to the
 same directory.  Do not use `~' in the TO strings;
@@ -411,6 +411,14 @@ and should return either a buffer or nil."
   :type '(hook :options (cvs-dired-noselect dired-noselect))
   :group 'find-file)
 
+;; FIXME: also add a hook for `(thing-at-point 'filename)'
+(defcustom file-name-at-point-functions '(ffap-guess-file-name-at-point)
+  "List of functions to try in sequence to get a file name at point.
+Each function should return either nil or a file name found at the
+location of point in the current buffer."
+  :type '(hook :options (ffap-guess-file-name-at-point))
+  :group 'find-file)
+
 ;;;It is not useful to make this a local variable.
 ;;;(put 'find-file-not-found-hooks 'permanent-local t)
 (defvar find-file-not-found-functions nil
@@ -1275,13 +1283,14 @@ its documentation for additional customization information."
     ;;(make-frame-visible (window-frame old-window))
     ))
 
-(defvar find-file-default nil
-  "Used within `find-file-read-args'.")
-
 (defmacro minibuffer-with-setup-hook (fun &rest body)
-  "Add FUN to `minibuffer-setup-hook' while executing BODY.
+  "Temporarily add FUN to `minibuffer-setup-hook' while executing BODY.
 BODY should use the minibuffer at most once.
-Recursive uses of the minibuffer will not be affected."
+Recursive uses of the minibuffer are unaffected (FUN is not
+called additional times).
+
+This macro actually adds an auxiliary function that calls FUN,
+rather than FUN itself, to `minibuffer-setup-hook'."
   (declare (indent 1) (debug t))
   (let ((hook (make-symbol "setup-hook")))
     `(let (,hook)
@@ -1298,12 +1307,7 @@ Recursive uses of the minibuffer will not be affected."
         (remove-hook 'minibuffer-setup-hook ,hook)))))
 
 (defun find-file-read-args (prompt mustmatch)
-  (list (let ((find-file-default
-              (and buffer-file-name
-                   (abbreviate-file-name buffer-file-name))))
-         (minibuffer-with-setup-hook
-             (lambda () (setq minibuffer-default find-file-default))
-           (read-file-name prompt nil default-directory mustmatch)))
+  (list (read-file-name prompt nil default-directory mustmatch)
        t))
 
 (defun find-file (filename &optional wildcards)
@@ -2020,7 +2024,10 @@ regardless of whether it was created literally or not.
 In a Lisp program, if you want to be sure of accessing a file's
 contents literally, you should create a temporary buffer and then read
 the file contents into it using `insert-file-contents-literally'."
-  (interactive "FFind file literally: ")
+  (interactive
+   (list (read-file-name
+         "Find file literally: " nil default-directory
+         (confirm-nonexistent-file-or-buffer))))
   (switch-to-buffer (find-file-noselect filename nil t)))
 \f
 (defvar after-find-file-from-revert-buffer nil)
@@ -2975,8 +2982,8 @@ DIR-NAME is a directory name if these settings come from
                 (or (eq enable-local-eval t)
                     (hack-one-local-variable-eval-safep (eval (quote val)))
                     (push elt unsafe-vars))))
-             ;; Ignore duplicates in the present list.
-             ((assq var all-vars) nil)
+             ;; Ignore duplicates (except `mode') in the present list.
+             ((and (assq var all-vars) (not (eq var 'mode))) nil)
              ;; Accept known-safe variables.
              ((or (memq var '(mode unibyte coding))
                   (safe-local-variable-p var val))
@@ -2996,7 +3003,7 @@ DIR-NAME is a directory name if these settings come from
             (hack-local-variables-confirm all-vars unsafe-vars
                                           risky-vars dir-name))
         (dolist (elt all-vars)
-          (unless (eq (car elt) 'eval)
+          (unless (memq (car elt) '(eval mode))
             (unless dir-name
               (setq dir-local-variables-alist
                     (assq-delete-all (car elt) dir-local-variables-alist)))
@@ -3424,7 +3431,7 @@ and `file-local-variables-alist', without applying them."
                (dir-locals-get-class-variables class) dir-name nil)))
          (when variables
            (dolist (elt variables)
-             (unless (eq (car elt) 'eval)
+             (unless (memq (car elt) '(eval mode))
                (setq dir-local-variables-alist
                      (assq-delete-all (car elt) dir-local-variables-alist)))
              (push elt dir-local-variables-alist))
@@ -4707,20 +4714,17 @@ this happens by default."
       ;; Compute target name.
       (setq directory (directory-file-name (expand-file-name directory))
            newname   (directory-file-name (expand-file-name newname)))
-      (if (and (file-directory-p newname)
-              (not (string-equal (file-name-nondirectory directory)
-                                 (file-name-nondirectory newname))))
-         (setq newname
-               (expand-file-name (file-name-nondirectory directory) newname)))
       (if (not (file-directory-p newname)) (make-directory newname parents))
 
       ;; Copy recursively.
       (mapc
        (lambda (file)
-        (if (file-directory-p file)
-            (copy-directory file newname keep-time parents)
-          (copy-file file newname t keep-time)))
-       ;; We do not want to delete "." and "..".
+        (let ((target (expand-file-name
+                       (file-name-nondirectory file) newname)))
+          (if (file-directory-p file)
+              (copy-directory file target keep-time parents)
+            (copy-file file target t keep-time))))
+       ;; We do not want to copy "." and "..".
        (directory-files        directory 'full directory-files-no-dot-files-regexp))
 
       ;; Set directory attributes.
@@ -5362,7 +5366,10 @@ default directory.  However, if FULL is non-nil, they are absolute."
           ;; A list of all dirs that DIRPART specifies.
           ;; This can be more than one dir
           ;; if DIRPART contains wildcards.
-          (dirs (if (and dirpart (string-match "[[*?]" dirpart))
+          (dirs (if (and dirpart
+                         (string-match "[[*?]"
+                                       (or (file-remote-p dirpart 'localname)
+                                           dirpart)))
                     (mapcar 'file-name-as-directory
                             (file-expand-wildcards (directory-file-name dirpart)))
                   (list dirpart)))
@@ -5389,6 +5396,9 @@ default directory.  However, if FULL is non-nil, they are absolute."
        (setq dirs (cdr dirs)))
       contents)))
 
+;; Let Tramp know that `file-expand-wildcards' does not need an advice.
+(provide 'files '(remote-wildcards))
+
 (defun list-directory (dirname &optional verbose)
   "Display a list of files in or matching DIRNAME, a la `ls'.
 DIRNAME is globbed by the shell if necessary.
@@ -5411,8 +5421,7 @@ and `list-directory-verbose-switches'."
       (princ "Directory ")
       (princ dirname)
       (terpri)
-      (save-excursion
-       (set-buffer "*Directory*")
+      (with-current-buffer "*Directory*"
        (let ((wildcard (not (file-directory-p dirname))))
          (insert-directory dirname switches wildcard (not wildcard)))))
     ;; Finishing with-output-to-temp-buffer seems to clobber default-directory.
@@ -5945,7 +5954,7 @@ only these files will be asked to be saved."
 ;; so that magic file name handlers will not apply to it.
 
 (setq file-name-handler-alist
-      (cons '("\\`/:" . file-name-non-special)
+      (cons (cons (purecopy "\\`/:") 'file-name-non-special)
            file-name-handler-alist))
 
 ;; We depend on being the last handler on the list,