changeset 95187:ee32b9c9936c

(icomplete-eoinput): Remove. (icomplete-overlay): New var to replace it. (icomplete-tidy): Rewrite. (icomplete-exhibit): Use an overlay. (icomplete-completions): Use completion-all-sorted-completions. Obey completion-ignore-case.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Thu, 22 May 2008 03:15:32 +0000
parents edfe642dc91c
children b8f0e53854e1
files lisp/ChangeLog lisp/icomplete.el
diffstat 2 files changed, 34 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Thu May 22 03:09:34 2008 +0000
+++ b/lisp/ChangeLog	Thu May 22 03:15:32 2008 +0000
@@ -1,5 +1,12 @@
 2008-05-22  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* icomplete.el (icomplete-eoinput): Remove.
+	(icomplete-overlay): New var to replace it.
+	(icomplete-tidy): Rewrite.
+	(icomplete-exhibit): Use an overlay.
+	(icomplete-completions): Use completion-all-sorted-completions.
+	Obey completion-ignore-case.
+
 	* files.el (locate-dominating-file): Accept non-existing argument.
 	(project-find-settings-file): Rewrite, using locate-dominating-file.
 
--- a/lisp/icomplete.el	Thu May 22 03:09:34 2008 +0000
+++ b/lisp/icomplete.el	Thu May 22 03:15:32 2008 +0000
@@ -117,9 +117,9 @@
 
 ;;;_ + Internal Variables
 ;;;_  = icomplete-eoinput nil
-(defvar icomplete-eoinput nil
-  "Point where minibuffer input ends and completion info begins.")
-(make-variable-buffer-local 'icomplete-eoinput)
+(defvar icomplete-overlay (make-overlay (point-min) (point-min) nil t t)
+  "Overlay used to display the list of completions.")
+
 ;;;_  = icomplete-pre-command-hook
 (defvar icomplete-pre-command-hook nil
   "Incremental-minibuffer-completion pre-command-hook.
@@ -215,15 +215,7 @@
   "Remove completions display \(if any) prior to new user input.
 Should be run in on the minibuffer `pre-command-hook'.  See `icomplete-mode'
 and `minibuffer-setup-hook'."
-  (when (and icomplete-mode icomplete-eoinput)
-
-    (unless (>= icomplete-eoinput (point-max))
-      (let ((buffer-undo-list t) ; prevent entry
-	    deactivate-mark)
-	(delete-region icomplete-eoinput (point-max))))
-
-    ;; Reestablish the safe value.
-    (setq icomplete-eoinput nil)))
+  (delete-overlay icomplete-overlay))
 
 ;;;_ > icomplete-exhibit ()
 (defun icomplete-exhibit ()
@@ -233,9 +225,6 @@
   (when (and icomplete-mode (icomplete-simple-completing-p))
     (save-excursion
       (goto-char (point-max))
-      ;; Register the end of input, so we know where the extra stuff
-      ;; (match-status info) begins:
-      (setq icomplete-eoinput (point))
                                         ; Insert the match-status information:
       (if (and (> (point-max) (minibuffer-prompt-end))
 	       buffer-undo-list		; Wait for some user input.
@@ -250,16 +239,21 @@
 		;; embarking on computing completions:
 		(sit-for icomplete-compute-delay)))
 	  (let ((text (while-no-input
-			(list
 			 (icomplete-completions
 			  (field-string)
 			  minibuffer-completion-table
 			  minibuffer-completion-predicate
-			  (not minibuffer-completion-confirm)))))
+                         (not minibuffer-completion-confirm))))
 		(buffer-undo-list t)
 		deactivate-mark)
 	    ;; Do nothing if while-no-input was aborted.
-	    (if (consp text) (insert (car text))))))))
+	    (when (stringp text)
+              (move-overlay icomplete-overlay (point) (point) (current-buffer))
+              ;; The current C cursor code doesn't know to use the overlay's
+              ;; marker's stickiness to figure out whether to place the cursor
+              ;; before or after the string, so let's spoon-feed it the pos.
+              (put-text-property 0 1 'cursor t text)
+              (overlay-put icomplete-overlay 'after-string text)))))))
 
 ;;;_ > icomplete-completions (name candidates predicate require-match)
 (defun icomplete-completions (name candidates predicate require-match)
@@ -281,16 +275,16 @@
 matches exist.  \(Keybindings for uniquely matched commands
 are exhibited within the square braces.)"
 
-  (let* ((comps (completion-all-completions name candidates predicate
-                                            (length name)))
-         (last (last comps))
-         (base-size (if (consp last) (prog1 (cdr last) (setcdr last nil))))
+  (let* ((comps (completion-all-sorted-completions))
+         (last (if (consp comps) (last comps)))
+         (base-size (cdr last))
          (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)
+    (if (not (consp comps))
         (format " %sNo matches%s" open-bracket close-bracket)
+      (if last (setcdr last nil))
       (let* ((most-try
               (if (and base-size (> base-size 0))
                   (completion-try-completion
@@ -299,7 +293,8 @@
                 ;; the same with `comps'.
                 (completion-try-completion
                  name comps nil (length name))))
-	     (most (if (consp most-try) (car most-try) (car comps)))
+	     (most (if (consp most-try) (car most-try)
+                     (if 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
@@ -320,7 +315,7 @@
              (prefix-len
               ;; Find the common prefix among `comps'.
 	      (if (eq t (compare-strings (car comps) nil (length most)
-					 most nil nil case-fold-search))
+					 most nil nil completion-ignore-case))
                   ;; Common case.
 		  (length most)
                 ;; Else, use try-completion.
@@ -329,7 +324,7 @@
                        (length comps-prefix)))))
 
 	     prospects most-is-exact comp limit)
-	(if (or (eq most-try t) (null (cdr comps)))
+	(if (eq most-try t) ;; (or (null (cdr comps))
 	    (setq prospects nil)
 	  (while (and comps (not limit))
 	    (setq comp
@@ -339,16 +334,17 @@
 		  ((member comp prospects))
 		  (t (setq prospects-len (+ (length comp) 1 prospects-len))
 		     (if (< prospects-len icomplete-prospects-length)
-			 (setq prospects (cons comp prospects))
+			 (push comp prospects)
 		       (setq limit t))))))
+        ;; Restore the base-size info, since completion-all-sorted-completions
+        ;; is cached.
+        (if last (setcdr last base-size))
 	(if prospects
 	    (concat determ
 		    "{"
 		    (and most-is-exact ",")
-		    (mapconcat 'identity
-			       (sort prospects (function string-lessp))
-			       ",")
-		    (and comps ",...")
+		    (mapconcat 'identity (nreverse prospects) ",")
+		    (and limit ",...")
 		    "}")
 	  (concat determ
 		  " [Matched"