[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Proposal: new mode-line `%'-construct %o meaning "Degree of travel of wi
Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer".
Mon, 15 May 2017 20:44:17 +0000
I've always been annoyed by the percentage output by the mode-line
construct "%p" - so much so that I patched my personal copy of
`decode-mode-spec' in xdisp.c over ten years ago (thanks for the tip
What I don't like about it is that is indicates the wrong thing, i.e.
the relative position of the top of the window in the buffer. What I
want is the degree of travel of the window through the buffer, for which
I propose "%o".
To illustrate the difference, in the following diagrams, the letters a,
W, and b will make up the entire (visible portion of) a buffer, with a
being the part above the window, W being the window itself, and b the
part below the window.
So, if we have a buffer which is twice as big as the portion which fits
into the window, and the window is in the middle of the buffer, we have:
. In this configuration, "%p" reports 25%. The new "%o" would be 50%
As the window approaches the end of the buffer:
, "%p" reports 49%. I find this disconcerting, since that 49% suggests
to me we should be near the middle of the buffer, although we're almost
at its end. "%o" here would report 98%.
Numerically, "%p" is 100 * a / (a + W + b).
"%o" is 100 * a / (a + b).
Here is (the code part of) a patch which implements this "%o":
diff --git a/src/xdisp.c b/src/xdisp.c
index cdea20993c..f1236e1583 100644
@@ -23870,6 +23870,26 @@ decode_mode_spec (struct window *w, register int c,
return " Narrow";
+ /* Display the "degree of travel" of the window through the buffer. */
+ case 'o':
+ ptrdiff_t toppos = marker_position (w->start);
+ ptrdiff_t botpos = BUF_Z (b) - w->window_end_pos;
+ ptrdiff_t begv = BUF_BEGV (b);
+ ptrdiff_t zv = BUF_ZV (b);
+ if (zv <= botpos)
+ return toppos <= begv ? "All" : "Bottom";
+ else if (toppos <= begv)
+ return "Top";
+ sprintf (decode_mode_spec_buf, "%2d%%",
+ percent99 (toppos - begv, (toppos - begv) + (zv - botpos)));
+ return decode_mode_spec_buf;
ptrdiff_t pos = marker_position (w->start);
What do people say?
Alan Mackenzie (Nuremberg, Germany).
- Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer".,
Alan Mackenzie <=