From 5fc173f155e1fb9caae2675d0d4f9667a5d99a45 Mon Sep 17 00:00:00 2001 From: Daniel Mendler Date: Tue, 11 May 2021 09:08:05 +0200 Subject: [PATCH 5/5] (minibuffer-completion-help): Add group sorting Sorting the groups as returned by the `group-function` of the completion table depending on the value of `completions-group-sort`. By default `completions-group-sort` is set to nil, the value `alphabetical` is offered for alphabetical sorting. Furthermore custom sorting functions can be used. * lisp/minibuffer.el (completions-group-sort): New variable. (minibuffer--group-by): Add SORT-FUN argument. (minibuffer-completion-help): Pass `completions-group-sort` to `minibuffer--group-by`. --- lisp/minibuffer.el | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 73a38a8137..fd94718497 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1151,6 +1151,18 @@ completions-group :type 'boolean :version "28.1") +(defcustom completions-group-sort nil + "Sort groups in the *Completions* buffer. + +The value can either be nil to disable sorting, `alphabetical' for +alphabetical sorting or a custom sorting function. The sorting +function takes and returns an alist of groups, where each element is a +pair of a group title string and a list of group candidate strings." + :type '(choice (const nil :tag "No sorting") + (const alphabetical :tag "Alphabetical sorting") + function) + :version "28.1") + (defcustom completions-group-format (concat (propertize " " 'face 'completions-group-separator) @@ -1432,16 +1444,21 @@ minibuffer--sort-preprocess-history (substring c base-size))) hist))))) -(defun minibuffer--group-by (fun elems) - "Group ELEMS by FUN." +(defun minibuffer--group-by (group-fun sort-fun elems) + "Group ELEMS by GROUP-FUN and sort using SORT-FUN." (let ((groups)) (dolist (cand elems) - (let* ((key (funcall fun cand nil)) + (let* ((key (funcall group-fun cand nil)) (group (assoc key groups))) (if group (setcdr group (cons cand (cdr group))) (push (list key cand) groups)))) - (mapcan (lambda (x) (nreverse (cdr x))) (nreverse groups)))) + (setq groups (nreverse groups) + groups (mapc (lambda (x) + (setcdr x (nreverse (cdr x)))) + groups) + groups (funcall sort-fun groups)) + (mapcan #'cdr groups))) (defun completion-all-sorted-completions (&optional start end) (or completion-all-sorted-completions @@ -2212,7 +2229,17 @@ minibuffer-completion-help ;; `group-function'. (when group-fun (setq completions - (minibuffer--group-by group-fun completions))) + (minibuffer--group-by + group-fun + (pcase completions-group-sort + ('nil #'identity) + ('alphabetical + (lambda (groups) + (sort groups + (lambda (x y) + (string< (car x) (car y)))))) + (_ completions-group-sort)) + completions))) (cond (aff-fun -- 2.20.1