From: Daniel Mendler Date: Tue, 11 May 2021 07:08:05 +0000 (+0200) Subject: (minibuffer-completion-help): Add group sorting X-Git-Tag: emacs-28.0.90~2379 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=cb8b994217ed958ae6d5076ab1747ea6fb43a8dc;p=emacs.git (minibuffer-completion-help): Add group sorting Sort the groups as returned by the `group-function` of the completion table depending on the value of the customizable variable `completions-group-sort`. By default `completions-group-sort` is set to nil. The variable can be set to the symbol `alphabetical` in order to configure alphabetical sorting. Furthermore, a custom sorting function can be used as value of `completions-group-sort`. * 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`. --- diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 35ae4b8bcb1..e04f1040b38 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1147,10 +1147,22 @@ completion candidates than this number." (defcustom completions-group nil "Enable grouping of completion candidates in the *Completions* buffer. -See also `completions-group-format'." +See also `completions-group-format' and `completions-group-sort'." :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 :tag "No sorting" nil) + (const :tag "Alphabetical sorting" alphabetical) + function) + :version "28.1") + (defcustom completions-group-format (concat (propertize " " 'face 'completions-group-separator) @@ -1434,16 +1446,21 @@ Remove completion BASE prefix string from history elements." (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 groups by 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 @@ -2216,7 +2233,17 @@ variables.") ;; `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