From d7c9676ec8ecf295021d1e8d0f327d614a3d84ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Thu, 16 Apr 2026 08:28:21 +0100 Subject: [PATCH] Jsonrpc: don't suddenly jump point in events buffer * lisp/jsonrpc.el (jsonrpc--save-excursion-maybe): New macro. * lisp/jsonrpc.el (jsonrpc--log-event, jsonrpc--forwarding-buffer): Use it. --- lisp/jsonrpc.el | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el index e8930fd2d4e..4e4f914c998 100644 --- a/lisp/jsonrpc.el +++ b/lisp/jsonrpc.el @@ -1053,6 +1053,15 @@ TIMEOUT is nil)." fn oops) (remove-hook 'jsonrpc-event-hook fn))))))) +(defmacro jsonrpc--save-excursion-maybe (&rest body) + "Run BODY, preserving point unless it was at `point-max'. +If point is already at end of buffer, allow it to follow any +text inserted there. Otherwise, restore it afterwards." + (declare (indent 0)) + `(if (= (point) (point-max)) + (progn ,@body) + (save-excursion ,@body))) + (defun jsonrpc--limit-buffer-size (max-size) "Limit the current buffer to MAX-SIZE by eating lines at the beginning. Do nothing if MAX-SIZE is nil." @@ -1137,12 +1146,13 @@ of the API instead.") (concat "\n" (pp-to-string foreign-message)))) (concat log-text "\n"))))))) - (goto-char (point-max)) ;; XXX: could use `run-at-time' to delay server logs ;; slightly to play nice with verbose servers' stderr. (when error (setq msg (propertize msg 'face 'error))) - (insert-before-markers msg) + (jsonrpc--save-excursion-maybe + (goto-char (point-max)) + (insert-before-markers msg)) (jsonrpc--limit-buffer-size max)))))) (defun jsonrpc--forwarding-buffer (name prefix conn) @@ -1167,11 +1177,12 @@ PREFIX to CONN's events buffer." (line-beginning-position 0) (line-end-position 0)) do (with-current-buffer (jsonrpc-events-buffer conn) - (goto-char (point-max)) (let ((inhibit-read-only t)) - (insert - (propertize (format "%s %s\n" prefix line) - 'face 'shadow)) + (jsonrpc--save-excursion-maybe + (goto-char (point-max)) + (insert-before-markers + (propertize (format "%s %s\n" prefix line) + 'face 'shadow))) (jsonrpc--limit-buffer-size max))) until (eobp))))) nil t))