unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
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))))))

  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).