From 1493963bb19856c8fffedc1e3091bf1fa61bdf64 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 5 May 2010 22:59:07 -0400 Subject: [PATCH] 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. --- lisp/ChangeLog | 4 ++++ lisp/minibuffer.el | 23 ++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 88c41ea84c2..97a0f8c5b41 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 --git a/lisp/minibuffer.el b/lisp/minibuffer.el index d8f1f0a8e9d..31bdb6993fa 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1983,6 +1983,17 @@ filter out additional entries (because TABLE migth not obey PRED)." (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 @@ filter out additional entries (because TABLE migth not obey PRED)." ;; `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))))) -- 2.39.2