From 2c5807193713893b8cecacf6ae9318e3e504fb93 Mon Sep 17 00:00:00 2001 From: Spencer Baugh Date: Wed, 18 Oct 2023 22:28:59 -0400 Subject: [PATCH] Add read-buffer-sort Add the ability to customize how read-buffer (actually internal-complete-buffer) sorts the buffer completion candidates. * lisp/cus-start.el (standard): Add customization information for read-buffer-sort. * src/minibuf.c (Finternal_complete_buffer): Use read-buffer-sort. (syms_of_minibuf): Add read-buffer-sort. --- lisp/cus-start.el | 4 ++++ src/minibuf.c | 26 +++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lisp/cus-start.el b/lisp/cus-start.el index 054683d7cf6..569a0cf54b3 100644 --- a/lisp/cus-start.el +++ b/lisp/cus-start.el @@ -439,6 +439,10 @@ minibuffer-prompt-properties--setter (read-buffer-function minibuffer (choice (const nil) function)) + (read-buffer-sort minibuffer + (choice (const :tag "completions-sort controls sorting" nil) + (const :tag "sort matching buffer-list" buffer-list)) + "30.1") ;; msdos.c (dos-unsupported-char-glyph display integer) ;; nsterm.m diff --git a/src/minibuf.c b/src/minibuf.c index 58adde1bf66..715b4c08886 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -2186,9 +2186,13 @@ DEFUN ("internal-complete-buffer", Finternal_complete_buffer, Sinternal_complete else if (EQ (flag, Qlambda)) return Ftest_completion (string, Vbuffer_alist, predicate); else if (EQ (flag, Qmetadata)) - return list3 (Qmetadata, - Fcons (Qcategory, Qbuffer), - Fcons (Qcycle_sort_function, Qidentity)); + { + Lisp_Object res = list2 (Fcons (Qcategory, Qbuffer), + Fcons (Qcycle_sort_function, Qidentity)); + if (EQ (Vread_buffer_sort, Qbuffer_list)) + res = Fcons (Fcons (Qdisplay_sort_function, Qidentity), res); + return Fcons (Qmetadata, res); + } else return Qnil; } @@ -2323,6 +2327,7 @@ syms_of_minibuf (void) DEFSYM (Qcase_fold_search, "case-fold-search"); DEFSYM (Qmetadata, "metadata"); DEFSYM (Qcycle_sort_function, "cycle-sort-function"); + DEFSYM (Qdisplay_sort_function, "display-sort-function"); /* A frame parameter. */ DEFSYM (Qminibuffer_exit, "minibuffer-exit"); @@ -2522,6 +2527,21 @@ syms_of_minibuf (void) the minibuffer. However, if `minibuffer-restore-windows' is present in `minibuffer-exit-hook', exiting the minibuffer will remove the window showing the *Completions* buffer, if any. */); + + DEFVAR_LISP ("read-buffer-sort", Vread_buffer_sort, + doc: /* Non-nil means sort completions in `read-buffer'. + +If this is nil (the default), completions in `read-buffer' are sorted +according to `completions-sort'. + +If this is `buffer-list', completions are sorted to match the order of +`buffer-list'. + +This variable only affects the default `read-buffer', so if +`read-buffer-function' is set to a function which does not use +`internal-complete-buffer', this variable will have no effect.*/); + Vread_buffer_sort = Qnil; + read_minibuffer_restore_windows = true; defsubr (&Sactive_minibuffer_window); -- 2.41.0