# HG changeset patch # User Stefan Monnier # Date 1273114747 14400 # Node ID 275d802c85700646b5afe59c3db1c16b471a3562 # Parent 2fb37c89f2f7773947d7ce5be1015ef336b68191 Extract common suffix for * in partial-completion. * minibuffer.el (completion--sreverse, completion--common-suffix): New functions. (completion-pcm--merge-completions): Extract common suffix when safe. diff -r 2fb37c89f2f7 -r 275d802c8570 lisp/ChangeLog --- a/lisp/ChangeLog Wed May 05 22:53:56 2010 -0400 +++ b/lisp/ChangeLog Wed May 05 22:59:07 2010 -0400 @@ -1,5 +1,9 @@ 2010-05-06 Stefan Monnier + * minibuffer.el (completion--sreverse, completion--common-suffix): + New functions. + (completion-pcm--merge-completions): Extract common suffix when safe. + * emacs-lisp/easy-mmode.el (define-minor-mode): Make :variable more flexible. * files.el (auto-save-mode): Use it to define using define-minor-mode. diff -r 2fb37c89f2f7 -r 275d802c8570 lisp/minibuffer.el --- a/lisp/minibuffer.el Wed May 05 22:53:56 2010 -0400 +++ b/lisp/minibuffer.el Wed May 05 22:59:07 2010 -0400 @@ -1983,6 +1983,17 @@ (nconc (completion-pcm--hilit-commonality pattern all) (length prefix))))) +(defun completion--sreverse (str) + "Like `reverse' but for a string STR rather than a list." + (apply 'string (nreverse (mapcar 'identity str)))) + +(defun completion--common-suffix (strs) + "Return the common suffix of the strings STRS." + (completion--sreverse + (try-completion + "" + (mapcar 'completion--sreverse comps)))) + (defun completion-pcm--merge-completions (strs pattern) "Extract the commonality in STRS, with the help of PATTERN." ;; When completing while ignoring case, we want to try and avoid @@ -2044,7 +2055,17 @@ ;; `any' into a `star' because the surrounding context has ;; changed such that string->pattern wouldn't add an `any' ;; here any more. - (unless unique (push elem res)) + (unless unique + (push elem res) + (when (memq elem '(star point)) + ;; Extract common suffix additionally to common prefix. + ;; Only do it for `point' and `star' since for + ;; `any' it could lead to a merged completion that + ;; doesn't itself match the candidates. + (let ((suffix (completion--common-suffix comps))) + (assert (stringp suffix)) + (unless (equal suffix "") + (push suffix res))))) (setq fixed ""))))) ;; We return it in reverse order. res)))))