]> git.eshelyaron.com Git - emacs.git/commitdiff
(completion--embedded-envvar-table): Fix last change.
authorStefan Monnier <monnier@iro.umontreal.ca>
Sat, 24 Oct 2009 00:46:17 +0000 (00:46 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sat, 24 Oct 2009 00:46:17 +0000 (00:46 +0000)
Ignore `pred' now that we receive one.  Handle test-completion specially.

lisp/ChangeLog
lisp/minibuffer.el

index e354027fd4b79416abd144610ceacec04990e173..8363cb40bda558919e600fd2abc23913097fcbd2 100644 (file)
@@ -1,3 +1,9 @@
+2009-10-24  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * 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  <dann@ics.uci.edu>
 
        * vc.el (vc-responsible-backend): Throw an error if not backend is
index cd606eb33b49aedb323d47cafbaa9f2fe068f969..014faeac79c9988d54e653452e6286714b640c4a 100644 (file)
@@ -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."