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