diff options
author | Lars Ingebrigtsen <larsi@gnus.org> | 2022-06-24 11:00:06 +0200 |
---|---|---|
committer | Lars Ingebrigtsen <larsi@gnus.org> | 2022-06-24 11:04:51 +0200 |
commit | bed9fd41efc72526a7fddcbe73c2ad9a97495356 (patch) | |
tree | b31e98db1b149a5096f7ce371b53ccbf37d852b8 | |
parent | 49910adf872a98d9c144d34478a53ecb3e01856f (diff) | |
download | emacs-bed9fd41efc72526a7fddcbe73c2ad9a97495356.tar.gz |
Allow read-multiple-choice to do long-form answers
* doc/lispref/commands.texi (Reading One Event): Document it.
* lisp/emacs-lisp/rmc.el (read-multiple-choice): Allow using
long-form answers instead of single character ones.
(read-multiple-choice--long-answers): New function.
(read-multiple-choice--short-answers): Refactored out from the
main function.
-rw-r--r-- | doc/lispref/commands.texi | 7 | ||||
-rw-r--r-- | etc/NEWS | 3 | ||||
-rw-r--r-- | lisp/emacs-lisp/rmc.el | 25 |
3 files changed, 31 insertions, 4 deletions
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi index 0a82bba3bc7..6f022183336 100644 --- a/doc/lispref/commands.texi +++ b/doc/lispref/commands.texi @@ -3198,7 +3198,7 @@ causes it to evaluate @code{help-form} and display the result. It then continues to wait for a valid input character, or keyboard-quit. @end defun -@defun read-multiple-choice prompt choices &optional help-string show-help +@defun read-multiple-choice prompt choices &optional help-string show-help long-form Ask user a multiple choice question. @var{prompt} should be a string that will be displayed as the prompt. @@ -3217,6 +3217,11 @@ If optional argument @var{show-help} is non-@code{nil}, the help buffer will be displayed immediately, before any user input. If it is a string, use it as the name of the help buffer. +If optional argument @var{long-form} is non-@code{nil}, the user +will have to type in long-form answers (using @code{completing-read}) +instead of hitting a single key. The answers must be among the second +elements of the values in the @var{choices} list. + The return value is the matching value from @var{choices}. @lisp @@ -2105,6 +2105,9 @@ patcomp.el, pc-mode.el, pc-select.el, s-region.el, and sregex.el. * Lisp Changes in Emacs 29.1 +++ +** 'read-multiple-choice' can now use long-form answers. + ++++ ** 'read-regexp' now allows the user to indicate whether to use case folding. +++ diff --git a/lisp/emacs-lisp/rmc.el b/lisp/emacs-lisp/rmc.el index 195035e6be9..dae6590b9bc 100644 --- a/lisp/emacs-lisp/rmc.el +++ b/lisp/emacs-lisp/rmc.el @@ -23,8 +23,6 @@ ;;; Code: -(require 'seq) - (defun rmc--add-key-description (elem) (let* ((char (car elem)) (name (cadr elem)) @@ -125,7 +123,8 @@ buf)) ;;;###autoload -(defun read-multiple-choice (prompt choices &optional help-string show-help) +(defun read-multiple-choice (prompt choices &optional help-string show-help + long-form) "Ask user to select an entry from CHOICES, promting with PROMPT. This function allows to ask the user a multiple-choice question. @@ -163,12 +162,21 @@ dialogs. Otherwise, the function will always use text-mode dialogs. The return value is the matching entry from the CHOICES list. +If LONG-FORM, do a `completing-read' over the NAME elements in +CHOICES instead. + Usage example: \(read-multiple-choice \"Continue connecting?\" \\='((?a \"always\") (?s \"session only\") (?n \"no\")))" + (if long-form + (read-multiple-choice--long-answers prompt choices) + (read-multiple-choice--short-answers + prompt choices help-string show-help))) + +(defun read-multiple-choice--short-answers (prompt choices help-string show-help) (let* ((prompt-choices (if show-help choices (append choices '((?? "?"))))) (altered-names (mapcar #'rmc--add-key-description prompt-choices)) @@ -244,6 +252,17 @@ Usage example: (kill-buffer buf)) (assq tchar choices))) +(defun read-multiple-choice--long-answers (prompt choices) + (let ((answer + (completing-read + (concat prompt " (" + (mapconcat #'identity (mapcar #'cadr choices) "/") + ") ") + (mapcar #'cadr choices) nil t))) + (seq-find (lambda (elem) + (equal (cadr elem) answer)) + choices))) + (provide 'rmc) ;;; rmc.el ends here |