[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master bed9fd41ef 4/6: Allow read-multiple-choice to do long-form answer
From: |
Lars Ingebrigtsen |
Subject: |
master bed9fd41ef 4/6: Allow read-multiple-choice to do long-form answers |
Date: |
Fri, 24 Jun 2022 05:05:00 -0400 (EDT) |
branch: master
commit bed9fd41efc72526a7fddcbe73c2ad9a97495356
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
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.
---
doc/lispref/commands.texi | 7 ++++++-
etc/NEWS | 3 +++
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 0a82bba3bc..6f02218333 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
diff --git a/etc/NEWS b/etc/NEWS
index 7ef7109274..3ed7aae220 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2104,6 +2104,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 195035e6be..dae6590b9b 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
- master updated (c148bfc229 -> e193ea3c34), Lars Ingebrigtsen, 2022/06/24
- master 2ff5cb4cb4 2/6: Make warning about require/autoload while bootstrapping not error out, Lars Ingebrigtsen, 2022/06/24
- master f2b7525e38 5/6: Preload seq, Lars Ingebrigtsen, 2022/06/24
- master bed9fd41ef 4/6: Allow read-multiple-choice to do long-form answers,
Lars Ingebrigtsen <=
- master e193ea3c34 6/6: Allow `kill-buffer' query to save the buffer first, Lars Ingebrigtsen, 2022/06/24
- master bd1f20eea1 1/6: Make debug-early-backtrace more resilient, Lars Ingebrigtsen, 2022/06/24
- master 49910adf87 3/6: Fix cl-generic bootstrap problems, Lars Ingebrigtsen, 2022/06/24