Subject: bug#37213: Execute set-window-margins. left-margin-width remains 0.

From: Alan Mackenzie <[email-masked]>
Date: Sat, 31 Aug 2019 11:59:11 +0000

Hello, Eli.

On Thu, Aug 29, 2019 at 09:42:17 +0300, Eli Zaretskii wrote:
> > Date: Wed, 28 Aug 2019 19:57:06 +0000
> > Cc: [email-masked]
> > From: Alan Mackenzie <[email-masked]>
 
> > > I don't think this is a bug.  This variable is for _setting_ the
> > > margin width, not for _returning_ its width as set "by other means".
> > > See its documentation.

> > The documentation says "This variable specifies the width of the left
> > margin".  As best, this is unclear.  What you're saying is that the
> > variable ceases to specify that width, should the margin be altered by
> > other means.

> > I maintain that this is either a bug in the documentation, or in the
> > code.

> I'm okay with clarifying the documentation, but let's first agree what
> needs clarifying there.

How about the following, purely pragmatic, patch?

diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 7c0a56dcad..428fe9595a 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -5016,7 +5016,9 @@ Display Margins
   Setting these variables does not immediately affect the window.  These
 variables are checked when a new buffer is displayed in the window.
 Thus, you can make changes take effect by calling
-@code{set-window-buffer}.
+@code{set-window-buffer}.  Do not use these variables to try to
+determine the current width of the left or right margin.  Instead, use
+the function @code{window-margins}.
 
   You can also set the margin widths immediately.

With this patch applied, I'd be happy for the bug to be closed.

> > If the former, it should explicitly state that the variable is
> > write-only, and its read value is undefined.  It should say that the
> > function window-margins should be used instead.

> > But it might be easier just to amend the code.  There appear to be just
> > two ways to set the width of the left margin (or the right margin), so
> > if it gets set the second way, why not just set that variable?  Could
> > this do any harm?  (Note: I haven't looked at the code, yet.)

> Think about it: left-margin-width is a per-buffer variable.  A buffer
> can be displayed in zero or more windows, and the margin is a window
> property.  How can a single buffer-local variable reflect a value that
> can be different in different windows, and can even be meaningless if
> the buffer is not displayed in any window?

OK.

> What happens in the code is that when a buffer is displayed in a
> window, this variable is consulted, and the window's margin-width
> attribute set accordingly.  The window margins can grow or shrink
> thereafter, and the function window-margins then returns this window
> attribute's value at any given moment for a specific window.

Thanks for the explanation.

-- 
Alan Mackenzie (Nurermberg, Germany).