From: Juri Linkov <juri@linkov.net>
To: Eli Zaretskii <eliz@gnu.org>
Cc: rudalics@gmx.at, rms@gnu.org, emacs-devel@gnu.org
Subject: Re: Confused by y-or-n-p
Date: Mon, 28 Dec 2020 19:06:32 +0200 [thread overview]
Message-ID: <87y2hhri3n.fsf@mail.linkov.net> (raw)
In-Reply-To: <ABEA40FB-F14A-4DB4-A824-1FA2092A982E@gnu.org> (Eli Zaretskii's message of "Mon, 28 Dec 2020 11:36:09 +0200")
[-- Attachment #1: Type: text/plain, Size: 286 bytes --]
>> > Could you please make such a change?
>>
>> Martin suggested to add the "use the old implementation" option
>> to Emacs 27.2. Is it OK with you?
>
> Yes, thanks.
Here is the first version of the patch for master. If generally it's OK,
then it could be backported to Emacs 27.2:
[-- Attachment #2: use-read-key.patch --]
[-- Type: text/x-diff, Size: 6616 bytes --]
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 0f68b47073..f83824a272 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -145,7 +145,7 @@ dired--no-subst-explain
(defun dired--no-subst-ask (char nb-occur details)
(let ((hilit-char (propertize (string char) 'face 'warning))
(choices `(?y ?n ?? ,@(when details '(?^)))))
- (read-char-from-minibuffer
+ (read-char-choice
(format-message
(ngettext
"%d occurrence of `%s' will not be substituted. Proceed? (%s) "
@@ -1380,7 +1380,7 @@ dired-query
(format " [Type yn!q or %s] "
(key-description (vector help-char)))
" [Type y, n, q or !] ")))
- (set sym (setq char (read-char-from-minibuffer prompt char-choices)))
+ (set sym (setq char (read-char-choice prompt char-choices)))
(if (memq char '(?y ?\s ?!)) t)))))
\f
diff --git a/lisp/files.el b/lisp/files.el
index 70d451cccf..637aaa130a 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -2141,7 +2141,7 @@ files--ask-user-about-large-file
("Yes" . ?y)
("No" . ?n)
("Open literally" . ?l)))
- (read-char-from-minibuffer
+ (read-char-choice
(concat prompt " (y)es or (n)o or (l)iterally ")
'(?y ?Y ?n ?N ?l ?L)))))
(cond ((memq choice '(?y ?Y)) nil)
@@ -3538,7 +3538,7 @@ hack-local-variables-confirm
", or C-v/M-v to scroll")))
char)
(if offer-save (push ?! exit-chars))
- (setq char (read-char-from-minibuffer prompt exit-chars))
+ (setq char (read-char-choice prompt exit-chars))
(when (and offer-save (= char ?!) unsafe-vars)
(customize-push-and-save 'safe-local-variable-values unsafe-vars))
(prog1 (memq char '(?! ?\s ?y))
diff --git a/lisp/subr.el b/lisp/subr.el
index 384dbb25cf..592c633a35 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -2626,6 +2626,10 @@ read-number
t)))
n))
+(defvar read-char-choice-use-read-key nil
+ "Prefer `read-key' when reading a character by `read-char-choice'.
+Otherwise, use the minibuffer.")
+
(defun read-char-choice (prompt chars &optional inhibit-keyboard-quit)
"Read and return one of CHARS, prompting for PROMPT.
Any input that is not one of CHARS is ignored.
@@ -2636,6 +2640,8 @@ read-char-choice
If you bind the variable `help-form' to a non-nil value
while calling this function, then pressing `help-char'
causes it to evaluate `help-form' and display the result."
+ (if (not read-char-choice-use-read-key)
+ (read-char-from-minibuffer prompt chars)
(unless (consp chars)
(error "Called `read-char-choice' without valid char choices"))
(let (char done show-help (helpbuf " *Char Help*"))
@@ -2673,7 +2679,7 @@ read-char-choice
(keyboard-quit))))))))
;; Display the question with the answer. But without cursor-in-echo-area.
(message "%s%s" prompt (char-to-string char))
- char))
+ char)))
(defun sit-for (seconds &optional nodisp obsolete)
"Redisplay, then wait for SECONDS seconds. Stop when input is available.
@@ -2920,6 +2926,10 @@ y-or-n-p-insert-other
(minibuffer-message "Please answer y or n")
(sit-for 2)))
+(defvar y-or-n-p-use-read-key nil
+ "Prefer `read-key' when answering a \"y or n\" question by `y-or-n-p'.
+Otherwise, use the minibuffer.")
+
(defvar empty-history)
(defun y-or-n-p (prompt)
@@ -2980,6 +2990,41 @@ y-or-n-p
use-dialog-box)
(setq prompt (funcall padded prompt t)
answer (x-popup-dialog t `(,prompt ("Yes" . act) ("No" . skip)))))
+ (y-or-n-p-use-read-key
+ ;; ¡Beware! when I tried to edebug this code, Emacs got into a weird state
+ ;; where all the keys were unbound (i.e. it somehow got triggered
+ ;; within read-key, apparently). I had to kill it.
+ (setq prompt (funcall padded prompt))
+ (while
+ (let* ((scroll-actions '(recenter scroll-up scroll-down
+ scroll-other-window scroll-other-window-down))
+ (key
+ (let ((cursor-in-echo-area t))
+ (when minibuffer-auto-raise
+ (raise-frame (window-frame (minibuffer-window))))
+ (read-key (propertize (if (memq answer scroll-actions)
+ prompt
+ (concat "Please answer y or n. "
+ prompt))
+ 'face 'minibuffer-prompt)))))
+ (setq answer (lookup-key query-replace-map (vector key) t))
+ (cond
+ ((memq answer '(skip act)) nil)
+ ((eq answer 'recenter)
+ (recenter) t)
+ ((eq answer 'scroll-up)
+ (ignore-errors (scroll-up-command)) t)
+ ((eq answer 'scroll-down)
+ (ignore-errors (scroll-down-command)) t)
+ ((eq answer 'scroll-other-window)
+ (ignore-errors (scroll-other-window)) t)
+ ((eq answer 'scroll-other-window-down)
+ (ignore-errors (scroll-other-window-down)) t)
+ ((or (memq answer '(exit-prefix quit)) (eq key ?\e))
+ (signal 'quit nil) t)
+ (t t)))
+ (ding)
+ (discard-input)))
(t
(setq prompt (funcall padded prompt))
(let* ((empty-history '())
diff --git a/lisp/userlock.el b/lisp/userlock.el
index ec76322337..249f40e9af 100644
--- a/lisp/userlock.el
+++ b/lisp/userlock.el
@@ -159,7 +159,7 @@ ask-user-about-supersession-threat
(message "%s" prompt)
(error "Cannot resolve conflict in batch mode"))
(while (null answer)
- (setq answer (read-char-from-minibuffer prompt choices))
+ (setq answer (read-char-choice prompt choices))
(cond ((memq answer '(?? ?\C-h))
(ask-user-about-supersession-help)
(setq answer nil))
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index 8250316bcc..bb5d26d29e 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -338,7 +338,7 @@ widget-choose
'(display-buffer-in-direction
(direction . bottom)
(window-height . fit-window-to-buffer)))
- (setq value (read-char-from-minibuffer
+ (setq value (read-char-choice
(format "%s: " title)
(mapcar #'car alist)))))
(cdr (assoc value alist))))))
next prev parent reply other threads:[~2020-12-28 17:06 UTC|newest]
Thread overview: 210+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-23 15:24 Confused by y-or-n-p Eli Zaretskii
2020-12-23 16:45 ` Stefan Monnier
2020-12-23 17:04 ` Jean Louis
2020-12-23 17:35 ` Eli Zaretskii
2020-12-23 18:11 ` Stefan Monnier
2020-12-23 18:44 ` Eli Zaretskii
2020-12-25 4:29 ` Richard Stallman
2020-12-23 19:48 ` Lars Ingebrigtsen
2020-12-23 19:53 ` Karl Fogel
2020-12-23 20:27 ` Eli Zaretskii
2020-12-24 18:26 ` Karl Fogel
2020-12-24 5:56 ` Richard Stallman
2020-12-24 5:53 ` Richard Stallman
2020-12-24 6:06 ` David Masterson
2020-12-24 16:49 ` João Távora
2020-12-24 15:38 ` martin rudalics
2020-12-24 20:47 ` Juri Linkov
2020-12-25 7:23 ` Eli Zaretskii
2020-12-25 9:07 ` martin rudalics
2020-12-25 11:32 ` Eli Zaretskii
2020-12-25 13:20 ` martin rudalics
2020-12-26 10:24 ` Richard Stallman
2020-12-26 11:01 ` Jean Louis
2020-12-26 13:41 ` martin rudalics
2020-12-27 16:25 ` Juri Linkov
2020-12-27 17:16 ` martin rudalics
2020-12-28 8:48 ` Juri Linkov
2020-12-27 18:06 ` Eli Zaretskii
2020-12-28 8:52 ` Juri Linkov
2020-12-28 9:36 ` Eli Zaretskii
2020-12-28 17:06 ` Juri Linkov [this message]
2020-12-28 17:28 ` Eli Zaretskii
2020-12-30 9:54 ` Juri Linkov
2021-01-02 5:25 ` Richard Stallman
2021-01-02 13:36 ` Richard Stallman
2021-01-02 5:25 ` Richard Stallman
2021-01-02 5:25 ` Richard Stallman
2021-01-02 7:06 ` Eli Zaretskii
2021-01-02 7:22 ` Lars Ingebrigtsen
2021-01-02 17:06 ` Drew Adams
2021-01-02 17:14 ` Eli Zaretskii
2021-01-03 6:06 ` Richard Stallman
2021-01-03 15:16 ` Eli Zaretskii
2021-01-04 5:16 ` Richard Stallman
2021-01-04 6:10 ` Stefan Monnier
2021-01-04 7:54 ` Stefan Kangas
2021-01-04 9:21 ` martin rudalics
2021-01-04 9:24 ` Lars Ingebrigtsen
2021-01-04 9:55 ` martin rudalics
2021-01-04 11:28 ` Andrea Corallo via Emacs development discussions.
2021-01-04 14:58 ` Dmitry Gutov
2021-01-04 15:09 ` Eli Zaretskii
2021-01-04 15:17 ` Lars Ingebrigtsen
2021-01-04 16:10 ` Eli Zaretskii
2021-01-05 8:16 ` Lars Ingebrigtsen
2021-01-05 15:03 ` Eli Zaretskii
2021-01-06 5:01 ` Richard Stallman
2021-01-06 15:19 ` Eli Zaretskii
2021-01-04 17:17 ` Stefan Monnier
2021-01-04 17:43 ` Eli Zaretskii
2021-01-04 18:02 ` Stefan Monnier
2021-01-04 18:15 ` Eli Zaretskii
2021-01-05 8:32 ` Lars Ingebrigtsen
2021-01-06 5:02 ` Richard Stallman
2021-01-06 15:20 ` Eli Zaretskii
2021-01-06 16:44 ` Stefan Monnier
2021-01-06 17:05 ` Eli Zaretskii
2021-01-06 17:13 ` Stefan Monnier
2021-01-04 17:20 ` martin rudalics
2021-01-04 17:43 ` Lars Ingebrigtsen
2021-01-04 18:52 ` martin rudalics
2021-01-05 8:33 ` Lars Ingebrigtsen
2021-01-04 18:04 ` Stefan Monnier
2021-01-06 5:03 ` Richard Stallman
2021-01-06 15:23 ` Eli Zaretskii
2021-01-07 7:53 ` Richard Stallman
2021-01-06 5:01 ` Richard Stallman
2021-01-04 17:53 ` Juri Linkov
2021-01-05 6:33 ` Richard Stallman
2021-01-05 14:57 ` Eli Zaretskii
2021-01-05 6:35 ` Richard Stallman
2021-01-04 10:28 ` Gregory Heytings via Emacs development discussions.
2021-01-04 17:22 ` Stefan Monnier
2021-01-04 17:28 ` martin rudalics
2021-01-06 5:03 ` Richard Stallman
2021-01-04 22:18 ` Gregory Heytings via Emacs development discussions.
2021-01-05 14:50 ` Eli Zaretskii
2021-01-06 0:14 ` Gregory Heytings via Emacs development discussions.
2021-01-06 3:34 ` Eli Zaretskii
2021-01-06 9:41 ` Gregory Heytings via Emacs development discussions.
2021-01-06 15:33 ` Eli Zaretskii
2021-01-06 15:46 ` Tassilo Horn
2021-01-06 16:08 ` Eli Zaretskii
2021-01-06 16:36 ` Tassilo Horn
2021-01-06 16:58 ` Eli Zaretskii
2021-01-06 23:57 ` Gregory Heytings via Emacs development discussions.
2021-01-07 9:41 ` Stefan Kangas
2021-01-08 6:17 ` Richard Stallman
2021-01-07 7:41 ` Richard Stallman
2021-01-07 14:23 ` Eli Zaretskii
2021-01-13 15:57 ` Richard Stallman
2021-01-06 5:13 ` Richard Stallman
2021-01-05 6:29 ` Richard Stallman
2021-01-04 8:52 ` Lars Ingebrigtsen
2021-01-05 6:33 ` Richard Stallman
2021-01-05 14:44 ` Stefan Monnier
2021-01-07 7:33 ` Richard Stallman
2021-01-07 14:18 ` Eli Zaretskii
2021-01-07 15:09 ` Stefan Monnier
2021-01-13 15:57 ` Richard Stallman
2021-01-13 16:16 ` Eli Zaretskii
2021-01-15 5:28 ` Richard Stallman
2021-01-15 7:13 ` Eli Zaretskii
2021-01-17 6:03 ` Richard Stallman
2021-01-07 15:10 ` Stefan Monnier
2021-01-05 14:58 ` Eli Zaretskii
2021-01-04 14:59 ` Eli Zaretskii
2021-01-06 5:01 ` Richard Stallman
2021-01-06 15:16 ` Eli Zaretskii
2021-01-06 21:18 ` Alfred M. Szmidt
2021-01-07 3:32 ` Eli Zaretskii
2021-01-06 15:28 ` Stefan Monnier
2021-01-06 5:01 ` Richard Stallman
2021-01-06 15:17 ` Eli Zaretskii
2021-01-04 5:17 ` Richard Stallman
2021-01-04 6:12 ` Stefan Monnier
2021-01-04 15:01 ` Eli Zaretskii
2021-01-06 5:01 ` Richard Stallman
2021-01-06 15:14 ` Eli Zaretskii
2021-01-06 5:01 ` Richard Stallman
2021-01-06 15:16 ` Eli Zaretskii
2021-01-07 7:53 ` Richard Stallman
2021-01-07 14:32 ` Eli Zaretskii
2021-01-04 10:28 ` Gregory Heytings via Emacs development discussions.
2021-01-04 11:02 ` Alan Mackenzie
2021-01-04 11:35 ` Gregory Heytings via Emacs development discussions.
2021-01-04 12:34 ` Alan Mackenzie
2021-01-04 13:10 ` Gregory Heytings via Emacs development discussions.
2021-01-04 17:21 ` martin rudalics
2021-01-05 10:48 ` Alan Mackenzie
2021-01-05 11:10 ` tomas
2021-01-05 15:34 ` martin rudalics
2021-01-04 15:19 ` Eli Zaretskii
2021-01-04 22:17 ` Gregory Heytings via Emacs development discussions.
2021-01-05 11:44 ` Alan Mackenzie
2021-01-05 14:48 ` Eli Zaretskii
2021-01-05 18:18 ` Juri Linkov
2021-01-05 6:44 ` Richard Stallman
2021-01-03 6:01 ` Richard Stallman
2021-01-03 6:01 ` Richard Stallman
2021-01-04 18:03 ` Juri Linkov
2021-01-06 5:03 ` Richard Stallman
2021-01-14 8:50 ` Juri Linkov
2021-01-15 5:41 ` Richard Stallman
2021-01-03 6:03 ` Richard Stallman
2021-01-03 15:13 ` Eli Zaretskii
2021-01-05 6:25 ` Richard Stallman
2021-01-05 14:54 ` Eli Zaretskii
2021-01-06 0:14 ` Gregory Heytings via Emacs development discussions.
2021-01-06 0:44 ` Stefan Monnier
2021-01-06 9:41 ` Gregory Heytings via Emacs development discussions.
2021-01-06 11:06 ` Stefan Kangas
2021-01-06 15:35 ` Eli Zaretskii
2021-01-06 15:46 ` Drew Adams
2021-01-06 23:57 ` Gregory Heytings via Emacs development discussions.
2021-01-07 9:46 ` Stefan Kangas
2021-01-07 10:03 ` Gregory Heytings via Emacs development discussions.
2021-01-07 10:29 ` Stefan Kangas
2021-01-09 6:34 ` Richard Stallman
2021-01-09 8:32 ` Eli Zaretskii
2021-01-09 14:06 ` Following etc/NEWS on the development branch (was: Confused by y-or-n-p) Kévin Le Gouguec
2021-01-09 14:24 ` Eli Zaretskii
2021-01-09 16:05 ` Following etc/NEWS on the development branch Kévin Le Gouguec
2021-01-09 9:34 ` Confused by y-or-n-p Gregory Heytings via Emacs development discussions.
2021-01-10 6:07 ` Richard Stallman
2021-01-07 14:09 ` Eli Zaretskii
2021-01-07 23:34 ` Gregory Heytings via Emacs development discussions.
2021-01-08 2:10 ` Stefan Monnier
2021-01-09 9:34 ` Gregory Heytings via Emacs development discussions.
2021-01-08 7:16 ` Eli Zaretskii
2021-01-09 6:44 ` Stealing minibuffers [Was: Confused by y-or-n-p] Richard Stallman
2021-01-09 9:34 ` Gregory Heytings via Emacs development discussions.
2021-01-09 10:04 ` Eli Zaretskii
2021-01-06 15:32 ` Confused by y-or-n-p Eli Zaretskii
2021-01-07 7:52 ` Richard Stallman
2021-01-07 14:27 ` Eli Zaretskii
2021-01-07 7:52 ` Richard Stallman
2021-01-06 3:35 ` Eli Zaretskii
2020-12-28 5:26 ` Richard Stallman
2020-12-28 5:51 ` Drew Adams
2020-12-28 8:59 ` Juri Linkov
2020-12-26 10:24 ` Richard Stallman
2020-12-26 10:51 ` Eli Zaretskii
2020-12-27 5:38 ` Richard Stallman
2020-12-25 9:23 ` Juri Linkov
2020-12-25 11:46 ` Eli Zaretskii
2020-12-25 8:42 ` martin rudalics
2020-12-25 11:31 ` Eli Zaretskii
2020-12-25 13:20 ` martin rudalics
2020-12-26 10:24 ` Richard Stallman
2020-12-26 10:41 ` Sv: " arthur miller
2020-12-27 5:38 ` Richard Stallman
2020-12-26 10:49 ` Eli Zaretskii
2020-12-26 13:45 ` martin rudalics
2020-12-27 5:46 ` Richard Stallman
2020-12-26 18:30 ` Drew Adams
2020-12-25 4:40 ` Richard Stallman
2020-12-25 8:42 ` martin rudalics
2020-12-28 17:09 ` Juri Linkov
2020-12-29 8:53 ` martin rudalics
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y2hhri3n.fsf@mail.linkov.net \
--to=juri@linkov.net \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=rms@gnu.org \
--cc=rudalics@gmx.at \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).