From: Stefan Monnier Date: Sat, 24 Oct 2009 00:46:17 +0000 (+0000) Subject: (completion--embedded-envvar-table): Fix last change. X-Git-Tag: emacs-pretest-23.1.90~683 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c6432f1e133bd817bb8fa15be3054ede07aebd2d;p=emacs.git (completion--embedded-envvar-table): Fix last change. Ignore `pred' now that we receive one. Handle test-completion specially. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index e354027fd4b..8363cb40bda 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2009-10-24 Stefan Monnier + + * minibuffer.el (completion--embedded-envvar-table): Fix last change. + Ignore `pred' now that we receive one. + Handle test-completion specially. + 2009-10-23 Dan Nicolaescu * vc.el (vc-responsible-backend): Throw an error if not backend is diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index cd606eb33b4..014faeac79c 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1068,11 +1068,25 @@ variables.") "$\\([[:alnum:]_]*\\|{\\([^}]*\\)\\)\\'")) (defun completion--embedded-envvar-table (string pred action) + "Completion table for envvars embedded in a string. +The envvar syntax (and escaping) rules followed by this table are the +same as `substitute-in-file-name'." + ;; We ignore `pred', because the predicates passed to us via + ;; read-file-name-internal are not 100% correct and fail here: + ;; e.g. we get predicates like file-directory-p there, whereas the filename + ;; completed needs to be passed through substitute-in-file-name before it + ;; can be passed to file-directory-p. (when (string-match completion--embedded-envvar-re string) (let* ((beg (or (match-beginning 2) (match-beginning 1))) (table (completion--make-envvar-table)) (prefix (substring string 0 beg))) - (if (eq (car-safe action) 'boundaries) + (cond + ((eq action 'lambda) + ;; This table is expected to be used in conjunction with some + ;; other table that provides the "main" completion. Let the + ;; other table handle the test-completion case. + nil) + ((eq (car-safe action) 'boundaries) ;; Only return boundaries if there's something to complete, ;; since otherwise when we're used in ;; completion-table-in-turn, we could return boundaries and @@ -1080,14 +1094,15 @@ variables.") ;; FIXME: Maybe it should rather be fixed in ;; completion-table-in-turn instead, but it's difficult to ;; do it efficiently there. - (when (try-completion prefix table pred) + (when (try-completion (substring string beg) table nil) ;; Compute the boundaries of the subfield to which this ;; completion applies. (let ((suffix (cdr action))) (list* 'boundaries (or (match-beginning 2) (match-beginning 1)) (when (string-match "[^[:alnum:]_]" suffix) - (match-beginning 0))))) + (match-beginning 0)))))) + (t (if (eq (aref string (1- beg)) ?{) (setq table (apply-partially 'completion-table-with-terminator "}" table))) @@ -1095,7 +1110,7 @@ variables.") ;; envvar completion to be case-sensitive. (let ((completion-ignore-case nil)) (completion-table-with-context - prefix table (substring string beg) pred action)))))) + prefix table (substring string beg) nil action))))))) (defun completion-file-name-table (string pred action) "Completion table for file names."