GNU bug report logs - #79732
[WIP] Auto-refresh the view-lossage buffer

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: Elijah Gabe Pérez <eg642616@HIDDEN>; Done: Juri Linkov <juri@HIDDEN>; Maintainer for emacs is bug-gnu-emacs@HIDDEN.
bug marked as fixed in version 31.0.50, send any further explanations to 79732 <at> debbugs.gnu.org and Elijah Gabe Pérez <eg642616@HIDDEN> Request was from Juri Linkov <juri@HIDDEN> to control <at> debbugs.gnu.org. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 5 Nov 2025 07:19:45 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Nov 05 02:19:45 2025
Received: from localhost ([127.0.0.1]:55130 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vGXo0-00054r-SN
	for submit <at> debbugs.gnu.org; Wed, 05 Nov 2025 02:19:45 -0500
Received: from mout-p-201.mailbox.org ([80.241.56.171]:59540)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <juri@HIDDEN>)
 id 1vGXny-00054e-6M; Wed, 05 Nov 2025 02:19:43 -0500
Received: from smtp1.mailbox.org (smtp1.mailbox.org [10.196.197.1])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
 (No client certificate requested)
 by mout-p-201.mailbox.org (Postfix) with ESMTPS id 4d1cC81nqDz9tvG;
 Wed,  5 Nov 2025 08:19:32 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; 
 t=1762327172;
 h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
 to:to:cc:cc:mime-version:mime-version:content-type:content-type:
 in-reply-to:in-reply-to:references:references;
 bh=6PMjzx+dWRhQCFD7HkWAnB/jYqMUuxXEb6L/wpiVG0M=;
 b=B556CS2GVVM82vezhMEdhVnVlFN+FhE46wwLsFFgbVIj4DHnwPNKRSyxKnN3GZi7AqQQQ0
 ryTqAe7JRwFZ63Py8ZjXuP7s/xq255ly9hAcIS0Thmoy/EG61v/gwaPRa+NZ/3OkjMszYs
 rFAxYEcPbHYC3fWR9BNPIUGSS+pBi3HTzalpm0JmUK5JNeVHSLLG/BvMIIc6MJp9380Wo8
 TSC3jzHWNr2VFC8uZOLFrsGs2F65FV9CGC8+w0o++/rLH7m5xw+W4aDebYs5Adn1oKoo3L
 2Ogfdh1cl/XGeDYTUn1M6Mkzuph6coqxdlaE6EM2hdJ+yJigi3C+n4RZSskbew==
From: Juri Linkov <juri@HIDDEN>
To: Elijah Gabe =?iso-8859-1?Q?P=E9rez?= <eg642616@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <87y0ol5nbw.fsf@HIDDEN>
Organization: LINKOV.NET
References: <874irfkjku.fsf@HIDDEN> <86y0orlfg2.fsf@HIDDEN>
 <87ecqhbm5z.fsf@HIDDEN> <87frat7toc.fsf@HIDDEN>
 <87y0ol5nbw.fsf@HIDDEN>
Date: Wed, 05 Nov 2025 09:18:31 +0200
Message-ID: <87ikfp9cc8.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79732
Cc: Eli Zaretskii <eliz@HIDDEN>, 79732 <at> debbugs.gnu.org,
 Stefan Monnier <monnier@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

close 79732 31.0.50
thanks

>>   3*M-f      ;; forward-word
>>
>> Implementing this is a bigger task, so maybe better to push
>> your patch without optimization now.
>
> Fine, i've removed that part:

Thanks, now pushed and closed.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 5 Nov 2025 00:35:08 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Nov 04 19:35:08 2025
Received: from localhost ([127.0.0.1]:51704 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vGRUR-00078F-Dr
	for submit <at> debbugs.gnu.org; Tue, 04 Nov 2025 19:35:08 -0500
Received: from mail-ot1-x341.google.com ([2607:f8b0:4864:20::341]:54633)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <eg642616@HIDDEN>)
 id 1vGRUL-00077h-FH
 for 79732 <at> debbugs.gnu.org; Tue, 04 Nov 2025 19:35:04 -0500
Received: by mail-ot1-x341.google.com with SMTP id
 46e09a7af769-7c6cc366884so282464a34.1
 for <79732 <at> debbugs.gnu.org>; Tue, 04 Nov 2025 16:35:01 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1762302895; x=1762907695; darn=debbugs.gnu.org;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=2Cb6lrAQgnIo/pV0tPLGPUuZm56E1HITxgnQ/Iw+zRc=;
 b=IWnnjB/avlrr82gcljYuI3/RGoKe18s6Etxu0lxAbQ2jydgCPO41nFE8yyevZh2bCV
 Q0tjojLqJ1M3MUsyM1ruU70W/Np4WC1ag1COM6ocUgiZ9NnFVZJRhDVfi57ZbVyPTew1
 iJzARTgav0FAu4OUNPSxJt5zEYTu3KX0QRpNeglSCQhUDnhDSMTqg+iqsz5q7FtBHQ+Y
 4zHB7czUxgUdhS52A1Jbf+QrCHCifr5HfhISkdGTJh1cILbXMDoYQKUjKvpU1CcGnU0V
 y/S/Frfm4VlDDp3xo7EQaXB/biC2lBIbZJQb6M8DIo/cvduwNQEzLpO5BFrlIAjdiB1A
 3gWQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1762302895; x=1762907695;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=2Cb6lrAQgnIo/pV0tPLGPUuZm56E1HITxgnQ/Iw+zRc=;
 b=XYHDUPBM8nIPqo20o2C67CjZt+denalD9TVWoS2t64x7sdU0VjrDPV/fpRWdh8HIWt
 f6Ye3KaThFJn7BTe4VvABcVhoWfqcVDyA6fqWGQowQ9B78+Fa0Ly85R4xoVOV54dqzFl
 gOLH0AZ/ZmLMQT9EVCN75Jfx2bAn2Vo8CiItocSaNvn71Plg+8ilpUHVscev9L+Lwm4l
 eDHrmLt5Tj7jxiXrY6zxmcZ5dsCZEwSgnfWe5pDGY8X+k8lE+4w+jj4BHVkjbKX2Y+oF
 4m5v2kkpKqJSMansFAvNoR1Iu2Oi3StMM8K/Jeo5Sczw2mZOgoamtZ0SqDubQLWauBP4
 LOuw==
X-Forwarded-Encrypted: i=1;
 AJvYcCXCDDithC6dijVb+kolj9jvtXgAq0FyJailAAPwk/YaJMk5eWk1BMzquMpaBtwsErEMhpjexA==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yw2SjXDBALZYFCbPcwqLNaoJFO1O3BVp/sVNTffvXibhWYqqNVn
 hLZvdD9IqdgvVwFunnSo8/zmuyMxJ0qpmDavRuELvTHYSfSOCGwzfxBH
X-Gm-Gg: ASbGncu8O9mV76xWQMWGQOJ1ILJ1O+Z9dTj3DuG2lX9T7tj3+f/kfSl6bRWAM9UEP3t
 4hHyzHRRrWM5Nlj6tnrs5gLcTdm9jlONaDN5aJSzj/+m82VuQO0JWOg74aeOF7ewS5Skh/uAnEe
 Nhzb9UEqyfKLgJ95nR5cRhwtQMo6CTITsB+yDLR9Ld3mIuYjKMvCvAWfXAUe2ia6WbsIqIIqVI8
 JzBDQgXTbz1DrC/S/yRvZStCnnhmFA/Ckx2VZuDN2+5ioWF03zsR//u5T3W1F6WqlWOjB8e2QpQ
 tvBT2P4fuzkgsq7kPVV+EZpg1Sxsy2hWOtS7SQebqc1cFpMv6E4wQK+xbtn7aJqJLQDMb9sOBI8
 pnPKgX0Adi0ugLR5XNrkKFj2AM7n/31XTeR+HECU1nDc+o1OONoeLv28NvIte5YxTWP8=
X-Google-Smtp-Source: AGHT+IERTgA0mTXg4LJ5BnHcsgpmg78pc2r/DpLJ/3AKTXfhrpXBvlSXcgv9ttuH5iYErMlYvh2eww==
X-Received: by 2002:a05:6830:3155:b0:745:9a33:bad1 with SMTP id
 46e09a7af769-7c6d13cecbbmr821436a34.7.1762302895381; 
 Tue, 04 Nov 2025 16:34:55 -0800 (PST)
Received: from fedora ([200.63.43.223]) by smtp.gmail.com with ESMTPSA id
 46e09a7af769-7c6c25108b3sm1471846a34.30.2025.11.04.16.34.46
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Tue, 04 Nov 2025 16:34:54 -0800 (PST)
From: =?utf-8?Q?Elijah_Gabe_P=C3=A9rez?= <eg642616@HIDDEN>
To: Juri Linkov <juri@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <87frat7toc.fsf@HIDDEN>
References: <874irfkjku.fsf@HIDDEN> <86y0orlfg2.fsf@HIDDEN>
 <87ecqhbm5z.fsf@HIDDEN> <87frat7toc.fsf@HIDDEN>
Date: Tue, 04 Nov 2025 18:34:43 -0600
Message-ID: <87y0ol5nbw.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 0.3 (/)
X-Debbugs-Envelope-To: 79732
Cc: Eli Zaretskii <eliz@HIDDEN>, 79732 <at> debbugs.gnu.org,
 Stefan Monnier <monnier@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--=-=-=
Content-Type: text/plain

Juri Linkov <juri@HIDDEN> writes:

>> If the same command is repeated many times it will not appear in the
>> buffer, so it helps with performance, also this is disabled by default.
>
> This is dangerous optimization.  When the output from 'C-h l' will be
> copied to e.g. the macro buffer created by 'M-x edit-last-kbd-macro',
> then the macro will execute a wrong number of commands.
>
> The format used in 'edit-last-kbd-macro' avoids line duplication
> by using such syntax:
>
>   3*M-f      ;; forward-word
>
> and for self-inserting keys:
>
>   aabbcc     ;; self-insert-command * 6
>
> Implementing this is a bigger task, so maybe better to push
> your patch without optimization now.

Fine, i've removed that part:


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
 filename=0001-Add-option-to-auto-refresh-the-lossage-buffer.-Bug-7.patch

From 89fa2ba781af5f76d7e0688bdfd85b5b9f7d1d90 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?El=C3=ADas=20Gabriel=20P=C3=A9rez?= <eg642616@HIDDEN>
Date: Thu, 30 Oct 2025 13:04:46 -0600
Subject: [PATCH] Add option to auto-refresh the lossage buffer.  (Bug#79732)

* lisp/help.el (view-lossage-auto-refresh): New user option.
(help--lossage-update): New variable.
(help--lossage-make-recent-keys, help--refresh-lossage-buffer):
New functions.
(view-lossage): Rework.
* doc/emacs/help.texi (Misc Help):
* etc/NEWS: Document change.
---
 doc/emacs/help.texi |  10 +++-
 etc/NEWS            |   6 +++
 lisp/help.el        | 120 ++++++++++++++++++++++++++++++++++----------
 3 files changed, 108 insertions(+), 28 deletions(-)

diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi
index 6ea7b5783c2..879967ddfb2 100644
--- a/doc/emacs/help.texi
+++ b/doc/emacs/help.texi
@@ -716,8 +716,14 @@ Misc Help
 input keystrokes and the commands they invoked.  By default, Emacs
 stores the last 300 keystrokes; if you wish, you can change this number with
 the command @code{lossage-size}.
-If you see commands that you are not familiar with, you can use @kbd{C-h k} or
-@kbd{C-h f} to find out what they do.
+If you see commands that you are not familiar with, use
+@kbd{C-h k}, or press @kbd{RET} or click on them to find out what they do.
+
+@vindex view-lossage-auto-refresh
+By default, after the lossage buffer is displayed it will not show the
+most recent keystroke and command that you are currently typing, to
+change this set the variable @code{view-lossage-auto-refresh} to
+@code{t}.
 
 @kindex C-h e
 @findex view-echo-area-messages
diff --git a/etc/NEWS b/etc/NEWS
index f61825f531b..3f99bdbb440 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -671,6 +671,12 @@ or strings.  If set to 'on-mismatch', mismatched parens inside comments
 and strings will not be highlighted.  If set to nil (the default),
 highlight the parens wherever they are.
 
++++
+** New user option 'view-lossage-auto-refresh'.
+If this option is non-nil, the lossage buffer in 'view-lossage' will be
+refreshed automatically for each new input keystroke and command
+performed.
+
 ** Change in SVG foreground color handling.
 SVG images no longer have the 'fill' attribute set to the value of
 ':foreground' or the current text foreground color.  The 'currentcolor'
diff --git a/lisp/help.el b/lisp/help.el
index 4ba99868c4a..8cf91faf174 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -517,6 +517,67 @@ function-called-at-point
                 (setq sym (intern-soft (match-string 1 str)))
                 (and (fboundp sym) sym))))))))
 
