diff --git a/etc/NEWS b/etc/NEWS index 73d12a203e0..3f6b2d2a1fc 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -429,6 +429,11 @@ When non-nil, the commands 'next-completion' and 'previous-completion' automatically wrap around on reaching the beginning or the end of the "*Completions*" buffer. +*** New user option 'completions-sort'. +This option controls the sorting of the completion candidates in +the *Completions* buffer. Available styles are no sorting, +alphabetical (the default), or a custom sort function. + ** Isearch and Replace +++ diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index d58c23af8fb..ecede9479d8 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1173,6 +1173,18 @@ completion candidates than this number." :version "24.1" :type completion--cycling-threshold-type) +(defcustom completions-sort 'alphabetical + "Sort candidates in the *Completions* buffer. + +The value can be nil to disable sorting, `alphabetical' for +alphabetical sorting or a custom sorting function. The sorting +function takes and returns a list of completion candidate +strings." + :type '(choice (const :tag "No sorting" nil) + (const :tag "Alphabetical sorting" alphabetical) + function :tag "Custom function") + :version "29.1") + (defcustom completions-group nil "Enable grouping of completion candidates in the *Completions* buffer. See also `completions-group-format' and `completions-group-sort'." @@ -2268,7 +2280,10 @@ variables.") ;; same, but not always. (setq completions (if sort-fun (funcall sort-fun completions) - (sort completions 'string-lessp))) + (pcase completions-sort + ('nil completions) + ('alphabetical (sort completions #'string-lessp)) + (_ (funcall completions-sort completions))))) ;; After sorting, group the candidates using the ;; `group-function'.