X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/00089cadd72d4cdf458e61d017a6a10582d37f63..892f9671ada52150f280915fb34970b7acb0312a:/lisp/complete.el diff --git a/lisp/complete.el b/lisp/complete.el index 7d50a89d2a..60bddd01f1 100644 --- a/lisp/complete.el +++ b/lisp/complete.el @@ -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 @@ -78,11 +78,6 @@ ;; 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 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] RET finds the file /usr/include/sys/time.h. +\\[find-file] 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))) (provide 'complete) -;;; End. +;; arch-tag: fc7e2768-ff44-4e22-b579-4d825b968458 +;;; complete.el ends here