changeset 95121:cc51187bbc1d

(icomplete-simple-completing-p): Allow icomplete-with-completion-tables to say "use it everywhere". (icomplete-completions): Obey completion-styles. Try to accomodate partial-completion style.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 20 May 2008 03:36:20 +0000
parents 7aa8b57db77c
children 79854d9f4984
files lisp/ChangeLog lisp/icomplete.el
diffstat 2 files changed, 57 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Tue May 20 03:16:34 2008 +0000
+++ b/lisp/ChangeLog	Tue May 20 03:36:20 2008 +0000
@@ -1,3 +1,10 @@
+2008-05-20  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* icomplete.el (icomplete-simple-completing-p):
+	Allow icomplete-with-completion-tables to say "use it everywhere".
+	(icomplete-completions): Obey completion-styles.  Try to accomodate
+	partial-completion style.
+
 2008-05-20  Michael Olson  <mwolson@gnu.org>
 
 	* files.el (project-find-settings-file): Change concat to
--- a/lisp/icomplete.el	Tue May 20 03:16:34 2008 +0000
+++ b/lisp/icomplete.el	Tue May 20 03:36:20 2008 +0000
@@ -189,6 +189,7 @@
        (not executing-kbd-macro)
        minibuffer-completion-table
        (or (not (functionp minibuffer-completion-table))
+           (eq icomplete-with-completion-tables t)
            (member minibuffer-completion-table
                    icomplete-with-completion-tables))))
 
@@ -280,29 +281,58 @@
 matches exist.  \(Keybindings for uniquely matched commands
 are exhibited within the square braces.)"
 
-  (let ((comps (all-completions name candidates predicate))
-                                        ; "-determined" - only one candidate
-        (open-bracket-determined (if require-match "(" "["))
-        (close-bracket-determined (if require-match ")" "]")))
+  (let* ((comps (completion-all-completions name candidates predicate
+                                            (length name)))
+         (last (last comps))
+         (base-size (if (consp last) (prog1 (cdr last) (setcdr last nil))))
+         (open-bracket (if require-match "(" "["))
+         (close-bracket (if require-match ")" "]")))
     ;; `concat'/`mapconcat' is the slow part.  With the introduction of
     ;; `icomplete-prospects-length', there is no need for `catch'/`throw'.
-    (if (null comps) (format " %sNo matches%s"
-			     open-bracket-determined
-			     close-bracket-determined)
-      (let* ((most-try (try-completion name (mapcar (function list) comps)))
-	     (most (if (stringp most-try) most-try (car comps)))
-	     (most-len (length most))
-	     (determ (and (> most-len (length name))
-			  (concat open-bracket-determined
-				  (substring most (length name))
-				  close-bracket-determined)))
+    (if (null comps)
+        (format " %sNo matches%s" open-bracket close-bracket)
+      (let* ((most-try (completion-try-completion
+                        name
+	                ;; If the `comps' are 0-based, the result should be
+	                ;; the same with `comps'.
+                        (if base-size candidates comps)
+                        predicate
+                        (length name)))
+	     (most (if (consp most-try) (car most-try) (car comps)))
+             ;; Compare name and most, so we can determine if name is
+             ;; a prefix of most, or something else.
+	     (compare (compare-strings name nil nil
+				       most nil nil completion-ignore-case))
+	     (determ (unless (or (eq t compare) (eq t most-try)
+				 (= (setq compare (1- (abs compare)))
+				    (length most)))
+		       (concat open-bracket
+			       (cond
+				((= compare (length name))
+                                 ;; Typical case: name is a prefix.
+				 (substring most compare))
+				((< compare 5) most)
+				(t (concat "..." (substring most compare))))
+			       close-bracket)))
 	     ;;"-prospects" - more than one candidate
 	     (prospects-len (+ (length determ) 6)) ;; take {,...} into account
+             (prefix-len
+              ;; Find the common prefix among `comps'.
+	      (if (eq t (compare-strings (car comps) nil (length most)
+					 most nil nil case-fold-search))
+                  ;; Common case.
+		  (length most)
+                ;; Else, use try-completion.
+		(let ((comps-prefix (try-completion "" comps)))
+                  (and (stringp comps-prefix)
+                       (length comps-prefix)))))
+
 	     prospects most-is-exact comp limit)
-	(if (eq most-try t)
+	(if (or (eq most-try t) (null (cdr comps)))
 	    (setq prospects nil)
 	  (while (and comps (not limit))
-	    (setq comp (substring (car comps) most-len)
+	    (setq comp
+                  (if prefix-len (substring (car comps) prefix-len) (car comps))
 		  comps (cdr comps))
 	    (cond ((string-equal comp "") (setq most-is-exact t))
 		  ((member comp prospects))
@@ -327,10 +357,10 @@
 		    (if keys (concat "; " keys) ""))
 		  "]"))))))
 
-;;;_* Local emacs vars.
-;;;Local variables:
-;;;allout-layout: (-2 :)
-;;;End:
+;;_* Local emacs vars.
+;;Local variables:
+;;allout-layout: (-2 :)
+;;End:
 
 ;; arch-tag: 339ec25a-0741-4eb6-be63-997532e89b0f
 ;;; icomplete.el ends here