[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Proposal: new mode-line `%'-construct %o meaning "Degree of travel of wi
From: |
Alan Mackenzie |
Subject: |
Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer". |
Date: |
Mon, 15 May 2017 20:44:17 +0000 |
User-agent: |
Mutt/1.5.24 (2015-08-30) |
Hello, Emacs.
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
then, Eli!).
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:
aaaaaaaaaaaaaaaaWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbbbbbbbbbbbbbbbb
. In this configuration, "%p" reports 25%. The new "%o" would be 50%
As the window approaches the end of the buffer:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWb
, "%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
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -23870,6 +23870,26 @@ decode_mode_spec (struct window *w, register int c,
int field_width,
return " Narrow";
break;
+ /* 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";
+ else
+ {
+ sprintf (decode_mode_spec_buf, "%2d%%",
+ percent99 (toppos - begv, (toppos - begv) + (zv - botpos)));
+ return decode_mode_spec_buf;
+ }
+ }
+
case 'p':
{
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 <=