]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow not clearing the echo area
authorJuri Linkov <juri@linkov.net>
Sat, 23 Apr 2022 15:17:15 +0000 (17:17 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sat, 23 Apr 2022 15:17:15 +0000 (17:17 +0200)
* doc/lispref/display.texi (Displaying Messages): Document it.
* lisp/minibuffer.el (clear-minibuffer-message): Return nil.

* src/xdisp.c (clear_message): Respect the dont-clear-message
value.

doc/lispref/display.texi
etc/NEWS
lisp/minibuffer.el
src/xdisp.c

index 2bd0a81fadc494da76883997a2c3c8afc982666f..0dd8451479303a3c7bc114e204ae8c7959aeaa38 100644 (file)
@@ -336,7 +336,10 @@ functions call it with no arguments when their argument message is
 Usually this function is called when the next input event arrives
 after displaying an echo-area message.  The function is expected to
 clear the message displayed by its counterpart function specified by
-@code{set-message-function}.
+@code{set-message-function}, but doesn't have to.  If the function
+wants the echo area to remain uncleared, it should return the symbol
+@code{dont-clear-message}; any other value will result in the echo
+area being cleared.
 
 The default value is the function that clears the message displayed in
 an active minibuffer.
index 57bcef36f135127f16edd47d7c6c5a790640efbc..f7d81335cc360969f1f8690c24a7b901b5104a93 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1462,6 +1462,11 @@ functions.
 \f
 * Lisp Changes in Emacs 29.1
 
++++
+** The return value of 'clear-message-function' is not ignored anymore.
+If the function returns 'dont-clear-message', then the message is not
+cleared, with the assumption that the function cleared it itself.
+
 +++
 ** The local variable section now supports defining fallback modes.
 This was previously only available when using a property line (i.e.,
index d52084afc3ccabf821ca5cbb8014d55185adac29..ef71b4e6be62ed43035bd6ad140081a60742bd76 100644 (file)
@@ -864,7 +864,11 @@ Intended to be called via `clear-message-function'."
       (setq minibuffer-message-timer nil))
     (when (overlayp minibuffer-message-overlay)
       (delete-overlay minibuffer-message-overlay)
-      (setq minibuffer-message-overlay nil))))
+      (setq minibuffer-message-overlay nil)))
+
+  ;; Return nil telling the caller that the message
+  ;; should be also handled by the caller.
+  nil)
 
 (setq clear-message-function 'clear-minibuffer-message)
 
index a3a4338eb4f3ca5aa670900f8e46fdf1865bef57..dccff9f2ea6fa51f1edbb2131cf99f620b5622d8 100644 (file)
@@ -12681,18 +12681,23 @@ set_message_1 (void *a1, Lisp_Object string)
 void
 clear_message (bool current_p, bool last_displayed_p)
 {
+  Lisp_Object preserve = Qnil;
+
   if (current_p)
     {
-      echo_area_buffer[0] = Qnil;
-      message_cleared_p = true;
-
       if (FUNCTIONP (Vclear_message_function))
         {
           specpdl_ref count = SPECPDL_INDEX ();
           specbind (Qinhibit_quit, Qt);
-          safe_call (1, Vclear_message_function);
+          preserve = safe_call (1, Vclear_message_function);
           unbind_to (count, Qnil);
         }
+
+      if (!EQ (preserve, Qdont_clear_message))
+        {
+          echo_area_buffer[0] = Qnil;
+          message_cleared_p = true;
+        }
     }
 
   if (last_displayed_p)
@@ -36557,12 +36562,20 @@ message displayed by this function), and `command-error-function'
 (which controls how error messages are displayed).  */);
   Vset_message_function = Qnil;
 
+  DEFSYM (Qdont_clear_message, "dont-clear-message");
   DEFVAR_LISP ("clear-message-function", Vclear_message_function,
               doc: /* If non-nil, function to clear echo-area messages.
 Usually this function is called when the next input event arrives.
-The function is called without arguments.  It is expected to clear the
-message displayed by its counterpart function specified by
-`set-message-function'.  */);
+It is expected to clear the message displayed by its counterpart
+function specified by `set-message-function'.
+
+The function is called without arguments.
+
+If this function returns a value that isn't `dont-clear-message', the
+message is cleared from the echo area as usual.  If this function
+returns `dont-clear-message', this means that the message was already
+handled, and the original message text will not be cleared from the
+echo area.  */);
   Vclear_message_function = Qnil;
 
   DEFVAR_LISP ("redisplay--all-windows-cause", Vredisplay__all_windows_cause,