[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).
- Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer"., (continued)
- Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer"., Eli Zaretskii, 2017/05/19
- Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer"., Kaushal Modi, 2017/05/21
- Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer"., Eli Zaretskii, 2017/05/22
- Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer"., Kaushal Modi, 2017/05/22
- Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer"., Alan Mackenzie, 2017/05/22
- Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer"., Kaushal Modi, 2017/05/22
Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer"., Eli Zaretskii, 2017/05/15
Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer"., Andreas Schwab, 2017/05/16
Re: Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer". [Patch], Alan Mackenzie, 2017/05/20