# HG changeset patch # User Stefan Monnier # Date 1211254580 0 # Node ID cc51187bbc1d0f01e4f11fa06e31917e6a618156 # Parent 7aa8b57db77c4384dc5ccc1141c19727e9ea6d38 (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. diff -r 7aa8b57db77c -r cc51187bbc1d lisp/ChangeLog --- 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 + + * 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 * files.el (project-find-settings-file): Change concat to diff -r 7aa8b57db77c -r cc51187bbc1d lisp/icomplete.el --- 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