[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrite
From: |
Juri Linkov |
Subject: |
bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it |
Date: |
Sat, 23 Nov 2019 23:54:01 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (x86_64-pc-linux-gnu) |
>>> The variable name is ‘message-in-echo-area’. After a little testing,
>>> it seems to handle all such cases well:
>>
>> I have not tested the patch, but it looks good to me.
>
> Actually this patch needs more testing. I found already
> two cases that might be annoying. Better to anticipate
> a possible angry reaction and fix these cases in advance.
After more testing, at least all noticed problems are fixed
with this patch (it also reverts previous commits that
added minibuffer-message and that is not needed anymore):
diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index 079750a3f6..9275513c8d 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -815,8 +815,7 @@ auto-revert-handler
(when revert
(when (and auto-revert-verbose
(not (eq revert 'fast)))
- (with-current-buffer (window-buffer (old-selected-window))
- (minibuffer-message "Reverting buffer `%s'." (buffer-name))))
+ (message "Reverting buffer `%s'." (buffer-name)))
;; If point (or a window point) is at the end of the buffer, we
;; want to keep it at the end after reverting. This allows one
;; to tail a file.
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 4f3342782d..1705b050b5 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -2011,7 +2011,7 @@ isearch-message-properties
(defun isearch--momentary-message (string)
"Print STRING at the end of the isearch prompt for 1 second."
(let ((message-log-max nil))
- (message "%s%s%s"
+ (message-in-echo-area "%s%s%s"
(isearch-message-prefix nil isearch-nonincremental)
isearch-message
(apply #'propertize (format " [%s]" string)
@@ -3168,7 +3170,7 @@ isearch-message
(isearch-message-prefix ellipsis isearch-nonincremental)
m
(isearch-message-suffix c-q-hack)))
- (if c-q-hack m (let ((message-log-max nil)) (message "%s" m)))))
+ (if c-q-hack m (let ((message-log-max nil)) (message-in-echo-area "%s"
m)))))
(defun isearch--describe-regexp-mode (regexp-function &optional space-before)
"Make a string for describing REGEXP-FUNCTION.
diff --git a/lisp/man.el b/lisp/man.el
index ce01fdc805..beec2e616f 100644
--- a/lisp/man.el
+++ b/lisp/man.el
@@ -1474,7 +1474,7 @@ Man-bgproc-sentinel
(kill-buffer Man-buffer)))
(when message
- (minibuffer-message "%s" message)))))
+ (message "%s" message)))))
(defun Man-page-from-arguments (args)
;; Skip arguments and only print the page name.
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index ee3d0095a9..7c87a18273 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -712,16 +712,16 @@ minibuffer-message
(progn
(if args
(apply #'message message args)
- (message "%s" message))
+ (message-in-echo-area "%s" message))
(prog1 (sit-for (or minibuffer-message-timeout 1000000))
- (message nil)))
+ (message-in-echo-area nil)))
;; Record message in the *Messages* buffer
(let ((inhibit-message t))
(if args
(apply #'message message args)
- (message "%s" message)))
+ (message-in-echo-area "%s" message)))
;; Clear out any old echo-area message to make way for our new thing.
- (message nil)
+ (message-in-echo-area nil)
(setq message (if (and (null args)
(string-match-p "\\` *\\[.+\\]\\'" message))
;; Make sure we can put-text-property.
@@ -1838,7 +1838,7 @@ completion--done
(defun minibuffer-completion-help (&optional start end)
"Display a list of possible completions of the current minibuffer contents."
(interactive)
- (message "Making completion list...")
+ (message-in-echo-area "Making completion list...")
(let* ((start (or start (minibuffer-prompt-end)))
(end (or end (point-max)))
(string (buffer-substring start end))
@@ -1849,7 +1849,7 @@ minibuffer-completion-help
minibuffer-completion-predicate
(- (point) start)
md)))
- (message nil)
+ (message-in-echo-area nil)
(if (or (null completions)
(and (not (consp (cdr completions)))
(equal (car completions) string)))
diff --git a/lisp/subr.el b/lisp/subr.el
index 20daed623f..fae06399ef 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -4620,9 +4620,10 @@ do-after-load-evaluation
byte-compile-current-file
byte-compile-root-dir)))
(byte-compile-warn "%s" msg))
- (run-with-idle-timer 0 nil
+ (run-with-timer 0 nil
(lambda (msg)
- (minibuffer-message "%s" msg))
+ (discard-input)
+ (message "%s" msg))
msg)))))
;; Finally, run any other hook.
diff --git a/src/editfns.c b/src/editfns.c
index 8fc866d391..650dc6d4ca 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -2875,8 +2875,57 @@ accent (\\=`) and apostrophe (\\=') are special in the
format; see
any existing message; this lets the minibuffer contents show. See
also `current-message'.
+When the variable `message-in-echo-area' is non-nil, use the function
+`message-in-echo-area' to display the message in the echo area.
+Otherwise, when the minibuffer is active, use `minibuffer-message'
+to temporarily display the message at the end of the minibuffer.
+
usage: (message FORMAT-STRING &rest ARGS) */)
(ptrdiff_t nargs, Lisp_Object *args)
+{
+ if (NILP (Vmessage_in_echo_area)
+ && !inhibit_message
+ && !(NILP (args[0]) || (STRINGP (args[0]) && SBYTES (args[0]) == 0))
+ && WINDOW_LIVE_P (Fold_selected_window ())
+ && BUFFERP (Fwindow_buffer (Fold_selected_window ()))
+ && !NILP (Fminibufferp (Fwindow_buffer (Fold_selected_window ()))))
+ {
+ ptrdiff_t count = SPECPDL_INDEX ();
+
+ /* Avoid possible recursion. */
+ specbind (Qmessage_in_echo_area, Qt);
+
+ record_unwind_current_buffer ();
+ Fset_buffer (Fwindow_buffer (Fold_selected_window ()));
+
+ return unbind_to (count, CALLN (Fapply, intern ("minibuffer-message"),
+ Flist (nargs, args)));
+ }
+ else
+ return Fmessage_in_echo_area (nargs, args);
+}
+
+DEFUN ("message-in-echo-area", Fmessage_in_echo_area, Smessage_in_echo_area,
1, MANY, 0,
+ doc: /* Display a message at the bottom of the screen.
+The message also goes into the `*Messages*' buffer, if `message-log-max'
+is non-nil. (In keyboard macros, that's all it does.)
+Return the message.
+
+In batch mode, the message is printed to the standard error stream,
+followed by a newline.
+
+The first argument is a format control string, and the rest are data
+to be formatted under control of the string. Percent sign (%), grave
+accent (\\=`) and apostrophe (\\=') are special in the format; see
+`format-message' for details. To display STRING without special
+treatment, use (message-in-echo-area "%s" STRING).
+
+If the first argument is nil or the empty string, the function clears
+any existing message; this lets the minibuffer contents show. See
+also `current-message'.
+
+usage: (message-in-echo-area FORMAT-STRING &rest ARGS) */)
+ (ptrdiff_t nargs, Lisp_Object *args)
{
if (NILP (args[0])
|| (STRINGP (args[0])
@@ -4520,6 +4569,11 @@ syms_of_editfns (void)
it to be non-nil. */);
binary_as_unsigned = false;
+ DEFVAR_LISP ("message-in-echo-area", Vmessage_in_echo_area,
+ doc: /* Non-nil means overwrite the minibuffer with a message in
the echo area. */);
+ Vmessage_in_echo_area = Qnil;
+ DEFSYM (Qmessage_in_echo_area, "message-in-echo-area");
+
defsubr (&Spropertize);
defsubr (&Schar_equal);
defsubr (&Sgoto_char);
@@ -4594,6 +4648,7 @@ syms_of_editfns (void)
defsubr (&Semacs_pid);
defsubr (&Ssystem_name);
defsubr (&Smessage);
+ defsubr (&Smessage_in_echo_area);
defsubr (&Smessage_box);
defsubr (&Smessage_or_box);
defsubr (&Scurrent_message);
- bug#19064: bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, (continued)
- bug#19064: bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, martin rudalics, 2019/11/21
- bug#17272: bug#19064: bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Juri Linkov, 2019/11/21
- bug#17272: bug#19064: bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, martin rudalics, 2019/11/22
- bug#17272: bug#19064: bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Juri Linkov, 2019/11/23
- bug#17272: bug#19064: bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Eli Zaretskii, 2019/11/23
- bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Juri Linkov, 2019/11/19
- bug#19064: bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Lars Ingebrigtsen, 2019/11/20
- bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Juri Linkov, 2019/11/20
- bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Juri Linkov, 2019/11/21
- bug#19064: bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Lars Ingebrigtsen, 2019/11/21
- bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it,
Juri Linkov <=
- bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Juri Linkov, 2019/11/26
- bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Lars Ingebrigtsen, 2019/11/27
- bug#19064: bug#17272: bug#19064: bug#17272: bug#19064: 25.0.50; `message' overwrites `y-or-n-p' prompt, so user misses it, Juri Linkov, 2019/11/28