Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-31
[bpt/emacs.git] / lisp / complete.el
index 7d50a89..60bddd0 100644 (file)
@@ -1,6 +1,6 @@
 ;;; complete.el --- partial completion mechanism plus other goodies
 
-;; Copyright (C) 1990, 1991, 1992, 1993, 1999, 2000
+;; Copyright (C) 1990, 1991, 1992, 1993, 1999, 2000, 2003, 2005
 ;;  Free Software Foundation, Inc.
 
 ;; Author: Dave Gillespie <daveg@synaptics.com>
 ;; The regular M-TAB (lisp-complete-symbol) command also supports
 ;; partial completion in this package.
 
-;; File name completion does not do partial completion of directories
-;; on the path, e.g., "/u/b/f" will not complete to "/usr/bin/foo",
-;; but you can put *'s in the path to accomplish this:  "/u*/b*/f".
-;; Stars are required for performance reasons.
-
 ;; In addition, this package includes a feature for accessing include
 ;; files.  For example, `C-x C-f <sys/time.h> RET' reads the file
 ;; /usr/include/sys/time.h.  The variable PC-include-file-path is a
@@ -123,7 +118,7 @@ Some arcane rules:
 If `]' is in this string, it must come first.
 If `^' is in this string, it must not come first.
 If `-' is in this string, it must come first or right after `]'.
-In other words, if S is this string, then `[S]' must be a legal Emacs regular
+In other words, if S is this string, then `[S]' must be a valid Emacs regular
 expression (not containing character ranges like `a-z')."
   :type 'string
   :group 'partial-completion)
@@ -205,9 +200,9 @@ command begins with that sequence of characters, and
 \\[find-file] f_b.c TAB might complete to foo_bar.c if that file existed and no
 other file in that directory begin with that sequence of characters.
 
-Unless `PC-disable-includes' is non-nil, the \"<...>\" sequence is interpreted
+Unless `PC-disable-includes' is non-nil, the `<...>' sequence is interpreted
 specially in \\[find-file].  For example,
-\\[find-file] <sys/time.h> RET finds the file /usr/include/sys/time.h.
+\\[find-file] <sys/time.h> RET finds the file `/usr/include/sys/time.h'.
 See also the variable `PC-include-file-path'."
   :global t :group 'partial-completion
   ;; Deal with key bindings...
@@ -373,7 +368,7 @@ of `minibuffer-completion-table' and the minibuffer contents.")
 
     ;; Check if buffer contents can already be considered complete
     (if (and (eq mode 'exit)
-            (PC-is-complete-p str table pred))
+            (test-completion str table pred))
        'complete
 
       ;; Do substitutions in directory names
@@ -388,7 +383,7 @@ of `minibuffer-completion-table' and the minibuffer contents.")
             (delete-region beg end)
             (insert str)
             (setq end (+ beg (length str)))))
