[Top][All Lists]

[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:


.  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
--- 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";
+      /* 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).

reply via email to

[Prev in Thread] Current Thread [Next in Thread]