Subject: bug#44629: 28.0.50; Eglot noisy with gfm-view-mode and view-read-only

From: "Basil L. Contovounesios" <[email-masked]>
Date: Tue, 17 Nov 2020 20:15:54 +0000

tags 44629 + patch
quit

João Távora <[email-masked]> writes:

> On Sun, Nov 15, 2020 at 9:52 PM Basil L. Contovounesios <[email-masked]> wrote:
>
>> The selectivity is that I want the "View mode: ..." message to appear
>> most of the time, except not when Eglot is doing background processing.
>
> Exactly.  Or any type of background processing, for that matter.  
> So, if this is a principle, the check for `this-command`, as I proposed
> it in a patch,should suffice

This initially felt a bit heavy-handed (since view-mode-enter is called
in various places), so I was hesitant to go with it, but upon further
consideration I couldn't think of a better way.

For example, binding inhibit-message or set-message-function in
eglot--format-markup may avoid spamming the echo area, but it may also
inadvertently clear the echo area of other messages during Eglot usage,
and still spams *Messages*.

The point is that view-mode-enter shouldn't call message under all
circumstances, and this-command seems like an accurate enough condition.

> This doesn't change the fact that jsonrpc.el's use of `read-only-mode` 
> should probably be replaced by a simple setting of buffer-read-only,
> but it could avoid the change to eglot when it calls `gfm-view-mode`.
> Though maybe that change could be there, too.

See my thoughts above on why Eglot needn't be changed in this regard.

How's the attached patch for view.el and jsonrpc.el?

Thanks,

-- 
Basil

>From ea8079ee38f752c412d700a7675d8937466c2b14 Mon Sep 17 00:00:00 2001
From: "Basil L. Contovounesios" <[email-masked]>
Date: Mon, 16 Nov 2020 14:40:57 +0000
Subject: [PATCH] Avoid spamming view-mode-enter help message
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

By default, entering view-mode echoes a usage message.  This is
particularly helpful with non-nil view-read-only, to notify the user
that view-mode has been enabled.  It is less useful and more spammy,
however, if view-mode is (possibly inadvertently) entered from some
non-interactive code running in the background, such as when a major
mode is enabled in a temporary buffer for text formatting
purposes (bug#44629).

* lisp/jsonrpc.el (jsonrpc-events-buffer, initialize-instance): Use
buffer-read-only in place of read-only-mode for non-interactive use.
* lisp/view.el (view-mode-enter): Inhibit help message if either
view-inhibit-help-message is non-nil, or view-mode-enter was called
from an interactive command.  Suggested by João Távora
<[email-masked]>.
---
 lisp/jsonrpc.el | 27 +++++++++++++--------------
 lisp/view.el    |  9 +++++++--
 2 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el
index 7de6baeb00..e1b832c407 100644
--- a/lisp/jsonrpc.el
+++ b/lisp/jsonrpc.el
@@ -138,18 +138,15 @@ jsonrpc-lambda
 
 (defun jsonrpc-events-buffer (connection)
   "Get or create JSONRPC events buffer for CONNECTION."
-  (let* ((probe (jsonrpc--events-buffer connection))
-         (buffer (or (and (buffer-live-p probe)
-                          probe)
-                     (let ((buffer (get-buffer-create
-                                    (format "*%s events*"
-                                            (jsonrpc-name connection)))))
-                       (with-current-buffer buffer
-                         (buffer-disable-undo)
-                         (read-only-mode t)
-                         (setf (jsonrpc--events-buffer connection) buffer))
-                       buffer))))
-    buffer))
+  (let ((probe (jsonrpc--events-buffer connection)))
+    (if (buffer-live-p probe)
+        probe
+      (with-current-buffer
+          (get-buffer-create (format "*%s events*" (jsonrpc-name connection)))
+        (buffer-disable-undo)
+        (setq buffer-read-only t)
+        (setf (jsonrpc--events-buffer connection)
+              (current-buffer))))))
 
 (defun jsonrpc-forget-pending-continuations (connection)
   "Stop waiting for responses from the current JSONRPC CONNECTION."
@@ -404,7 +401,7 @@ initialize-instance
           (ignore-errors (kill-buffer hidden-name))
           (rename-buffer hidden-name)
           (process-put proc 'jsonrpc-stderr (current-buffer))
-          (read-only-mode t))))
+          (setq buffer-read-only t))))
     (setf (jsonrpc--process conn) proc)
     (set-process-buffer proc (get-buffer-create (format " *%s output*" name)))
     (set-process-filter proc #'jsonrpc--process-filter)
@@ -412,7 +409,9 @@ initialize-instance
     (with-current-buffer (process-buffer proc)
       (buffer-disable-undo)
       (set-marker (process-mark proc) (point-min))
-      (let ((inhibit-read-only t)) (erase-buffer) (read-only-mode t)))
+      (let ((inhibit-read-only t))
+        (erase-buffer))
+      (setq buffer-read-only t))
     (process-put proc 'jsonrpc-connection conn)))
 
 (cl-defmethod jsonrpc-connection-send ((connection jsonrpc-process-connection)
diff --git a/lisp/view.el b/lisp/view.el
index 204e28c2a2..6f576f8c04 100644
--- a/lisp/view.el
+++ b/lisp/view.el
@@ -88,7 +88,9 @@ view-exits-all-viewing-windows
   :group 'view)
 
 (defcustom view-inhibit-help-message nil
-  "Non-nil inhibits the help message shown upon entering View mode."
+  "Non-nil inhibits the help message shown upon entering View mode.
+This setting takes effect only when View mode is entered via an
+interactive command; otherwise the help message is not shown."
   :type 'boolean
   :group 'view
   :version "22.1")
@@ -559,7 +561,10 @@ view-mode-enter
 
   (unless view-mode
     (view-mode 1)
-    (unless view-inhibit-help-message
+    (when (and (not view-inhibit-help-message)
+               ;; Avoid spamming the echo area if `view-mode' is entered
+               ;; non-interactively, e.g., in a temporary buffer (bug#44629).
+               this-command)
       (message "%s"
 	       (substitute-command-keys "\
 View mode: type \\[help-command] for help, \\[describe-mode] for commands, \\[View-quit] to quit.")))))
-- 
2.29.2