Subject: bug#36193: 26.2; 'set-window-scroll-bars' setting doesn't take effect in emacsclient session

From: martin rudalics <[email-masked]>
Date: Tue, 18 Jun 2019 15:42:39 +0200

> Yes. If in 'hide-minibuffer-scrollbar' I replace '(minibuffer-window)' with
 > 'nil', the scratch buffer has no scroll bars and they don't reappear even
 > if the buffer become longer than the window height. They are only
 > re-enabled if I open another buffer in that window, and then they persist.

Ahh...  I should have asked you that so it's good you noticed it.
This shows that the behavior is not minibuffer window specific.

 > No, messages are shown at startup without the scroll bars being shown. if I
 > do M-x or M-: or anything that moves the point to the minibuffer, then they
 > are re-enabled.

So showing another buffer in the minibuffer window reenables the
scroll bars.  This is consistent with the first observation.

The behavior (which I would call a bug) is caused by set_window_buffer
when called with keep_margins_p nil and is completely unrelated to
whether you do it in emacsclient or in a "normal" session.  That is if
I evaluate with emacs -Q

(set-window-scroll-bars (minibuffer-window) 0 nil)

and then type M-x, I get the scroll bars back just as you do.  The
behavior is described in the Elisp manual on 'set-window-scroll-bars'

      The values specified here may be later overridden by invoking
      ‘set-window-buffer’ (*note Buffers and Windows::) on WINDOW with
      its KEEP-MARGINS argument ‘nil’ or omitted.

but I consistently forget about it.

If people agree that this is a bug, we can try to find a more general
fix.  Otherwise, I'll fix the minibuffer window scroll bars with the
help of a separate variable (I have written the code some time ago and
would "only" have to find it now).

As a temporary workaround you can try to set the buffer local values
of 'scroll-bar-width' to zero in all buffers that might eventually
show up in the minibuffer window, for example, thusly

(progn
   (set-window-scroll-bars (minibuffer-window) 0 nil)
   (with-current-buffer (get-buffer-create " *Echo Area 0*")
     (setq scroll-bar-width 0))
   (with-current-buffer (get-buffer-create " *Echo Area 1*")
     (setq scroll-bar-width 0))
   (with-current-buffer (get-buffer-create " *Minibuf-0*")
     (setq scroll-bar-width 0))
   (with-current-buffer (get-buffer-create " *Minibuf-1*")
     (setq scroll-bar-width 0)))

This should work as long as you don't enable recursive minibuffers.

martin