+
+;;; Lossage
+
+(defcustom view-lossage-auto-refresh nil
+  "Whether to auto-refresh the lossage buffer.
+If non-nil, the lossage buffer will be refreshed automatically for each
+new input keystroke and command performed."
+  :type 'boolean
+  :group 'help
+  :version "31.1")
+
+(defvar-local help--lossage-update nil
+  "Variable used to determine if lossage buffer should be refreshed.")
+
+(defun help--lossage-make-recent-keys (&optional most-recent)
+  "Return a string containing all the recent keys and its commands.
+If MOST-RECENT is non-nil, only return the most recent key and its
+command."
+  (let ((keys
+         (if most-recent
+             `[,@(this-single-command-raw-keys) (nil . ,this-command)]
+           (recent-keys 'include-cmds))))
+    (mapconcat
+     (lambda (key)
+       (cond
+        ((and (consp key) (null (car key)))
+         (concat
+          ";; "
+          (if (symbolp (cdr key))
+              (buttonize
+               (symbol-name (cdr key))
+               (lambda (&rest _)
+                 (interactive)
+                 (describe-function (cdr key)))
+               "mouse-1: go to the documentation for this command.")
+	    (propertize "anonymous-command" 'face 'shadow))
+          "\n"))
+        ((or (integerp key) (symbolp key) (listp key))
+         (propertize (single-key-description key)
+                     'face 'help-key-binding
+                     'rear-nonsticky t))
+        (t
+         (propertize (prin1-to-string key nil)
+                     'face 'help-key-binding
+                     'rear-nonsticky t))))
+     keys
+     " ")))
+
+(defun help--refresh-lossage-buffer ()
+  (if-let* ((buf (get-buffer "*Help*"))
+            (_ (buffer-local-value 'help--lossage-update buf)))
+      (with-current-buffer buf
+        (let ((inhibit-read-only t))
+          (save-excursion
+            (goto-char (point-max))
+            (insert-before-markers
+             (concat " " (help--lossage-make-recent-keys :most-recent)))
+            (forward-line -1)
+            (comment-indent))))
+    (remove-hook 'post-command-hook #'help--refresh-lossage-buffer)))
+
 
 ;;; `User' help functions
 
@@ -692,43 +753,50 @@ view-external-packages
   (interactive)
   (info "(efaq)Packages that do not come with Emacs"))
 
-(defun view-lossage ()
+(defun view-lossage (&optional auto-refresh)
   "Display last few input keystrokes and the commands run.
 For convenience this uses the same format as
 `edit-last-kbd-macro'.
 See `lossage-size' to update the number of recorded keystrokes.
 
+With argument, auto-refresh the lossage buffer for each new input
+keystroke, see also `view-lossage-auto-refresh'.
+
 To record all your input, use `open-dribble-file'."
-  (interactive)
-  (let ((help-buffer-under-preparation t))
-    (help-setup-xref (list #'view-lossage)
-		     (called-interactively-p 'interactive))
+  (interactive "P")
+  (let ((help-buffer-under-preparation t)
+        (view-lossage-auto-refresh
+         (if auto-refresh t view-lossage-auto-refresh)))
+    (unless view-lossage-auto-refresh
+      ;; `view-lossage-auto-refresh' conflicts with xref buttons, add
+      ;; them if `view-lossage-auto-refresh' is nil.
+      (help-setup-xref (list #'view-lossage)
+		       (called-interactively-p 'interactive)))
     (with-help-window (help-buffer)
       (princ " ")
-      (princ (mapconcat (lambda (key)
-			  (cond
-			   ((and (consp key) (null (car key)))
-			    (format ";; %s\n" (if (symbolp (cdr key)) (cdr key)
-						"anonymous-command")))
-			   ((or (integerp key) (symbolp key) (listp key))
-			    (single-key-description key))
-			   (t
-			    (prin1-to-string key nil))))
-			(recent-keys 'include-cmds)
-			" "))
+      (insert (help--lossage-make-recent-keys))
       (with-current-buffer standard-output
 	(goto-char (point-min))
-	(let ((comment-start ";; ")
-              ;; Prevent 'comment-indent' from handling a single
-              ;; semicolon as the beginning of a comment.
-              (comment-start-skip ";; ")
-              (comment-use-syntax nil)
-              (comment-column 24))
-          (while (not (eobp))
-            (comment-indent)
-	    (forward-line 1)))
+        (setq-local comment-start ";; "
+                    ;; Prevent 'comment-indent' from handling a single
+                    ;; semicolon as the beginning of a comment.
+                    comment-start-skip ";; "
+                    comment-use-syntax nil
+                    comment-column 24)
+	(while (not (eobp))
+          (comment-indent)
+	  (forward-line 1))
 	;; Show point near the end of "lossage", as we did in Emacs 24.
-	(set-marker help-window-point-marker (point))))))
+	(set-marker help-window-point-marker (point))
+
+        (when view-lossage-auto-refresh
+          (setq-local help--lossage-update t)
+          (add-hook 'post-command-hook #'help--refresh-lossage-buffer))))
+
+    ;; `help-make-xrefs' adds a newline at the end of the buffer, which
+    ;; makes impossible to reposition point in `with-help-window'.
+    (when view-lossage-auto-refresh
+      (set-window-point (get-buffer-window (help-buffer)) (point-max)))))
 
 
 ;; Key bindings
-- 
2.51.0


--=-=-=
Content-Type: text/plain



-- 
- E.G via Gnus and Org.

--=-=-=--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 4 Nov 2025 17:01:03 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Nov 04 12:01:03 2025
Received: from localhost ([127.0.0.1]:48559 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vGKOz-0000GG-Kx
	for submit <at> debbugs.gnu.org; Tue, 04 Nov 2025 12:01:03 -0500
Received: from mout-p-103.mailbox.org ([2001:67c:2050:0:465::103]:39146)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <juri@HIDDEN>) id 1vGKOt-0000FN-09
 for 79732 <at> debbugs.gnu.org; Tue, 04 Nov 2025 12:00:59 -0500
Received: from smtp202.mailbox.org (smtp202.mailbox.org [10.196.197.202])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
 (No client certificate requested)
 by mout-p-103.mailbox.org (Postfix) with ESMTPS id 4d1F8F2B9tz9tqB;
 Tue,  4 Nov 2025 18:00:45 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; 
 t=1762275645;
 h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
 to:to:cc:cc:mime-version:mime-version:content-type:content-type:
 in-reply-to:in-reply-to:references:references;
 bh=a3C25s+fBuZ/VKbJroPm1dSldSkqAosjXBqV0XzZVPs=;
 b=e78MN5RJen2btgr+f9uOq2B/4/GZ9zlIe/tkcfMT5/er+FUkkL+PSdk+QTQSy4cUqVUdA2
 nuhNRT8a551lSGqApSq7tjwqngoFxnf176yrr+hxlu8p7xVDowQ06sui4N2kaJNq2IKtlp
 IzxXRTzc545HxC9n5d538VrKcNEkzJ11MuG/lcFfAD74bAE9RB0iKITOvs4EBGxkHEtaMd
 mtn8QMgXtxQet1kqKbJKceAk8cf8sLrXSmSuDM3YnvGiEA8pxR5KxSrKz/njBVlYMv8MZs
 WfhV3tuXRlVNeWvaCjOgobAiqIAGaK/wpZMNBURvO3rMixnQmK/WQE0OE4g/yg==
From: Juri Linkov <juri@HIDDEN>
To: Elijah Gabe =?iso-8859-1?Q?P=E9rez?= <eg642616@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <87ecqhbm5z.fsf@HIDDEN>
Organization: LINKOV.NET
References: <874irfkjku.fsf@HIDDEN> <86y0orlfg2.fsf@HIDDEN>
 <87ecqhbm5z.fsf@HIDDEN>
Date: Tue, 04 Nov 2025 18:44:43 +0200
Message-ID: <87frat7toc.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79732
Cc: Eli Zaretskii <eliz@HIDDEN>, 79732 <at> debbugs.gnu.org,
 Stefan Monnier <monnier@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

> If the same command is repeated many times it will not appear in the
> buffer, so it helps with performance, also this is disabled by default.

This is dangerous optimization.  When the output from 'C-h l' will be
copied to e.g. the macro buffer created by 'M-x edit-last-kbd-macro',
then the macro will execute a wrong number of commands.

The format used in 'edit-last-kbd-macro' avoids line duplication
by using such syntax:

  3*M-f      ;; forward-word

and for self-inserting keys:

  aabbcc     ;; self-insert-command * 6

Implementing this is a bigger task, so maybe better to push
your patch without optimization now.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 3 Nov 2025 19:31:08 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Nov 03 14:31:08 2025
Received: from localhost ([127.0.0.1]:42923 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vG0Gg-00085l-S9
	for submit <at> debbugs.gnu.org; Mon, 03 Nov 2025 14:31:08 -0500
Received: from mail-yx1-xb141.google.com ([2607:f8b0:4864:20::b141]:48364)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <eg642616@HIDDEN>)
 id 1vG0Gc-00085D-6j
 for 79732 <at> debbugs.gnu.org; Mon, 03 Nov 2025 14:31:03 -0500
Received: by mail-yx1-xb141.google.com with SMTP id
 956f58d0204a3-63f533fbff7so4436091d50.0
 for <79732 <at> debbugs.gnu.org>; Mon, 03 Nov 2025 11:31:02 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1762198253; x=1762803053; darn=debbugs.gnu.org;
 h=mime-version:user-agent:message-id:date:references:in-reply-to
 :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to;
 bh=qGHycYOVMuyyjfRisyFwlaN+jA1E5YqwuHwP9xePgf8=;
 b=F0j2/FkXfqR5dQhGzpH7TfGnzO5MFn5NwDpcFlZddH13ffx3Nuy0I2xdseYf49Dx7V
 uMKT+/nMKc8Ou6MZKl6yYw0qmwZsc1OY1AZvBoiw9xKeo266XYuZGURHLGgEOXdJ6oYK
 lC+a75VAGKAwRIS3fe/3kNCaixUF7ghMHPQuExO4p/fZJTvSkF1w4iQYcGxzjUNbcegJ
 UQC6BbprBTjS34itETOjCFAoSO9xE3vfa0DJkuvlN6OuDX461E7z372NKHRLNJCVuqAn
 zQQT4JdzIV6SbG4pHnnBlc0wQse6rz6dbvtHOw1Lz5brYRZO8hoGsoTquzVWIqg5s6Cw
 6HDw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1762198253; x=1762803053;
 h=mime-version:user-agent:message-id:date:references:in-reply-to
 :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=qGHycYOVMuyyjfRisyFwlaN+jA1E5YqwuHwP9xePgf8=;
 b=k1TF9yuByk/4PgmnICuqE8vH/DGKv/Mco9CBeFXY3ghhGT80IdYmuRXJh9K17Xkj0J
 ZHFb+RtZGgDWiHJdSBJdStEH2TyBhQz8wTKqotnJyGkJ3JTIwwWLCR3sPvAosQbCEQgo
 xwX+W7uUuyCho0P5M6NM42El/XJJyIe5OYzF88ynVy+5iuLKnYf3Pn+DD8W50Ujo0XeD
 hixMR8jFN4WFgHnUu04dY3iPeRqhOuM1p3LzX9UYyJ/ZCev82ilrFP+VyoFvxfoUlcsq
 2Np58EAZC0asyu66YbubGFS1JjCD5VGzAWvOeq+M0wovMdskqP53An3/4Dqv83xqD/CG
 d95Q==
X-Gm-Message-State: AOJu0YyKp3o1XIWqFek1xPjU9ZrGXhEg0Qh8CDaMk40GfhUNgmCB4I36
 dE2IjWOzeqLxzOqJXk/UDjKl5YXf6gu+iR0iApX1pj4vlHKBB1l2ocRZ
X-Gm-Gg: ASbGncs6K689TEi4sLLUdfj4APsVUojlYGiVUDtl6b3qjpE7iktSPb3/Os2famwklo8
 rhH/Zh2y7Wzwbsak1NqF8XmPl5t6bYCcpwE4G+PVCiMPauAbh1hKoxjK3+PmGpXmrBHyFZXktuH
 IDuvYTkGmdtY0QVydBxqhU6GmuybFzfddySEpToOwHfEiNoTeEZGcoht4InuosUDhpQHqUf2xwr
 Pbgh/isObGysdp42Zl5loScNFxHT4QjXqswh+Edjp0UjPwbVOTdpo/rB828R9HCKiCWddpNVs2l
 AkYirXDJEYtXaHXov6WOvPRh0khM9nFWCURzqJSuS3EQUG+biqvXaVLLRf9Z8TgmEADeId1NBD1
 r+UIqlIEwmNfhn+OZd8mP1mLvlLkLRfC+ceexi7bmT8adrUSiCKp8Di5lF7xxoHLxQc5izw==
X-Google-Smtp-Source: AGHT+IF0hkPyXn+tpPZ4GcOhRp5uLeyo4pIUbx/a0GEZw5ky6PFrKfJBgy+qgwVm6ioLnXeEWgEgSQ==
X-Received: by 2002:a05:690e:d5a:b0:63f:c10e:6422 with SMTP id
 956f58d0204a3-63fc10e6a4bmr2129843d50.8.1762198253380; 
 Mon, 03 Nov 2025 11:30:53 -0800 (PST)
Received: from fedora ([189.215.160.111]) by smtp.gmail.com with ESMTPSA id
 00721157ae682-786920027c6sm3333367b3.41.2025.11.03.11.30.50
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Mon, 03 Nov 2025 11:30:52 -0800 (PST)
From: =?utf-8?Q?Elijah_Gabe_P=C3=A9rez?= <eg642616@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <86ms53gv3q.fsf@HIDDEN>
References: <874irfkjku.fsf@HIDDEN> <87ikfvcyz2.fsf@HIDDEN>
 <87ikftbmn2.fsf@HIDDEN> <87bjlkzzht.fsf@HIDDEN>
 <87wm47ly9j.fsf@HIDDEN> <86ms53gv3q.fsf@HIDDEN>
Date: Mon, 03 Nov 2025 13:30:46 -0600
Message-ID: <871pmeoqvt.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/31.0.50
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 0.3 (/)
X-Debbugs-Envelope-To: 79732
Cc: 79732 <at> debbugs.gnu.org, juri@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Eli Zaretskii <eliz@HIDDEN> writes:

>> Cc: 79732 <at> debbugs.gnu.org
>> From: Elijah Gabe P=C3=A9rez <eg642616@HIDDEN>
>> Date: Sun, 02 Nov 2025 19:07:20 -0600
>>=20
>> +(defcustom view-lossage-auto-refresh nil
>> +  "Whether to auto-refresh the lossage buffer.
>> +If non-nil, the lossage buffer will refreshed automatically for each new
>                                   ^^^^^^^^^^^^^^
> "will be refreshed"

Thanks, fixed:


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
 filename=0001-Add-option-to-auto-refresh-the-lossage-buffer.-Bug-7.patch

From 4460e2ad73361014c5ecac51b673e26e60253e27 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?El=C3=ADas=20Gabriel=20P=C3=A9rez?= <eg642616@HIDDEN>
Date: Thu, 30 Oct 2025 13:04:46 -0600
Subject: [PATCH] Add option to auto-refresh the lossage buffer.  (Bug#79732)

* lisp/help.el (view-lossage-auto-refresh): New user option.
(help--lossage-update, help--lossage-last-key-seq): New variables.
(help--lossage-make-recent-keys, help--refresh-lossage-buffer):
New functions.
(view-lossage): Rework.
* doc/emacs/help.texi (Misc Help):
* etc/NEWS: Document change.
---
 doc/emacs/help.texi |  10 +++-
 etc/NEWS            |   6 +++
 lisp/help.el        | 127 +++++++++++++++++++++++++++++++++++---------
 3 files changed, 115 insertions(+), 28 deletions(-)

diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi
index 6ea7b5783c2..879967ddfb2 100644
--- a/doc/emacs/help.texi
+++ b/doc/emacs/help.texi
@@ -716,8 +716,14 @@ Misc Help
 input keystrokes and the commands they invoked.  By default, Emacs
 stores the last 300 keystrokes; if you wish, you can change this number with
 the command @code{lossage-size}.
-If you see commands that you are not familiar with, you can use @kbd{C-h k} or
-@kbd{C-h f} to find out what they do.
+If you see commands that you are not familiar with, use
+@kbd{C-h k}, or press @kbd{RET} or click on them to find out what they do.
+
+@vindex view-lossage-auto-refresh
+By default, after the lossage buffer is displayed it will not show the
+most recent keystroke and command that you are currently typing, to
+change this set the variable @code{view-lossage-auto-refresh} to
+@code{t}.
 
 @kindex C-h e
 @findex view-echo-area-messages
diff --git a/etc/NEWS b/etc/NEWS
index f61825f531b..3f99bdbb440 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -671,6 +671,12 @@ or strings.  If set to 'on-mismatch', mismatched parens inside comments
 and strings will not be highlighted.  If set to nil (the default),
 highlight the parens wherever they are.
 
++++
+** New user option 'view-lossage-auto-refresh'.
+If this option is non-nil, the lossage buffer in 'view-lossage' will be
+refreshed automatically for each new input keystroke and command
+performed.
+
 ** Change in SVG foreground color handling.
 SVG images no longer have the 'fill' attribute set to the value of
 ':foreground' or the current text foreground color.  The 'currentcolor'
diff --git a/lisp/help.el b/lisp/help.el
index 4ba99868c4a..6a716c20ec3 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -517,6 +517,74 @@ function-called-at-point
                 (setq sym (intern-soft (match-string 1 str)))
                 (and (fboundp sym) sym))))))))
 
+
+;;; Lossage
+
+(defcustom view-lossage-auto-refresh nil
+  "Whether to auto-refresh the lossage buffer.
+If non-nil, the lossage buffer will be refreshed automatically for each
+new input keystroke and command performed."
+  :type 'boolean
+  :group 'help
+  :version "31.1")
+
+(defvar-local help--lossage-update nil
+  "Variable used to determine if lossage buffer should be refreshed.")
+
+(defvar-local help--lossage-last-key-seq nil
+  "Last key sequence.")
+
+(defun help--lossage-make-recent-keys (&optional most-recent)
+  "Return a string containing all the recent keys and its commands.
+If MOST-RECENT is non-nil, only return the most recent key and its
+command."
+  (let ((keys
+         (if most-recent
+             `[,@(this-single-command-raw-keys) (nil . ,this-command)]
+           (recent-keys 'include-cmds))))
+    (mapconcat
+     (lambda (key)
+       (cond
+        ((and (consp key) (null (car key)))
+         (concat
+          ";; "
+          (if (symbolp (cdr key))
+              (buttonize
+               (symbol-name (cdr key))
+               (lambda (&rest _)
+                 (interactive)
+                 (describe-function (cdr key)))
+               "mouse-1: go to the documentation for this command.")
+	    (propertize "anonymous-command" 'face 'shadow))
+          "\n"))
+        ((or (integerp key) (symbolp key) (listp key))
+         (propertize (single-key-description key)
+                     'face 'help-key-binding
+                     'rear-nonsticky t))
+        (t
+         (propertize (prin1-to-string key nil)
+                     'face 'help-key-binding
+                     'rear-nonsticky t))))
+     keys
+     " ")))
+
+(defun help--refresh-lossage-buffer ()
+  (if-let* ((buf (get-buffer "*Help*"))
+            (_ (buffer-local-value 'help--lossage-update buf)))
+      (with-current-buffer buf
+        (unless (and (eq last-command this-command)
+                     (equal help--lossage-last-key-seq
+                            (this-single-command-raw-keys)))
+          (let ((inhibit-read-only t))
+            (setq help--lossage-last-key-seq (this-single-command-raw-keys))
+            (save-excursion
+              (goto-char (point-max))
+              (insert-before-markers
+               (concat " " (help--lossage-make-recent-keys :most-recent)))
+              (forward-line -1)
+              (comment-indent)))))
+    (remove-hook 'post-command-hook #'help--refresh-lossage-buffer)))
+
 
 ;;; `User' help functions
 
@@ -692,43 +760,50 @@ view-external-packages
   (interactive)
   (info "(efaq)Packages that do not come with Emacs"))
 
-(defun view-lossage ()
+(defun view-lossage (&optional auto-refresh)
   "Display last few input keystrokes and the commands run.
 For convenience this uses the same format as
 `edit-last-kbd-macro'.
 See `lossage-size' to update the number of recorded keystrokes.
 
+With argument, auto-refresh the lossage buffer for each new input
+keystroke, see also `view-lossage-auto-refresh'.
+
 To record all your input, use `open-dribble-file'."
-  (interactive)
-  (let ((help-buffer-under-preparation t))
-    (help-setup-xref (list #'view-lossage)
-		     (called-interactively-p 'interactive))
+  (interactive "P")
+  (let ((help-buffer-under-preparation t)
+        (view-lossage-auto-refresh
+         (if auto-refresh t view-lossage-auto-refresh)))
+    (unless view-lossage-auto-refresh
+      ;; `view-lossage-auto-refresh' conflicts with xref buttons, add
+      ;; them if `view-lossage-auto-refresh' is nil.
+      (help-setup-xref (list #'view-lossage)
+		       (called-interactively-p 'interactive)))
     (with-help-window (help-buffer)
       (princ " ")
-      (princ (mapconcat (lambda (key)
-			  (cond
-			   ((and (consp key) (null (car key)))
-			    (format ";; %s\n" (if (symbolp (cdr key)) (cdr key)
-						"anonymous-command")))
-			   ((or (integerp key) (symbolp key) (listp key))
-			    (single-key-description key))
-			   (t
-			    (prin1-to-string key nil))))
-			(recent-keys 'include-cmds)
-			" "))
+      (insert (help--lossage-make-recent-keys))
       (with-current-buffer standard-output
 	(goto-char (point-min))
-	(let ((comment-start ";; ")
-              ;; Prevent 'comment-indent' from handling a single
-              ;; semicolon as the beginning of a comment.
-              (comment-start-skip ";; ")
-              (comment-use-syntax nil)
-              (comment-column 24))
-          (while (not (eobp))
-            (comment-indent)
-	    (forward-line 1)))
+        (setq-local comment-start ";; "
+                    ;; Prevent 'comment-indent' from handling a single
+                    ;; semicolon as the beginning of a comment.
+                    comment-start-skip ";; "
+                    comment-use-syntax nil
+                    comment-column 24)
+	(while (not (eobp))
+          (comment-indent)
+	  (forward-line 1))
 	;; Show point near the end of "lossage", as we did in Emacs 24.
-	(set-marker help-window-point-marker (point))))))
+	(set-marker help-window-point-marker (point))
+
+        (when view-lossage-auto-refresh
+          (setq-local help--lossage-update t)
+          (add-hook 'post-command-hook #'help--refresh-lossage-buffer))))
+
+    ;; `help-make-xrefs' adds a newline at the end of the buffer, which
+    ;; makes impossible to reposition point in `with-help-window'.
+    (when view-lossage-auto-refresh
+      (set-window-point (get-buffer-window (help-buffer)) (point-max)))))
 
 
 ;; Key bindings
-- 
2.51.0


--=-=-=
Content-Type: text/plain



-- 
- E.G via Gnus and Org.

--=-=-=--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 3 Nov 2025 12:27:13 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Nov 03 07:27:13 2025
Received: from localhost ([127.0.0.1]:40246 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vFteT-0005gy-DL
	for submit <at> debbugs.gnu.org; Mon, 03 Nov 2025 07:27:13 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:41410)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1vFteK-0005g8-D9
 for 79732 <at> debbugs.gnu.org; Mon, 03 Nov 2025 07:27:08 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1vFteB-0006do-Rt; Mon, 03 Nov 2025 07:26:56 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=cFF/m4caAGCVGwMpkZVJUaHZzrXohFPmAKkdOtcgKts=; b=Le9V60iPN8JK5Bt8bKrF
 hieF5zmbpl8JgDExmipOMKZ80oddpKpKOhVmTFf9lXdC5OjYdDV/+Fmk4RjchGz0cgIkxVrVcsPVD
 o0cZLOZosOPqdfDGpOcBKCyI6P6/M3O0ow4Tsz0G0swXNeTwtnBNGFQfSPnoUwuiCpCnGCeP04snb
 JbsLo1ZS7gWN8+BTKQqu2BV3rWcVOmFIsiz/KhpV3v/t3bl47Fw0GLzwapfhGoys4MMhrwEq5TyAY
 lj4xq07V+ou+6cKUMjIqM/RudVY77G2nREH6yN8cHtNIxi7O8gwKtxgfxCWlTE71KIdWSCQTEK2wy
 e6R5hBnAJz0Y2A==;
Date: Mon, 03 Nov 2025 14:26:49 +0200
Message-Id: <86ms53gv3q.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Elijah Gabe =?utf-8?Q?P=C3=A9rez?= <eg642616@HIDDEN>
In-Reply-To: <87wm47ly9j.fsf@HIDDEN> (message from Elijah Gabe
 =?utf-8?Q?P=C3=A9rez?= on Sun, 02 Nov 2025 19:07:20 -0600)
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
References: <874irfkjku.fsf@HIDDEN> <87ikfvcyz2.fsf@HIDDEN>
 <87ikftbmn2.fsf@HIDDEN> <87bjlkzzht.fsf@HIDDEN>
 <87wm47ly9j.fsf@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 79732
Cc: 79732 <at> debbugs.gnu.org, juri@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Cc: 79732 <at> debbugs.gnu.org
> From: Elijah Gabe Pérez <eg642616@HIDDEN>
> Date: Sun, 02 Nov 2025 19:07:20 -0600
> 
> +(defcustom view-lossage-auto-refresh nil
> +  "Whether to auto-refresh the lossage buffer.
> +If non-nil, the lossage buffer will refreshed automatically for each new
                                  ^^^^^^^^^^^^^^
"will be refreshed"





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 3 Nov 2025 01:07:33 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Nov 02 20:07:33 2025
Received: from localhost ([127.0.0.1]:35252 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vFj2i-0002yQ-Nw
	for submit <at> debbugs.gnu.org; Sun, 02 Nov 2025 20:07:33 -0500
Received: from mail-yx1-xb141.google.com ([2607:f8b0:4864:20::b141]:59787)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <eg642616@HIDDEN>)
 id 1vFj2f-0002yI-Nu
 for 79732 <at> debbugs.gnu.org; Sun, 02 Nov 2025 20:07:30 -0500
Received: by mail-yx1-xb141.google.com with SMTP id
 956f58d0204a3-63f94733d6cso2016609d50.3
 for <79732 <at> debbugs.gnu.org>; Sun, 02 Nov 2025 17:07:29 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1762132043; x=1762736843; darn=debbugs.gnu.org;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=gkEMQx7L6Zqd5ZPwWLYUsH3N4A6gGk7/3KQYO1fmBMg=;
 b=G9qteZGhbYXSY9+KX6ZOS9bW+3WeXylpS9m7mw5N+w4EvnBtMxW/YJ2eWErm6cqmRX
 VkJDGDh12mnqIvUfhaHOGnCyWaHWFQ+x+i/NqiusEXFk1qwXCOEVZXSqyQ+U0b8NhmZe
 qLqJSJy8guIsU+sWf9NXfwx8LJaz1Q/1VVykb07vINEDcH3mu+uUZdNk5YfkkWEYlpPy
 645EznDuNgQFVIQkDdsSLSgKv8cLYIE3Yj3yaTY3/LQDlevlSjprhAVQJ2kE2eMxQJ7J
 KWFovLeHyAgtCInUBh+tRopoysi/NeVdJTnhe4lCg9BU3jAfpxSHfzs5bqMFsvvq1jNB
 azyw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1762132043; x=1762736843;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=gkEMQx7L6Zqd5ZPwWLYUsH3N4A6gGk7/3KQYO1fmBMg=;
 b=Qkf880vAjOsbk6BB2d1TJ+NGo4iSfZGh0pax+QVmQk0ugxIxjSV3BWmO31Ci71/nMo
 EHyASHoojkf/E4B91O1tFQd9BHoOcmY3baA0ryqjXRzSn7//sSgM/tXKoK7Rjh6B47Pw
 lf0z2SBm4JLRgfc6gfybKRwC4aLKuJtTTWSlC/QpHI8SGmD28QxAirACrVB1aOGtQvqZ
 6nJzLZWz8L6DRAw/59smVj1vdFmgBqb8J+lV8ysuWif8BJWfgED+Ru6P3PyUvBXYYohu
 DIiRRsYX0XVby0dq2vXVYsOzQHiU7r1c5+UwmVrq970rVaeMuXB2ATEH5m2kn5R3Us4g
 hbZg==
X-Gm-Message-State: AOJu0YytxSSKsX4XHUSsiqij0Hn6bn/vSV+vg4p+q4XSxSdlU0+eZDRV
 OKml31v5K4sJC/12wTncd3TaKLIq/KRuzqceve6xrwQLWzYUt9XgY+1BESPDI2J3
X-Gm-Gg: ASbGncuEkhws76FVzTw46b8EbTP7PfoP7SNlEgJXP36pYSlpTeqrUdFmDQU+pKnD0yk
 rNeVoBEfc1zOLTe7dahfv5NGpUVd5I/r4mqA9NKAy0lYzjctqxEGT+VP1JnHMpPz7hcO6Y7AHgv
 P5wKEzq7GeUQLyC5MJMBEq+QuayE6xAOtQk2VaaGrBmGxTTIFzZVKe0ljSJhOyuQpXUvWNbp/PD
 OgjpJUDbMrmxVFoQk6zVl/hsOLGVCjucS/kYhZyVci1GLRtqdtPDKRwAYYWxJAZCBcdaZBu329P
 DPRPZbl5I8XvFlJm/aekx+77rnXIaPNl5/aZTXkxaK5VfUMYqtQTtd9/0F16PT+UnbgFxWFzpAr
 zsgZN3CcGKQ/1pRppMdYX6UWNjl3SfJKdvKA1PjmOpONBvngzR5AIfbVfwLycaFI4uk8H8A==
X-Google-Smtp-Source: AGHT+IGm/1LL/+ZlS4cJ0WBS4Kg7UHuy7S7KQesIRAI74TypVM7QHNNDPjsyBEjpRF4VqcTG2UPHBg==
X-Received: by 2002:a05:690c:6f87:b0:783:6f8d:e7a6 with SMTP id
 00721157ae682-78648550a35mr181877507b3.51.1762132043022; 
 Sun, 02 Nov 2025 17:07:23 -0800 (PST)
Received: from fedora ([189.215.160.111]) by smtp.gmail.com with ESMTPSA id
 956f58d0204a3-63f9675b55bsm2541357d50.4.2025.11.02.17.07.21
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Sun, 02 Nov 2025 17:07:22 -0800 (PST)
From: =?utf-8?Q?Elijah_Gabe_P=C3=A9rez?= <eg642616@HIDDEN>
To: Juri Linkov <juri@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <87bjlkzzht.fsf@HIDDEN>
References: <874irfkjku.fsf@HIDDEN> <87ikfvcyz2.fsf@HIDDEN>
 <87ikftbmn2.fsf@HIDDEN> <87bjlkzzht.fsf@HIDDEN>
Date: Sun, 02 Nov 2025 19:07:20 -0600
Message-ID: <87wm47ly9j.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 3.8 (+++)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 Content preview:  Juri Linkov writes: >> - (let ((comment-start ";; ") >> -
 ;; Prevent 'comment-indent' from handling a single >> - ;; semicolon as the
 beginning of a comment. >> - (comment-start-skip "; ;
 ") >> - (comment-use-syntax nil) [...] 
 Content analysis details:   (3.8 points, 10.0 required)
 pts rule name              description
 ---- ---------------------- --------------------------------------------------
 3.6 RCVD_IN_SBL_CSS        RBL: Received via a relay in Spamhaus SBL-CSS
 [189.215.160.111 listed in zen.spamhaus.org]
 -0.0 SPF_PASS               SPF: sender matches SPF record
 0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
 provider (eg642616[at]gmail.com)
 0.2 FREEMAIL_ENVFROM_END_DIGIT Envelope-from freemail username ends
 in digit (eg642616[at]gmail.com)
 0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
 no trust [2607:f8b0:4864:20:0:0:0:b141 listed in]
 [list.dnswl.org]
X-Debbugs-Envelope-To: 79732
Cc: 79732 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 2.8 (++)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 
 Content preview:  Juri Linkov writes: >> - (let ((comment-start ";; ") >> -
   ;; Prevent 'comment-indent' from handling a single >> - ;; semicolon as the
    beginning of a comment. >> - (comment-start-skip ";; ") >> - (comment-use-syntax
    nil) [...] 
 
 Content analysis details:   (2.8 points, 10.0 required)
 
  pts rule name              description
 ---- ---------------------- --------------------------------------------------
  3.6 RCVD_IN_SBL_CSS        RBL: Received via a relay in Spamhaus SBL-CSS
                             [189.215.160.111 listed in zen.spamhaus.org]
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
                              no trust
                             [2607:f8b0:4864:20:0:0:0:b141 listed in]
                             [list.dnswl.org]
 -0.0 SPF_PASS               SPF: sender matches SPF record
  0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
                             provider (eg642616[at]gmail.com)
  0.2 FREEMAIL_ENVFROM_END_DIGIT Envelope-from freemail username ends
                             in digit (eg642616[at]gmail.com)
  0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
 -1.0 MAILING_LIST_MULTI     Multiple indicators imply a widely-seen list
                             manager

--=-=-=
Content-Type: text/plain

Juri Linkov <juri@HIDDEN> writes:

>> -	(let ((comment-start ";; ")
>> -              ;; Prevent 'comment-indent' from handling a single
>> -              ;; semicolon as the beginning of a comment.
>> -              (comment-start-skip ";; ")
>> -              (comment-use-syntax nil)
>> -              (comment-column 24))
>> +        (setq-local comment-start ";; "
>> +                    ;; Prevent 'comment-indent' from handling a single
>> +                    ;; semicolon as the beginning of a comment.
>> +                    comment-start-skip ";; "
>> +                    comment-use-syntax nil
>> +                    comment-column 24)
>
> Hmm, then probably still better to duplicate let-bindings than
> to set buffer-local values, because the Help buffer is shared
> between many help commands.  OTOH, when other help commands
> don't use 'comment-indent', maybe this is not a problem.

I've no seen any other command that uses `comment-indent` than
`view-lossage`, so i don't think there would be any problem.

I've improved the patch:

--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
 filename=0001-Add-option-to-auto-refresh-the-lossage-buffer.-Bug-7.patch

From 6fccbba09eab04cf401a275e16a5ad9c7c97a7aa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?El=C3=ADas=20Gabriel=20P=C3=A9rez?= <eg642616@HIDDEN>
Date: Thu, 30 Oct 2025 13:04:46 -0600
Subject: [PATCH] Add option to auto-refresh the lossage buffer.  (Bug#79732)

* lisp/help.el (view-lossage-auto-refresh): New user option.
(help--lossage-update): New buffer-local variable.
(help--lossage-make-recent-keys, help--refresh-lossage-buffer):
New functions.
(view-lossage): Rework.
* doc/emacs/help.texi (Misc Help):
* etc/NEWS: Document change.
---
 doc/emacs/help.texi |  10 +++-
 etc/NEWS            |   6 +++
 lisp/help.el        | 127 +++++++++++++++++++++++++++++++++++---------
 3 files changed, 115 insertions(+), 28 deletions(-)

diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi
index 6ea7b5783c2..879967ddfb2 100644
--- a/doc/emacs/help.texi
+++ b/doc/emacs/help.texi
@@ -716,8 +716,14 @@ Misc Help
 input keystrokes and the commands they invoked.  By default, Emacs
 stores the last 300 keystrokes; if you wish, you can change this number with
 the command @code{lossage-size}.
-If you see commands that you are not familiar with, you can use @kbd{C-h k} or
-@kbd{C-h f} to find out what they do.
+If you see commands that you are not familiar with, use
+@kbd{C-h k}, or press @kbd{RET} or click on them to find out what they do.
+
+@vindex view-lossage-auto-refresh
+By default, after the lossage buffer is displayed it will not show the
+most recent keystroke and command that you are currently typing, to
+change this set the variable @code{view-lossage-auto-refresh} to
+@code{t}.
 
 @kindex C-h e
 @findex view-echo-area-messages
diff --git a/etc/NEWS b/etc/NEWS
index f61825f531b..3f99bdbb440 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -671,6 +671,12 @@ or strings.  If set to 'on-mismatch', mismatched parens inside comments
 and strings will not be highlighted.  If set to nil (the default),
 highlight the parens wherever they are.
 
++++
+** New user option 'view-lossage-auto-refresh'.
+If this option is non-nil, the lossage buffer in 'view-lossage' will be
+refreshed automatically for each new input keystroke and command
+performed.
+
 ** Change in SVG foreground color handling.
 SVG images no longer have the 'fill' attribute set to the value of
 ':foreground' or the current text foreground color.  The 'currentcolor'
diff --git a/lisp/help.el b/lisp/help.el
index 4ba99868c4a..84b58054648 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -517,6 +517,74 @@ function-called-at-point
                 (setq sym (intern-soft (match-string 1 str)))
                 (and (fboundp sym) sym))))))))
 
+
+;;; Lossage
+
+(defcustom view-lossage-auto-refresh nil
+  "Whether to auto-refresh the lossage buffer.
+If non-nil, the lossage buffer will refreshed automatically for each new
+input keystroke and command performed."
+  :type 'boolean
+  :group 'help
+  :version "31.1")
+
+(defvar-local help--lossage-update nil
+  "Variable used to determine if lossage buffer should be refreshed.")
+
+(defvar-local help--lossage-last-key-seq nil
+  "Last key sequence.")
+
+(defun help--lossage-make-recent-keys (&optional most-recent)
+  "Return a string containing all the recent keys and its commands.
+If MOST-RECENT is non-nil, only return the most recent key and its
+command."
+  (let ((keys
+         (if most-recent
+             `[,@(this-single-command-raw-keys) (nil . ,this-command)]
+           (recent-keys 'include-cmds))))
+    (mapconcat
+     (lambda (key)
+       (cond
+        ((and (consp key) (null (car key)))
+         (concat
+          ";; "
+          (if (symbolp (cdr key))
+              (buttonize
+               (symbol-name (cdr key))
+               (lambda (&rest _)
+                 (interactive)
+                 (describe-function (cdr key)))
+               "mouse-1: go to the documentation for this command.")
+	    (propertize "anonymous-command" 'face 'shadow))
+          "\n"))
+        ((or (integerp key) (symbolp key) (listp key))
+         (propertize (single-key-description key)
+                     'face 'help-key-binding
+                     'rear-nonsticky t))
+        (t
+         (propertize (prin1-to-string key nil)
+                     'face 'help-key-binding
+                     'rear-nonsticky t))))
+     keys
+     " ")))
+
+(defun help--refresh-lossage-buffer ()
+  (if-let* ((buf (get-buffer "*Help*"))
+            (_ (buffer-local-value 'help--lossage-update buf)))
+      (with-current-buffer buf
+        (unless (and (eq last-command this-command)
+                     (equal help--lossage-last-key-seq
+                            (this-single-command-raw-keys)))
+          (let ((inhibit-read-only t))
+            (setq help--lossage-last-key-seq (this-single-command-raw-keys))
+            (save-excursion
+              (goto-char (point-max))
+              (insert-before-markers
+               (concat " " (help--lossage-make-recent-keys :most-recent)))
+              (forward-line -1)
+              (comment-indent)))))
+    (remove-hook 'post-command-hook #'help--refresh-lossage-buffer)))
+
 
 ;;; `User' help functions
 
@@ -692,43 +760,50 @@ view-external-packages
   (interactive)
   (info "(efaq)Packages that do not come with Emacs"))
 
-(defun view-lossage ()
+(defun view-lossage (&optional auto-refresh)
   "Display last few input keystrokes and the commands run.
 For convenience this uses the same format as
 `edit-last-kbd-macro'.
 See `lossage-size' to update the number of recorded keystrokes.
 
+With argument, auto-refresh the lossage buffer for each new input
+keystroke, see also `view-lossage-auto-refresh'.
+
 To record all your input, use `open-dribble-file'."
-  (interactive)
-  (let ((help-buffer-under-preparation t))
-    (help-setup-xref (list #'view-lossage)
-		     (called-interactively-p 'interactive))
+  (interactive "P")
+  (let ((help-buffer-under-preparation t)
+        (view-lossage-auto-refresh
+         (if auto-refresh t view-lossage-auto-refresh)))
+    (unless view-lossage-auto-refresh
+      ;; `view-lossage-auto-refresh' conflicts with xref buttons, add
+      ;; them if `view-lossage-auto-refresh' is nil.
+      (help-setup-xref (list #'view-lossage)
+		       (called-interactively-p 'interactive)))
     (with-help-window (help-buffer)
       (princ " ")
-      (princ (mapconcat (lambda (key)
-			  (cond
-			   ((and (consp key) (null (car key)))
-			    (format ";; %s\n" (if (symbolp (cdr key)) (cdr key)
-						"anonymous-command")))
-			   ((or (integerp key) (symbolp key) (listp key))
-			    (single-key-description key))
-			   (t
-			    (prin1-to-string key nil))))
-			(recent-keys 'include-cmds)
-			" "))
+      (insert (help--lossage-make-recent-keys))
       (with-current-buffer standard-output
 	(goto-char (point-min))
-	(let ((comment-start ";; ")
-              ;; Prevent 'comment-indent' from handling a single
-              ;; semicolon as the beginning of a comment.
-              (comment-start-skip ";; ")
-              (comment-use-syntax nil)
-              (comment-column 24))
-          (while (not (eobp))
-            (comment-indent)
-	    (forward-line 1)))
+        (setq-local comment-start ";; "
+                    ;; Prevent 'comment-indent' from handling a single
+                    ;; semicolon as the beginning of a comment.
+                    comment-start-skip ";; "
+                    comment-use-syntax nil
+                    comment-column 24)
+	(while (not (eobp))
+          (comment-indent)
+	  (forward-line 1))
 	;; Show point near the end of "lossage", as we did in Emacs 24.
-	(set-marker help-window-point-marker (point))))))
+	(set-marker help-window-point-marker (point))
+
+        (when view-lossage-auto-refresh
+          (setq-local help--lossage-update t)
+          (add-hook 'post-command-hook #'help--refresh-lossage-buffer))))
+
+    ;; `help-make-xrefs' adds a newline at the end of the buffer, which
+    ;; makes impossible to reposition point in `with-help-window'.
+    (when view-lossage-auto-refresh
+      (set-window-point (get-buffer-window (help-buffer)) (point-max)))))
 
 
 ;; Key bindings
-- 
2.51.0


--=-=-=
Content-Type: text/plain


-- 
- E.G via Gnus and Org.

--=-=-=--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 2 Nov 2025 07:40:54 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Nov 02 02:40:54 2025
Received: from localhost ([127.0.0.1]:57540 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vFShp-0000T3-NT
	for submit <at> debbugs.gnu.org; Sun, 02 Nov 2025 02:40:54 -0500
Received: from mout-p-103.mailbox.org ([2001:67c:2050:0:465::103]:47422)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <juri@HIDDEN>) id 1vFShl-0000Si-TY
 for 79732 <at> debbugs.gnu.org; Sun, 02 Nov 2025 02:40:51 -0500
Received: from smtp2.mailbox.org (smtp2.mailbox.org [10.196.197.2])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
 (No client certificate requested)
 by mout-p-103.mailbox.org (Postfix) with ESMTPS id 4czmpw3FCjz9sc8;
 Sun,  2 Nov 2025 08:40:40 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; 
 t=1762069240;
 h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
 to:to:cc:cc:mime-version:mime-version:content-type:content-type:
 in-reply-to:in-reply-to:references:references;
 bh=enVZHVGGs6PTmkxeg+x++ew5Qb1ToLGNv2yaPt8cxY0=;
 b=01R3Pv1+G8ZmDnTlZfiKqem65cB1VbzRXsEVGr7VxBZt4fNcBaPMtZ5/QrCUVuKSe7mJIj
 bnZgBDlx5pdhybrUoXjw3ERe7LRvYxi5eD2y12GLuqbjrmFWWeY0tT+q1JMLvH24fONp6g
 OjLp+suLk+wZhtRJWvuKeA9o8cSaBgkTVfBba2UqXlGpKNB5Y4Kk+JVnyTMPJ64dFG10t/
 yE2h0XbTD8IFiQfxl+TXOAj0DbE45DI4Qre0cNjRnPeNuf96FfwusLDuC5a5hLtMvGmkvv
 WYrg2TWaT0icdGwjItRHSN/5VribYzo8Rt66qAPZwGs6kZh7pTYKUD0EXCU9Gw==
From: Juri Linkov <juri@HIDDEN>
To: Elijah Gabe =?iso-8859-1?Q?P=E9rez?= <eg642616@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <87ikftbmn2.fsf@HIDDEN>
Organization: LINKOV.NET
References: <874irfkjku.fsf@HIDDEN> <87ikfvcyz2.fsf@HIDDEN>
 <87ikftbmn2.fsf@HIDDEN>
Date: Sun, 02 Nov 2025 09:30:46 +0200
Message-ID: <87bjlkzzht.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79732
Cc: 79732 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

> -	(let ((comment-start ";; ")
> -              ;; Prevent 'comment-indent' from handling a single
> -              ;; semicolon as the beginning of a comment.
> -              (comment-start-skip ";; ")
> -              (comment-use-syntax nil)
> -              (comment-column 24))
> +        (setq-local comment-start ";; "
> +                    ;; Prevent 'comment-indent' from handling a single
> +                    ;; semicolon as the beginning of a comment.
> +                    comment-start-skip ";; "
> +                    comment-use-syntax nil
> +                    comment-column 24)

Hmm, then probably still better to duplicate let-bindings than
to set buffer-local values, because the Help buffer is shared
between many help commands.  OTOH, when other help commands
don't use 'comment-indent', maybe this is not a problem.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 1 Nov 2025 19:14:30 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Nov 01 15:14:30 2025
Received: from localhost ([127.0.0.1]:52672 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vFH3W-0004qP-7i
	for submit <at> debbugs.gnu.org; Sat, 01 Nov 2025 15:14:30 -0400
Received: from mail-yx1-xb142.google.com ([2607:f8b0:4864:20::b142]:51462)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <eg642616@HIDDEN>)
 id 1vFH3R-0004q2-Ni
 for 79732 <at> debbugs.gnu.org; Sat, 01 Nov 2025 15:14:27 -0400
Received: by mail-yx1-xb142.google.com with SMTP id
 956f58d0204a3-63e0fa0571fso3924499d50.3
 for <79732 <at> debbugs.gnu.org>; Sat, 01 Nov 2025 12:14:25 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1762024458; x=1762629258; darn=debbugs.gnu.org;
 h=content-transfer-encoding:mime-version:user-agent:message-id:date
 :references:in-reply-to:subject:cc:to:from:from:to:cc:subject:date
 :message-id:reply-to;
 bh=3UXOFg5obwmotq5/LXoBbBmK+cXN9nbBuKdBFSebA4I=;
 b=YVM1m5u5E12BNL/MT96tM3AJ+y8COQHGGWVWX7E6kY+HH9uV03OWpKmyEielhoLI0F
 dcfWFLbSFu+g6J/4d4WQ6MQrW4SCp+3hWa1flYBerxGiNTTxpoJ2SS0LDS043PUyaxN0
 /1+FCpQ5xfObDkj8WZVentv0ADR2wKUfIdmsOu3aGqCG8JEVWZRDvso+NhEJFC8UAtgi
 Z08LjMMuyaDC39O7W+wFsD2sbBMcJZZx9EpiFEXZAoqbEKS2HWjAnrbo7atb1v9IK7PY
 7dLG+dCyPEGxbNHGEKEFv1+VRp2ARkxc4AYGzfLd9gYkQDKcJkp2LXk7iXQQBSNxkDBq
 AdTw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1762024458; x=1762629258;
 h=content-transfer-encoding:mime-version:user-agent:message-id:date
 :references:in-reply-to:subject:cc:to:from:x-gm-message-state:from
 :to:cc:subject:date:message-id:reply-to;
 bh=3UXOFg5obwmotq5/LXoBbBmK+cXN9nbBuKdBFSebA4I=;
 b=VSiCrpK5ZuROSiZ1S3zehZ8r5ZE5aemDOEw+CmQEwBK5KTGhJjt59F4gjZYe66Ia/r
 bnc+TLkx9g0tZuy4Ptz21Vxj0dODdSORjw9YuBpSX4QVKPynR7u1vw+HIqDfViA40qy9
 7jYM1CwfFSFBDdrD5ou7QCf9hzf29Hqh3Izspon17+t2aatkAqJk3NCR6bq2bkO7Sw38
 l1+Vwl+j/P3yrtUbdrbHvbCQg9wuMMU48xwZK8KlYHT23M0L4x4msW04kPclyC6S+ihO
 iDoBh+kp2pH9xETgEGI85ud6YNxJayZnpQcp8MazWPKgZ6mLuGW8pfATi1Hr86SReRGB
 EuFQ==
X-Forwarded-Encrypted: i=1;
 AJvYcCWqSkWvD4rtOM7CWcOtQ1Bt54NNU+/PePk0eQcoxgqaTzSltq+u2h05Ps4zIAgvt9p+9XcA3A==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YxH2atDMsP5c2lFFFrSm1n3qSgbdZx9LI3voDQWvb0PjS+n21jb
 +bKUgBxyC4Kr8j4OWgMqP64TCjTevokM9Iv/TTJFDeGP/1L8DJzIcbjrNdaKbr66
X-Gm-Gg: ASbGncuKhfpoQ1BRcdr+2CJUWsr3e3+vZCH6ZySrnfgURKqd+ou6CRufdYR401YAi0L
 a3fjpUhCwF7V7ua3fj+PaYc4oHC/UP7gTxd2pbo4h78j34pSm+i6eOA0iFUSlYg0KmK8i3eNHUm
 b7MJ+tCPw4ooEm40WKw5It1Sitf8OvGl4jfKIvFGXedK7Ss0qavZiYjw+andw0lfNRRoKbFCYIH
 EQB9A7Kfu8uZcXXJFIVHQ4ipSiqEJBp6KvncIGfJfIZGA5gNYwCQPGjsaroU6mGEeKgiRiV9O9E
 wBZ7Fr/MfWF8R8whbemaWdZgppKGqOAWBgunzAN0IF5fdbRJFegwmRYU1j6Rs6LZ9bAMtUi8R8X
 buKPnEoPsGrMUWJe8QAFCQSLZJ3DfqtkJA1nG4iXy50GjW0Yxurd51kVUMVkX0NgHSoaZWN9RWf
 +3/1Vj
X-Google-Smtp-Source: AGHT+IGIpunL4Ngpbb/JRRv1zjqWCXUFsQqv10IuuyOJ3esNXASRuHxnK/nH5FL7mSR2SVGxjNiimQ==
X-Received: by 2002:a05:690e:42d5:b0:63e:2e7e:ca2f with SMTP id
 956f58d0204a3-63f923176afmr4716332d50.42.1762024458422; 
 Sat, 01 Nov 2025 12:14:18 -0700 (PDT)
Received: from fedora ([189.215.161.189]) by smtp.gmail.com with ESMTPSA id
 00721157ae682-7864c618af9sm15878167b3.29.2025.11.01.12.14.17
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Sat, 01 Nov 2025 12:14:17 -0700 (PDT)
From: =?utf-8?Q?Elijah_Gabe_P=C3=A9rez?= <eg642616@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <86y0orlfg2.fsf@HIDDEN>
References: <874irfkjku.fsf@HIDDEN> <86y0orlfg2.fsf@HIDDEN>
Date: Sat, 01 Nov 2025 13:14:16 -0600
Message-ID: <87ecqhbm5z.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/31.0.50
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 0.3 (/)
X-Debbugs-Envelope-To: 79732
Cc: 79732 <at> debbugs.gnu.org, Stefan Monnier <monnier@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Eli Zaretskii <eliz@HIDDEN> writes:

>> From: Elijah Gabe P=C3=A9rez <eg642616@HIDDEN>
>> Date: Thu, 30 Oct 2025 18:20:49 -0600
>>=20
>> I'm currently working on make the lossage buffer (view-lossage) refresh
>> automatically (similar to command-log-mode from MELPA) and make it
>> prettier.
>>=20
>> This is what it looks like:
>
> Thanks.
>
> Having a way to refresh the buffer is a useful feature, but why
> automatically?  Doing so will trigger a thorough redisplay upon each
> keystroke, which will make Emacs painfully slow.

I agree with this, but from what i've tested, the performance is
somewhat moderate and stable, i find this useful because it's a kind of
keycast.

> Why not instead provide a mode where a certain key (e.g., "C-x C-h l"
> or "C-h C-l") will update the lossage buffer with keystrokes since the
> last update.  Or maybe even make "C-h l" itself append to the lossage
> buffer if it already exists, given some user option.

If the same command is repeated many times it will not appear in the
buffer, so it helps with performance, also this is disabled by default.

--=20
- E.G via Gnus and Org.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 1 Nov 2025 19:04:25 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Nov 01 15:04:25 2025
Received: from localhost ([127.0.0.1]:52623 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vFGtk-0004S3-IK
	for submit <at> debbugs.gnu.org; Sat, 01 Nov 2025 15:04:25 -0400
Received: from mail-yw1-x1143.google.com ([2607:f8b0:4864:20::1143]:61562)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <eg642616@HIDDEN>)
 id 1vFGtf-0004Rx-Ij
 for 79732 <at> debbugs.gnu.org; Sat, 01 Nov 2025 15:04:22 -0400
Received: by mail-yw1-x1143.google.com with SMTP id
 00721157ae682-78619d34979so31487337b3.2
 for <79732 <at> debbugs.gnu.org>; Sat, 01 Nov 2025 12:04:19 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1762023852; x=1762628652; darn=debbugs.gnu.org;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=l8dsBrIicrWYhVFYkqj93i9KN2hMGZdql/XNeT2z5AI=;
 b=cu/IicAE73cwDW9vPwtFTjEAe8FcmwlUufzs6UcLJQ8oa21BKbPP8xx7jmsKJRWTCm
 ugv2P9TVkX8/8wbTp2ZuSXcJi9gzcsaxnKS4O/qF1ZmgW8UfeDJorUkkX9YzuRftcdWL
 88DpSJ4i0vYOLL0gDgx/mNFSWQctDacEZC5IZZEU9F6aUVt9CAgjY/f3EoCHdftfVKnx
 kSF3ICNi5MBuZcFRQ7naepjqU2AB30btbF9v+KfgdRxPIAzCfKk5lIyZ2IYhLNT8e9sB
 a83RyjPhkTKGugy22SybZrfjL4N24yqiz9s6GI4zBWWaAbY5/C31LCboBfPsxWgMvCuY
 GdQQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1762023852; x=1762628652;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=l8dsBrIicrWYhVFYkqj93i9KN2hMGZdql/XNeT2z5AI=;
 b=NNvbtMEx4pcyt1cdisjepbSAOA6If4H1/k7tpGvBOGenaHMFFSa1vHhZb5hZnYLc6D
 oovrfT7iat3Q1v1ZiY0S+mGkJ18VYBZK6n8obTJ89CnZC73wf8ZXYH8PKszGDlwKMdXU
 s9Agwf7QKf7s5S/qkx/vnKyEbW7Dq6eQxTCK7BjIde8NQKliBYA9+DvnTbhzGogcC8bq
 tl1/cyMuzYtMUWQL8ubVx1C/0aR7wV8y8SIs/kCeQWcHKRqQB7sZ2dBFytKaVUV4SKos
 ZfPJPvxgHcGLOGcBQUxaVOiVcy+v/UxffwseRqcQX+rI3huc8jjVV54uumhzSKMwL/WY
 vZhQ==
X-Gm-Message-State: AOJu0YzAzjtocO8yL0KduRQN8PmFNlHjvpJ6Ll9xidTTHwovyizapTSK
 xX1nBlxg6Od4rTvnUznbvQRAZmePyGEJ6hG1RYLvpgQicLoY0pIZhfwrZi+T51c1
X-Gm-Gg: ASbGncsYgZZVQ1TUypD16yZKJQeZfSofCaY5XBX9QTGgP+MjAXyQe2QCm1mJ3CHp7hZ
 ivBw63+7s8wBArV0dRDglcNyZ6qJu5+NErR2r24VV/TKLpfq6/RNr/2kcG9KzetBlQZ7X/BLlgO
 Ai6caEzuyo4CFvHv/J4Z+mFJRC5BhdxUs6ISksW87HpV7+n9WLqzmo5j4Uoc3KT+kjwLIk4C86e
 VOUEv+p2jTXRtYGN1BD4Be0++vSughdlC5O1h5//eBQcQOZXEZjcVRu6vANNMyi0aTJtjAwLELc
 NZJf7xocp69OXq400q6fzoM0FX7ov80s6s1wIW2RFe49u1IcLfTeOHrgX42jyqyTyInoz7Mum/F
 G+Q4RtDXVwWsUD5KXjhzdNHASnuvWrGWJ9ftXS4EOTXOZ8bstKXnG4gXYTur7RDLXeNZOJ3POgc
 Rx2v3X
X-Google-Smtp-Source: AGHT+IGlJ9AO6tvl9DzuykiBqG/0G9IY3I/S+vi4IKe1jQ7Y9HgNYPbx6qpz+UxIWwe4AQd2owgZXw==
X-Received: by 2002:a05:690c:c90:b0:786:1936:2e86 with SMTP id
 00721157ae682-786485304cemr69356787b3.58.1762023852143; 
 Sat, 01 Nov 2025 12:04:12 -0700 (PDT)
Received: from fedora ([189.215.161.189]) by smtp.gmail.com with ESMTPSA id
 00721157ae682-7864c6ac8bcsm16064477b3.56.2025.11.01.12.04.08
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Sat, 01 Nov 2025 12:04:11 -0700 (PDT)
From: =?utf-8?Q?Elijah_Gabe_P=C3=A9rez?= <eg642616@HIDDEN>
To: Juri Linkov <juri@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <87ikfvcyz2.fsf@HIDDEN>
References: <874irfkjku.fsf@HIDDEN> <87ikfvcyz2.fsf@HIDDEN>
Date: Sat, 01 Nov 2025 13:04:01 -0600
Message-ID: <87ikftbmn2.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 0.3 (/)
X-Debbugs-Envelope-To: 79732
Cc: 79732 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--=-=-=
Content-Type: text/plain

Juri Linkov <juri@HIDDEN> writes:

> I didn't test the patch, but hopefully it works such a way that
> always moves window point to the last line in the lossage buffer
> to make the last keys visible.

It actually works like the *Messages* buffer, so it will always moves
window point if it's at the end of the buffer.

By default, when the buffer is created it moves the point at EOB.

>> +                (propertize
>> +                 (symbol-name (cdr key))
>> +                 'face 'font-lock-function-name-face
>> +                 'mouse-face 'highlight
>> +                 'rear-nonsticky t
>> +                 'help-echo
>> +                 "mouse-1: go to the documentation for this command."
>> +                 'keymap
>> +                 `(keymap (mouse-1 . ,fn) (13 . ,fn))))
>
> Probably better to use button.el here for buttons
> like all other help commands do in the Help buffer.
>
>> +              (comment-start ";; ")
>> +              (comment-start-skip ";; ")
>> +              (comment-use-syntax nil)
>> +              (comment-column 24))
>> [...]
>> +            (comment-indent))))
>
> Maybe it's possible to refactor more to avoid duplication
> of above lines.

Thanks, I've applied most of your suggestions.


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
 filename=0001-Add-option-to-auto-refresh-the-lossage-buffer.-Bug-7.patch

From 73b3f82f061150d953175c0a70be2a4d672f4f24 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?El=C3=ADas=20Gabriel=20P=C3=A9rez?= <eg642616@HIDDEN>
Date: Thu, 30 Oct 2025 13:04:46 -0600
Subject: [PATCH] Add option to auto-refresh the lossage buffer.  (Bug#79732)

* lisp/help.el (view-lossage-auto-refresh): New user option.
(help--lossage-update): New buffer-local variable.
(help--lossage-make-recent-keys, help--refresh-lossage-buffer):
New functions.
(view-lossage): Rework.
* doc/emacs/help.texi (Misc Help):
* etc/NEWS: Document change.
---
 doc/emacs/help.texi |  10 +++-
 etc/NEWS            |   6 +++
 lisp/help.el        | 110 +++++++++++++++++++++++++++++++++++---------
 3 files changed, 101 insertions(+), 25 deletions(-)

diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi
index 6ea7b5783c2..879967ddfb2 100644
--- a/doc/emacs/help.texi
+++ b/doc/emacs/help.texi
@@ -716,8 +716,14 @@ Misc Help
 input keystrokes and the commands they invoked.  By default, Emacs
 stores the last 300 keystrokes; if you wish, you can change this number with
 the command @code{lossage-size}.
-If you see commands that you are not familiar with, you can use @kbd{C-h k} or
-@kbd{C-h f} to find out what they do.
+If you see commands that you are not familiar with, use
+@kbd{C-h k}, or press @kbd{RET} or click on them to find out what they do.
+
+@vindex view-lossage-auto-refresh
+By default, after the lossage buffer is displayed it will not show the
+most recent keystroke and command that you are currently typing, to
+change this set the variable @code{view-lossage-auto-refresh} to
+@code{t}.
 
 @kindex C-h e
 @findex view-echo-area-messages
diff --git a/etc/NEWS b/etc/NEWS
index f61825f531b..3f99bdbb440 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -671,6 +671,12 @@ or strings.  If set to 'on-mismatch', mismatched parens inside comments
 and strings will not be highlighted.  If set to nil (the default),
 highlight the parens wherever they are.
 
++++
+** New user option 'view-lossage-auto-refresh'.
+If this option is non-nil, the lossage buffer in 'view-lossage' will be
+refreshed automatically for each new input keystroke and command
+performed.
+
 ** Change in SVG foreground color handling.
 SVG images no longer have the 'fill' attribute set to the value of
 ':foreground' or the current text foreground color.  The 'currentcolor'
diff --git a/lisp/help.el b/lisp/help.el
index 4ba99868c4a..3bc3f4fcda0 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -517,6 +517,67 @@ function-called-at-point
                 (setq sym (intern-soft (match-string 1 str)))
                 (and (fboundp sym) sym))))))))
 
+
+;;; Lossage
+
+(defcustom view-lossage-auto-refresh nil
+  "Whether to auto-refresh the lossage buffer.
+If non-nil, the lossage buffer will refreshed automatically for each new
+input keystroke and command performed."
+  :type 'boolean
+  :group 'help
+  :version "31.1")
+
+(defvar-local help--lossage-update nil
+  "Variable used to determine if lossage buffer should be refreshed.")
+
+(defun help--lossage-make-recent-keys (&optional most-recent)
+  "Return a string containing all the recent keys and its commands.
+If MOST-RECENT is non-nil, only return the most recent key and its
+command."
+  (let ((keys
+         (if most-recent
+             `[,@(this-single-command-raw-keys) (nil . ,this-command)]
+           (recent-keys 'include-cmds))))
+    (mapconcat
+     (lambda (key)
+       (cond
+        ((and (consp key) (null (car key)))
+         (concat
+          ";; "
+          (if (symbolp (cdr key))
+              (let ((fn (lambda (&rest _)
+                          (interactive)
+                          (describe-function (cdr key)))))
+                (buttonize (symbol-name (cdr key)) fn
+                           "mouse-1: go to the documentation for this command."))
+	    (propertize "anonymous-command" 'face 'shadow))
+          "\n"))
+        ((or (integerp key) (symbolp key) (listp key))
+         (propertize (single-key-description key)
+                     'face 'help-key-binding
+                     'rear-nonsticky t))
+        (t
+         (propertize (prin1-to-string key nil)
+                     'face 'help-key-binding
+                     'rear-nonsticky t))))
+     keys
+     " ")))
+
+(defun help--refresh-lossage-buffer ()
+  (if-let* ((buf (get-buffer "*Help*"))
+            (_ (buffer-local-value 'help--lossage-update buf)))
+      (with-current-buffer buf
+        (unless (eq last-command this-command)
+          (let ((inhibit-read-only t))
+            (save-excursion
+              (goto-char (point-max))
+              (insert-before-markers
+               (concat " " (help--lossage-make-recent-keys :most-recent)))
+              (forward-line -1)
+              (comment-indent)))))
+    (remove-hook 'post-command-hook #'help--refresh-lossage-buffer)))
+
 
 ;;; `User' help functions
 
@@ -701,34 +762,37 @@ view-lossage
 To record all your input, use `open-dribble-file'."
   (interactive)
   (let ((help-buffer-under-preparation t))
-    (help-setup-xref (list #'view-lossage)
-		     (called-interactively-p 'interactive))
+    (unless view-lossage-auto-refresh
+      ;; `view-lossage-auto-refresh' conflicts with xref buttons, add
+      ;; them if `view-lossage-auto-refresh' is nil.
+      (help-setup-xref (list #'view-lossage)
+		       (called-interactively-p 'interactive)))
     (with-help-window (help-buffer)
       (princ " ")
-      (princ (mapconcat (lambda (key)
-			  (cond
-			   ((and (consp key) (null (car key)))
-			    (format ";; %s\n" (if (symbolp (cdr key)) (cdr key)
-						"anonymous-command")))
-			   ((or (integerp key) (symbolp key) (listp key))
-			    (single-key-description key))
-			   (t
-			    (prin1-to-string key nil))))
-			(recent-keys 'include-cmds)
-			" "))
+      (insert (help--lossage-make-recent-keys))
       (with-current-buffer standard-output
 	(goto-char (point-min))
-	(let ((comment-start ";; ")
-              ;; Prevent 'comment-indent' from handling a single
-              ;; semicolon as the beginning of a comment.
-              (comment-start-skip ";; ")
-              (comment-use-syntax nil)
-              (comment-column 24))
-          (while (not (eobp))
-            (comment-indent)
-	    (forward-line 1)))
+        (setq-local comment-start ";; "
+                    ;; Prevent 'comment-indent' from handling a single
+                    ;; semicolon as the beginning of a comment.
+                    comment-start-skip ";; "
+                    comment-use-syntax nil
+                    comment-column 24)
+	(while (not (eobp))
+          (comment-indent)
+	  (forward-line 1))
 	;; Show point near the end of "lossage", as we did in Emacs 24.
-	(set-marker help-window-point-marker (point))))))
+	(set-marker help-window-point-marker (point))
+
+        (when view-lossage-auto-refresh
+          (setq-local help--lossage-update t)
+          (add-hook 'post-command-hook #'help--refresh-lossage-buffer))))
+
+    ;; `help-make-xrefs' adds a newline at the end of the buffer, which
+    ;; makes impossible to reposition point in `with-help-window'.
+    (when view-lossage-auto-refresh
+      (with-current-buffer (help-buffer)
+        (set-window-point (get-buffer-window (help-buffer)) (point-max))))))
 
 
 ;; Key bindings
-- 
2.51.0


--=-=-=
Content-Type: text/plain


-- 
- E.G via Gnus and Org.

--=-=-=--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 31 Oct 2025 07:53:47 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Oct 31 03:53:47 2025
Received: from localhost ([127.0.0.1]:40063 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vEjxC-0003n0-CI
	for submit <at> debbugs.gnu.org; Fri, 31 Oct 2025 03:53:47 -0400
Received: from mout-p-101.mailbox.org ([80.241.56.151]:56476)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <juri@HIDDEN>) id 1vEjwt-0003lz-A8
 for 79732 <at> debbugs.gnu.org; Fri, 31 Oct 2025 03:53:36 -0400
Received: from smtp2.mailbox.org (smtp2.mailbox.org [10.196.197.2])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
 (No client certificate requested)
 by mout-p-101.mailbox.org (Postfix) with ESMTPS id 4cyYBM4HlDz9syY;
 Fri, 31 Oct 2025 08:53:15 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; 
 t=1761897195;
 h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
 to:to:cc:cc:mime-version:mime-version:content-type:content-type:
 in-reply-to:in-reply-to:references:references;
 bh=eZDmwff53yITU/r0A3JCrD4EovHYAM1k2yjRf+BGD2s=;
 b=jQOgXmPziRZ8SacXqhNMQn4Mk67euSyJ8RSKtTsENEI6XtWCWrbVhBj646krA+febQS/Dr
 B3JeDOn/KDsXLwTrA7a0ZlAMpuow5ncMBdTxPiOC+nrYGdz4WHogmvxz/3tql8xO9oE0lY
 afQ6ZjRIPNa8AqVkgo5Tf0N6qmTq3EwWK7qoUIe4agIjnvyTvuvzmpRce45LpziDfqpnpE
 EaAqe84JCRdlL2yjuYsMLdB21tWVyLbfSgPXSqSnnbiPHIyQVbjeT19ye4uscbbXGM5QG7
 7b7AUkNdKMeN1Wm4W4CoQuk9/CWbsg+PvYmb2Thc2NDi5OcUDmYmJunrxIPfJw==
From: Juri Linkov <juri@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <86y0orlfg2.fsf@HIDDEN>
Organization: LINKOV.NET
References: <874irfkjku.fsf@HIDDEN> <86y0orlfg2.fsf@HIDDEN>
Date: Fri, 31 Oct 2025 09:34:04 +0200
Message-ID: <87tszfcz57.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79732
Cc: Elijah Gabe =?iso-8859-1?Q?P=E9rez?= <eg642616@HIDDEN>,
 79732 <at> debbugs.gnu.org, Stefan Monnier <monnier@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

> Having a way to refresh the buffer is a useful feature, but why
> automatically?  Doing so will trigger a thorough redisplay upon each
> keystroke, which will make Emacs painfully slow.  Why not instead
> provide a mode where a certain key (e.g., "C-x C-h l" or "C-h C-l")
> will update the lossage buffer with keystrokes since the last update.
> Or maybe even make "C-h l" itself append to the lossage buffer if it
> already exists, given some user option.
>
> What do others think?

'g' already updates the lossage buffer.  But often it's useful
to see the last keys as they are typed in another buffer.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 31 Oct 2025 07:53:45 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Oct 31 03:53:45 2025
Received: from localhost ([127.0.0.1]:40061 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vEjxA-0003mq-I1
	for submit <at> debbugs.gnu.org; Fri, 31 Oct 2025 03:53:45 -0400
Received: from mout-p-103.mailbox.org ([2001:67c:2050:0:465::103]:48940)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <juri@HIDDEN>) id 1vEjwt-0003m5-B7
 for 79732 <at> debbugs.gnu.org; Fri, 31 Oct 2025 03:53:36 -0400
Received: from smtp102.mailbox.org (smtp102.mailbox.org [10.196.197.102])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
 (No client certificate requested)
 by mout-p-103.mailbox.org (Postfix) with ESMTPS id 4cyYBQ1GP8z9sqF;
 Fri, 31 Oct 2025 08:53:18 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; 
 t=1761897198;
 h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
 to:to:cc:cc:mime-version:mime-version:content-type:content-type:
 in-reply-to:in-reply-to:references:references;
 bh=QuMg8UZqFdof+Kkb1OkgdROBiVtPZHZ/k2rkhPj2x+w=;
 b=t+f6Gw2VlYaEFfdzWHu61nPvuVnzAj/HV2ccNS8qomAoJ468D3ORctk5jqsjFDwQwctf+5
 +csg9208/mF3AVXUy7GaTx3N7ga9ISHCKm1nhf8VPRTSWoRxA2/99U6vt/jKwBBxijGXX1
 wh50uZcJaYqKyBdEWA5fdzJWqdp0Ofs0M7naIfTXcL2wdLrIiKv2CVrtWvEHr6NpD2P3Pl
 XAF7FhIghHAUS7PZ9f19DsxLM1/aeCw9vvVMe/q95nrNopcxb1Aromv4IWeViZrfcljfHA
 GGlldDGg9azhjFwcsJJgZ713jIJVj62dDBqUWMjTQ2rZlFXtlt2JMao0CWOVCg==
From: Juri Linkov <juri@HIDDEN>
To: Elijah Gabe =?iso-8859-1?Q?P=E9rez?= <eg642616@HIDDEN>
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
In-Reply-To: <874irfkjku.fsf@HIDDEN>
Organization: LINKOV.NET
References: <874irfkjku.fsf@HIDDEN>
Date: Fri, 31 Oct 2025 09:38:45 +0200
Message-ID: <87ikfvcyz2.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79732
Cc: 79732 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

> Hello
>
> I'm currently working on make the lossage buffer (view-lossage) refresh
> automatically (similar to command-log-mode from MELPA) and make it
> prettier.
>
> This is what it looks like:
>
> I would like to know if there are any comments about this.

Nice idea.

> Patch:

I didn't test the patch, but hopefully it works such a way that
always moves window point to the last line in the lossage buffer
to make the last keys visible.

> +                (propertize
> +                 (symbol-name (cdr key))
> +                 'face 'font-lock-function-name-face
> +                 'mouse-face 'highlight
> +                 'rear-nonsticky t
> +                 'help-echo
> +                 "mouse-1: go to the documentation for this command."
> +                 'keymap
> +                 `(keymap (mouse-1 . ,fn) (13 . ,fn))))

Probably better to use button.el here for buttons
like all other help commands do in the Help buffer.

> +              (comment-start ";; ")
> +              (comment-start-skip ";; ")
> +              (comment-use-syntax nil)
> +              (comment-column 24))
> [...]
> +            (comment-indent))))

Maybe it's possible to refactor more to avoid duplication
of above lines.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at 79732 <at> debbugs.gnu.org:


Received: (at 79732) by debbugs.gnu.org; 31 Oct 2025 07:05:04 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Oct 31 03:05:04 2025
Received: from localhost ([127.0.0.1]:39838 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vEjC3-0008RL-7s
	for submit <at> debbugs.gnu.org; Fri, 31 Oct 2025 03:05:03 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:53350)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1vEjBw-0008Qh-Iv
 for 79732 <at> debbugs.gnu.org; Fri, 31 Oct 2025 03:04:57 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1vEjBo-0006ac-Ps; Fri, 31 Oct 2025 03:04:48 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=/JZbOu5jmaafvizXJXuRE6LhH1ini5mPPT7w9X/X7vY=; b=TdotOIQgPP98aqODHih3
 uVn8X/ZjBqDsSh5FhQ2Z9il24XuxvK4abQSqKEvq/WXHZDb+A0bruWgplRy4WNN8uhsWsol7w8AIo
 QaGgslBeETiES4sZLkclgFGLN7HpZOsf6fiD1F5VnG0+Gojtfn4rxoakr54HQxrRiluFRNdlbWAEM
 Hv9Ldrqy4NxLZ1hvEp6GCF7HhKRFErTgWNUmAbv7JXMMqgmBivGgm/hOsRA0+id42mf8lYOWDZ5Mz
 4CRXC3ZaxUjUnwbad71w6YpnOGRu/Ol5XK6mJ1ud4BZMnGwJ8xd88qyuz68BmyeULJTnEqPI00741
 bN8HF8jsc+OfcQ==;
Date: Fri, 31 Oct 2025 09:04:45 +0200
Message-Id: <86y0orlfg2.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Elijah Gabe =?utf-8?Q?P=C3=A9rez?= <eg642616@HIDDEN>,
 Stefan Monnier <monnier@HIDDEN>
In-Reply-To: <874irfkjku.fsf@HIDDEN> (message from Elijah Gabe
 =?utf-8?Q?P=C3=A9rez?= on Thu, 30 Oct 2025 18:20:49 -0600)
Subject: Re: bug#79732: [WIP] Auto-refresh the view-lossage buffer
References: <874irfkjku.fsf@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 79732
Cc: 79732 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Elijah Gabe Pérez <eg642616@HIDDEN>
> Date: Thu, 30 Oct 2025 18:20:49 -0600
> 
> I'm currently working on make the lossage buffer (view-lossage) refresh
> automatically (similar to command-log-mode from MELPA) and make it
> prettier.
> 
> This is what it looks like:

Thanks.

Having a way to refresh the buffer is a useful feature, but why
automatically?  Doing so will trigger a thorough redisplay upon each
keystroke, which will make Emacs painfully slow.  Why not instead
provide a mode where a certain key (e.g., "C-x C-h l" or "C-h C-l")
will update the lossage buffer with keystrokes since the last update.
Or maybe even make "C-h l" itself append to the lossage buffer if it
already exists, given some user option.

What do others think?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 31 Oct 2025 00:21:31 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Oct 30 20:21:31 2025
Received: from localhost ([127.0.0.1]:38446 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vEctW-00078O-Qm
	for submit <at> debbugs.gnu.org; Thu, 30 Oct 2025 20:21:31 -0400
Received: from lists.gnu.org ([2001:470:142::17]:52592)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eg642616@HIDDEN>)
 id 1vEctP-00077x-44
 for submit <at> debbugs.gnu.org; Thu, 30 Oct 2025 20:21:24 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eg642616@HIDDEN>)
 id 1vEctI-0005Po-3C
 for bug-gnu-emacs@HIDDEN; Thu, 30 Oct 2025 20:21:16 -0400
Received: from mail-oi1-x243.google.com ([2607:f8b0:4864:20::243])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <eg642616@HIDDEN>)
 id 1vEct8-0007NY-Rr
 for bug-gnu-emacs@HIDDEN; Thu, 30 Oct 2025 20:21:15 -0400
Received: by mail-oi1-x243.google.com with SMTP id
 5614622812f47-44f7adb9eb1so497421b6e.3
 for <bug-gnu-emacs@HIDDEN>; Thu, 30 Oct 2025 17:21:00 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1761870056; x=1762474856; darn=gnu.org;
 h=mime-version:message-id:date:subject:to:from:from:to:cc:subject
 :date:message-id:reply-to;
 bh=WdX05Wj4DXB58X+fX+yNm81V1UA0eVO3nij9wsa1o8A=;
 b=HKtSscC0Ygik37MOU2YB1OKF8HwQEoZ7Pom2QlgiKd89JQ9EVJPs99luPeb37sv5ci
 CxwLECpzwLgAy0kZvdoOF965PqkQssWopEDUoNYRf2BLOmxxYEe+MRcPWf9hch8LnZ41
 pEqCEE3Y/VSaeuwGeaA9JSVBUwREPG85rV7i4+z0PkU/qn9sH9vKfjxgCWONJiNGMvBU
 AuYK0nYX76EKSp+HGrL3os64PTrDjmLfmqyFeNBgIoeS5HowJ6Di66IL6tHffATGNxFS
 BvqDr42Z+rcoFPb9iob4DHWOIysAaT9ww3lx5eyW5zgpZ4P6M5SVHvVpjs7OmRs2vd0x
 4F7g==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1761870056; x=1762474856;
 h=mime-version:message-id:date:subject:to:from:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=WdX05Wj4DXB58X+fX+yNm81V1UA0eVO3nij9wsa1o8A=;
 b=nOqihJY5OuPwrBotDSjxKL9DBFAfPS0WQnl6ZFqkv5SX5rGoZnis0bFo5g0+WeMwTA
 eRC49ROh2hu/su2Co1RiAP+MRWVW794HLq6wPTDqZJsQhjNN0Bnrkk56IPc0QNIhVR//
 lh41+zi9avL3Wr2MhCJWf+ITpDsUgIxXg/f3UC+xDirMU5WcuRqXlDuT8OjuaJ7J3hAC
 G2flpegVzclTwvhv/JChQoxvAE4qE25KC1UVEUgBcQLuRoh/P07Qg3Enhu6pWCw5Jnin
 K7wC6X5SN99jkp17Wq8aI9J8Q2Xh9EZqa+gEVRYm7Pj1MRS7vXbVuPRcYf5sVrJCensF
 IoKg==
X-Gm-Message-State: AOJu0YyCzrK3jwLISkVX55HExk4pOd/YjVVzbS2ATF84xjy1a1VLv41z
 KEhiXSis052iPOwsTr76NMJoqiDVGsw1RdiQKrKRyvQ8H+On1vAJS99dLzsOTNOL
X-Gm-Gg: ASbGncuIGTBQ/q7znKzuHj2RjtqCT1nE2ZCp7+2pC5rr3GV4I4/Gz+HSx09GHn2RXmL
 vBS9t49QEYTzbioZlQTxPwZngpOZpyJO7g/pddlh5VVQaFwEADvpSwJv9VIlXxowaDs112IOvxF
 xCbDOigcgAxhghwlsS/drN4EPs0p+CdKbsNteUbH9eWcJGzKVFsWT0eX21x8wvxRrHIiWALVa/L
 LuE3l0VewRxBRPjB282vsu884D3YIaU+GQXijRM97r0KEmgFKfh0gidSVKcclVM+0W2MrdBQPpI
 epQxl5URaPOpCoekwpfc7UDtFa4om8/kzB3O5MKCx1gmYP5SB0yYZ04Okk4bC0l7jMcfC+mmXjd
 uv8MrkN4a98SoP0nM5/cxLQewZvv8CoiM/dV7C4xrX4UjuWEj1wixKZpeV2VA2iCp8JzBApqhsK
 3nnfRR
X-Google-Smtp-Source: AGHT+IHu/sbRTibZsSu1mdyvR2s6dST0qeNTlytH1R885+mmFxyBcVzozDUJbHTuDPW+mxz5xBOZeQ==
X-Received: by 2002:a05:6808:80b4:b0:43f:2ab7:345a with SMTP id
 5614622812f47-44f95f7ce58mr738513b6e.37.1761870055845; 
 Thu, 30 Oct 2025 17:20:55 -0700 (PDT)
Received: from fedora ([189.215.161.189]) by smtp.gmail.com with ESMTPSA id
 006d021491bc7-6568cf1fba9sm78022eaf.7.2025.10.30.17.20.52
 for <bug-gnu-emacs@HIDDEN>
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Thu, 30 Oct 2025 17:20:55 -0700 (PDT)
From: =?utf-8?Q?Elijah_Gabe_P=C3=A9rez?= <eg642616@HIDDEN>
To: bug-gnu-emacs@HIDDEN
Subject: [WIP] Auto-refresh the view-lossage buffer
Date: Thu, 30 Oct 2025 18:20:49 -0600
Message-ID: <874irfkjku.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
Received-SPF: pass client-ip=2607:f8b0:4864:20::243;
 envelope-from=eg642616@HIDDEN; helo=mail-oi1-x243.google.com
X-Spam_score_int: -16
X-Spam_score: -1.7
X-Spam_bar: -
X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DC_IMAGE_SPAM_HTML=0.1,
 DC_PNG_UNO_LARGO=0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1,
 DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001,
 RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
 SPF_PASS=-0.001 autolearn=no autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 1.2 (+)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 Content preview: Hello I'm currently working on make the lossage buffer
 (view-lossage)
 refresh automatically (similar to command-log-mode from MELPA) and make it
 prettier. This is what it looks like: 
 Content analysis details:   (1.2 points, 10.0 required)
 pts rule name              description
 ---- ---------------------- --------------------------------------------------
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
 no trust [2001:470:142:0:0:0:0:17 listed in] [list.dnswl.org]
 0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
 provider (eg642616[at]gmail.com)
 -0.0 SPF_HELO_PASS          SPF: HELO matches SPF record
 1.0 SPF_SOFTFAIL           SPF: sender does not match SPF record (softfail)
 0.2 FREEMAIL_ENVFROM_END_DIGIT Envelope-from freemail username ends
 in digit (eg642616[at]gmail.com)
 0.0 DC_PNG_UNO_LARGO       Message contains a single large png image
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.2 (/)

--=-=-=
Content-Type: text/plain


Hello

I'm currently working on make the lossage buffer (view-lossage) refresh
automatically (similar to command-log-mode from MELPA) and make it
prettier.

This is what it looks like:


--=-=-=
Content-Type: image/png
Content-Disposition: inline; filename=lossage.png
Content-Transfer-Encoding: base64

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
/4ho4mdJ1icYAAAAAElFTkSuQmCC
--=-=-=
Content-Type: text/plain


I would like to know if there are any comments about this.



Patch:

--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=live-lossage.patch

diff --git a/lisp/help.el b/lisp/help.el
index 4ba99868c4a..d3d7c99b803 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -517,6 +517,77 @@ function-called-at-point
                 (setq sym (intern-soft (match-string 1 str)))
                 (and (fboundp sym) sym))))))))
 
+
+;;; Lossage
+
+(defcustom view-lossage-auto-refresh nil
+  "Whether to auto-refresh the lossage buffer.
+If non-nil, the lossage buffer will refreshed automatically for each new
+input keystroke and command performed."
+  :type 'boolean
+  :group 'help
+  :version "31.1")
+
+(defvar-local help--lossage-update nil
+  "Variable used to determine if lossage buffer should be refreshed.")
+
+(defun help--lossage-make-recent-keys (&optional most-recent)
+  "Return a string containing all the recent keys and its commands.
+If MOST-RECENT is non-nil, only return the most recent key and its
+command."
+  (let ((keys
+         (if-let* (most-recent
+                   (list (recent-keys 'include-cmds))
+                   (ln (length list)))
+             (seq-subseq list (- ln 2) ln)
+           (recent-keys 'include-cmds))))
+    (mapconcat
+     (lambda (key)
+       (cond
+        ((and (consp key) (null (car key)))
+         (concat
+          ";; "
+          (if (symbolp (cdr key))
+              (let ((fn (lambda ()
+                          (interactive)
+                          (describe-function (cdr key)))))
+                (propertize
+                 (symbol-name (cdr key))
+                 'face 'font-lock-function-name-face
+                 'mouse-face 'highlight
+                 'rear-nonsticky t
+                 'help-echo
+                 "mouse-1: go to the documentation for this command."
+                 'keymap
+                 `(keymap (mouse-1 . ,fn) (13 . ,fn))))
+	    (propertize "anonymous-command" 'face 'shadow))
+          "\n"))
+        ((or (integerp key) (symbolp key) (listp key))
+         (propertize (single-key-description key)
+                     'face 'help-key-binding))
+        (t
+         (propertize (prin1-to-string key nil)
+                     'face 'help-key-binding))))
+     keys
+     " ")))
+
+(defun help--refresh-lossage-buffer ()
+  (if-let* ((buf (get-buffer "*Help*"))
+            (_ (buffer-local-value 'help--lossage-update buf)))
+      (with-current-buffer buf
+        (let ((inhibit-read-only t)
+              (comment-start ";; ")
+              (comment-start-skip ";; ")
+              (comment-use-syntax nil)
+              (comment-column 24))
+          (save-excursion
+            (goto-char (point-max))
+            (insert-before-markers
+             (concat " " (help--lossage-make-recent-keys :most-recent)))
+            (forward-line -1)
+            (comment-indent))))
+    (remove-hook 'post-command-hook #'help--refresh-lossage-buffer)))
+
 
 ;;; `User' help functions
 
@@ -705,17 +776,7 @@ view-lossage
 		     (called-interactively-p 'interactive))
     (with-help-window (help-buffer)
       (princ " ")
-      (princ (mapconcat (lambda (key)
-			  (cond
-			   ((and (consp key) (null (car key)))
-			    (format ";; %s\n" (if (symbolp (cdr key)) (cdr key)
-						"anonymous-command")))
-			   ((or (integerp key) (symbolp key) (listp key))
-			    (single-key-description key))
-			   (t
-			    (prin1-to-string key nil))))
-			(recent-keys 'include-cmds)
-			" "))
+      (insert (help--lossage-make-recent-keys))
       (with-current-buffer standard-output
 	(goto-char (point-min))
 	(let ((comment-start ";; ")
@@ -728,7 +789,11 @@ view-lossage
             (comment-indent)
 	    (forward-line 1)))
 	;; Show point near the end of "lossage", as we did in Emacs 24.
-	(set-marker help-window-point-marker (point))))))
+	(set-marker help-window-point-marker (point))
+        (when view-lossage-auto-refresh
+          (setq-local help--lossage-update t
+                      window-point-insertion-type t)
+          (add-hook 'post-command-hook #'help--refresh-lossage-buffer))))))
 
 
 ;; Key bindings

--=-=-=
Content-Type: text/plain


-- 
- E.G via Gnus and Org.

--=-=-=--




Acknowledgement sent to Elijah Gabe Pérez <eg642616@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#79732; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Wed, 5 Nov 2025 07:30:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.