emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 43a5f22857: Allow redirecting `message' output to a different buf


From: Lars Ingebrigtsen
Subject: master 43a5f22857: Allow redirecting `message' output to a different buffer
Date: Sat, 29 Jan 2022 11:24:55 -0500 (EST)

branch: master
commit 43a5f22857e3d41ef50068d0b61c32d92fb30ef0
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Allow redirecting `message' output to a different buffer
    
    * doc/lispref/display.texi (Logging Messages): Document it.
    * src/xdisp.c (message_dolog): Add sanity checking.
    (syms_of_xdisp): Make Vmessages_buffer_name into a defvar
    (bug#27170).
---
 doc/lispref/display.texi | 10 ++++++++++
 etc/NEWS                 |  4 ++++
 src/xdisp.c              | 17 +++++++++++------
 test/src/xdisp-tests.el  |  9 +++++++++
 4 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 3ce93200a5..ee86df446a 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -612,6 +612,16 @@ how to display a message and prevent it from being logged:
 @end example
 @end defopt
 
+@defvar messages-buffer-name
+This variable has the name of the buffer where messages should be
+logged to, and defaults to @file{*Messages*}.  Some packages may find
+it useful to temporarily redirect the output to a different buffer
+(perhaps to write the buffer out to a log file later), and they can
+bind this variable to a different buffer name.  (Note that this buffer
+(if it doesn't exist already), will be created and put into
+@code{messages-buffer-mode}.)
+@end defvar
+
   To make @file{*Messages*} more convenient for the user, the logging
 facility combines successive identical messages.  It also combines
 successive related messages for the sake of two cases: question
diff --git a/etc/NEWS b/etc/NEWS
index 19eee6cf1d..184046c9ec 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1023,6 +1023,10 @@ functions.
 
 * Lisp Changes in Emacs 29.1
 
+** New variable 'messages-buffer-name'.
+This variable (defaulting to "*Messages*") allows packages to override
+where messages are logged.
+
 +++
 ** New function 'readablep'.
 This function says whether an object can be written out and then
diff --git a/src/xdisp.c b/src/xdisp.c
index 26bd45a861..381df49070 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -741,10 +741,6 @@ int update_mode_lines;
 
 static bool line_number_displayed;
 
-/* The name of the *Messages* buffer, a string.  */
-
-static Lisp_Object Vmessages_buffer_name;
-
 /* Current, index 0, and last displayed echo area message.  Either
    buffers from echo_buffers, or nil to indicate no message.  */
 
@@ -11378,6 +11374,10 @@ message_dolog (const char *m, ptrdiff_t nbytes, bool 
nlflag, bool multibyte)
       old_deactivate_mark = Vdeactivate_mark;
       oldbuf = current_buffer;
 
+      /* Sanity check, in case the variable has been set to something
+        invalid.  */
+      if (! STRINGP (Vmessages_buffer_name))
+       Vmessages_buffer_name = build_string ("*Messages*");
       /* Ensure the Messages buffer exists, and switch to it.
          If we created it, set the major-mode.  */
       bool newbuffer = NILP (Fget_buffer (Vmessages_buffer_name));
@@ -35626,8 +35626,13 @@ be let-bound around code that needs to disable 
messages temporarily. */);
   staticpro (&echo_area_buffer[0]);
   staticpro (&echo_area_buffer[1]);
 
-  Vmessages_buffer_name = build_pure_c_string ("*Messages*");
-  staticpro (&Vmessages_buffer_name);
+  DEFVAR_LISP ("messages-buffer-name", Vmessages_buffer_name,
+    doc: /* The name of the buffer where messages are logged.
+This is normally \"\*Messages*\", but can be rebound by packages that
+wish to redirect messages to a different buffer.  (If the buffer
+doesn't exist, it will be created and put into
+`messages-buffer-mode'.)  */);
+  Vmessages_buffer_name = build_string ("*Messages*");
 
   mode_line_proptrans_alist = Qnil;
   staticpro (&mode_line_proptrans_alist);
diff --git a/test/src/xdisp-tests.el b/test/src/xdisp-tests.el
index 0870dc9de4..6ff64d0431 100644
--- a/test/src/xdisp-tests.el
+++ b/test/src/xdisp-tests.el
@@ -170,4 +170,13 @@ int main () {
     (should (equal (get-display-property 2 'height) 2.0))
     (should (equal (get-display-property 2 'space-width) 20))))
 
+(ert-deftest test-messages-buffer-name ()
+  (should
+   (equal
+    (let ((messages-buffer-name "test-message"))
+      (message "foo")
+      (with-current-buffer messages-buffer-name
+        (buffer-string)))
+    "foo\n")))
+
 ;;; xdisp-tests.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]