-      
+
       ;; Prepare various delimiter strings
       (or (equal PC-word-delimiters PC-delims)
          (setq PC-delims PC-word-delimiters
@@ -396,10 +391,27 @@ of `minibuffer-completion-table' and the minibuffer contents.")
                PC-ndelims-regex (concat "[^" PC-delims "]*")
                PC-delims-list (append PC-delims nil)))
 
+      ;; Add wildcards if necessary
+      (and filename
+           (let ((dir (file-name-directory str))
+                 (file (file-name-nondirectory str))
+                ;; The base dir for file-completion is passed in `predicate'.
+                (default-directory (expand-file-name pred)))
+             (while (and (stringp dir) (not (file-directory-p dir)))
+               (setq dir (directory-file-name dir))
+               (setq file (concat (replace-regexp-in-string
+                                   PC-delim-regex "*\\&"
+                                   (file-name-nondirectory dir))
+                                  "*/" file))
+               (setq dir (file-name-directory dir)))
+             (setq str (concat dir file))))
+
       ;; Look for wildcard expansions in directory name
       (and filename
           (string-match "\\*.*/" str)
           (let ((pat str)
+                ;; The base dir for file-completion is passed in `predicate'.
+                (default-directory (expand-file-name pred))
                 files)
             (setq p (1+ (string-match "/[^/]*\\'" pat)))
             (while (setq p (string-match PC-delim-regex pat p))
@@ -629,7 +641,7 @@ of `minibuffer-completion-table' and the minibuffer contents.")
                (if improved
 
                    ;; We changed it... would it be complete without the space?
-                   (if (PC-is-complete-p (buffer-substring 1 (1- end))
+                   (if (test-completion (buffer-substring 1 (1- end))
                                          table pred)
                        (delete-region (1- end) end)))
 
@@ -637,7 +649,7 @@ of `minibuffer-completion-table' and the minibuffer contents.")
 
                  ;; We changed it... enough to be complete?
                  (and (eq mode 'exit)
-                      (PC-is-complete-p (field-string) table pred))
+                      (test-completion (field-string) table pred))
 
                ;; If totally ambiguous, display a list of completions
                (if (or (eq completion-auto-help t)
@@ -668,20 +680,6 @@ of `minibuffer-completion-table' and the minibuffer contents.")
                            (car poss)))))
        t)))))
 
-
-(defun PC-is-complete-p (str table pred)
-  (let ((res (if (listp table)
-                (assoc str table)
-              (if (vectorp table)
-                  (or (equal str "nil")   ; heh, heh, heh
-                      (intern-soft str table))
-                (funcall table str pred 'lambda)))))
-    (and res
-        (or (not pred)
-            (and (not (listp table)) (not (vectorp table)))
-            (funcall pred res))
-        res)))
-
 (defun PC-chop-word (new old)
   (let ((i -1)
        (j -1))
@@ -883,7 +881,7 @@ or properties are considered."
 ;;; This is adapted from lib-complete.el, by Mike Williams.
 (defun PC-include-file-all-completions (file search-path &optional full)
   "Return all completions for FILE in any directory on SEARCH-PATH.
-If optional third argument FULL is non-nil, returned pathnames should be 
+If optional third argument FULL is non-nil, returned pathnames should be
 absolute rather than relative to some directory on the SEARCH-PATH."
   (setq search-path
        (mapcar (lambda (dir)
@@ -893,7 +891,7 @@ absolute rather than relative to some directory on the SEARCH-PATH."
       ;; It's an absolute file name, so don't need search-path
       (progn
        (setq file (expand-file-name file))
-       (file-name-all-completions 
+       (file-name-all-completions
         (file-name-nondirectory file) (file-name-directory file)))
     (let ((subdir (file-name-directory file))
          (ndfile (file-name-nondirectory file))
@@ -911,9 +909,9 @@ absolute rather than relative to some directory on the SEARCH-PATH."
          (if (file-directory-p dir)
              (progn
                (setq file-lists
-                     (cons 
+                     (cons
                       (mapcar (lambda (file) (concat subdir file))
-                              (file-name-all-completions ndfile 
+                              (file-name-all-completions ndfile
                                                          (car search-path)))
                       file-lists))))
          (setq search-path (cdr search-path))))
@@ -939,11 +937,11 @@ absolute rather than relative to some directory on the SEARCH-PATH."
         ((not completion-table) nil)
         ((eq action nil) (try-completion str2 completion-table nil))
         ((eq action t) (all-completions str2 completion-table nil))
-        ((eq action 'lambda)
-         (eq (try-completion str2 completion-table nil) t))))
+        ((eq action 'lambda) (test-completion str2 completion-table nil))))
     (funcall PC-old-read-file-name-internal string dir action)))
 \f
 
 (provide 'complete)
 
-;;; End.
+;; arch-tag: fc7e2768-ff44-4e22-b579-4d825b968458
+;;; complete.el ends here