emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel o


From: Alan Mackenzie
Subject: Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer".
Date: Wed, 17 May 2017 21:32:38 +0000
User-agent: Mutt/1.5.24 (2015-08-30)

Hello, Eli and Dani.

On Tue, May 16, 2017 at 20:37:59 +0000, Alan Mackenzie wrote:
> On Tue, May 16, 2017 at 06:00:12 +0300, Eli Zaretskii wrote:
> > > Date: Mon, 15 May 2017 20:44:17 +0000
> > > From: Alan Mackenzie <address@hidden>

> > > Numerically, "%p" is 100 * a / (a + W + b).

> > > "%o" is 100 * a / (a + b).

> > Isn't it better to display 100 * (a + W/2) / (a + W + b) instead?

> > This shows the portion of buffer before the window-center.  It will
> > show 50% in the first use case and 73% in the second.  IMO, showing
> > 98% in the second case sounds misleading, not unlike the current 49%,
> > because it effectively disregards the text inside the window, and thus
> > can lead to skewed estimations when the part inside the window is
> > non-negligible relative to the part that outside.

Dani Moncayo wrote

> FWIW: I'd love to have these placeholders supported in Emacs, so that
> I could show in the modeline the range of text (lines) I'm currently
> seeing in the window.  E.g.: "(15-25%)".

I've hacked these two formulae into xdisp.c, Eli's formula as %O, Dani's
as %q.

For what it's worth, having tried it, I don't think %O is very useful -
it displays a value which (unless it is All, Top, or Bot) ranges
between, say 36% and 64%.

For %q, I haven't included the parentheses Dani suggested, and it's a
bit DWIMy, with things like "All", "Top-5%", "63%-Bot", "15-25%".

Just to save you some work, I found the following useful for trying them
out, by setting the pertinent part of the standard mode-line format.
(i) (For %O): (aset (cadr (car mode-line-position)) 1 ?O)
(ii) (For %q): (aset (cadr (car mode-line-position)) 1 ?q)
      and      (setcar (car mode-line-position) -7)

Thoughts?



diff --git a/src/xdisp.c b/src/xdisp.c
index cdea20993c..a2dc595155 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -23870,6 +23870,48 @@ 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;
+          }
+      }
+
+      /* Display the percentage of the buffer above the middle of the screen. 
*/
+    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 + botpos)/2 - begv, 
+                              zv - begv));
+          return decode_mode_spec_buf;
+          }
+      }
+
+      /* Display percentage of buffer above the top of the screen.  */
     case 'p':
       {
        ptrdiff_t pos = marker_position (w->start);
@@ -23907,6 +23949,38 @@ decode_mode_spec (struct window *w, register int c, 
int field_width,
          }
       }
 
+      /* Display percentage offsets of top and bottom of the window,
+         using "Top", "Bot" and "All" where appropriate. */
+    case 'q':
+      {
+        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 ((toppos <= begv) && (zv <= botpos))
+          return "All";
+
+        if (toppos <= begv)
+          strcpy (decode_mode_spec_buf, "Beg");
+        else
+          sprintf (decode_mode_spec_buf, "%2d",
+                   percent99 (toppos - begv, zv - begv));
+
+        if (zv <= botpos)
+          strcat (decode_mode_spec_buf, "%-");
+        else
+          strcat (decode_mode_spec_buf, "-");
+
+        if (zv <= botpos)
+          strcat (decode_mode_spec_buf, "Bot");
+        else
+          sprintf (&decode_mode_spec_buf [strlen (decode_mode_spec_buf)],
+                   "%2d%%", percent99 (botpos - begv, zv - begv));
+
+        return decode_mode_spec_buf;
+      }
+
     case 's':
       /* status of process */
       obj = Fget_buffer_process (Fcurrent_buffer ());


-- 
Alan Mackenzie (Nuremberg, Germany).



reply via email to

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