unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Alan Mackenzie <acm@muc.de>
To: Eli Zaretskii <eliz@gnu.org>, Dani Moncayo <dmoncayo@gmail.com>
Cc: emacs-devel@gnu.org
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	[thread overview]
Message-ID: <20170517213237.GA4156@acm.fritz.box> (raw)
In-Reply-To: <20170516203759.GA5238@acm.fritz.box>

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 <acm@muc.de>

> > > 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).



  parent reply	other threads:[~2017-05-17 21:32 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-15 20:44 Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer" Alan Mackenzie
2017-05-15 23:27 ` Paul Eggert
2017-05-15 23:29   ` Drew Adams
2017-05-15 23:54 ` Kaushal Modi
2017-05-16  0:38 ` Noam Postavsky
2017-05-16  1:15   ` Clément Pit-Claudel
2017-05-16  2:47     ` Eli Zaretskii
2017-05-18  1:15   ` Perry E. Metzger
2017-05-18  4:28     ` Eli Zaretskii
2017-05-18 16:01       ` Perry E. Metzger
2017-05-18 16:18         ` Eli Zaretskii
2017-05-18 16:45           ` Perry E. Metzger
2017-05-18 19:43             ` Eli Zaretskii
2017-05-18 20:13               ` Perry E. Metzger
2017-05-18 20:25                 ` Eli Zaretskii
2017-05-18 20:51                   ` Perry E. Metzger
2017-05-19  6:17                     ` Eli Zaretskii
2017-05-22  2:22                       ` Kaushal Modi
2017-05-22  4:13                         ` Eli Zaretskii
2017-05-22 13:38                           ` Kaushal Modi
2017-05-22 18:20                             ` Alan Mackenzie
2017-05-22 18:55                               ` Kaushal Modi
2017-05-16  3:00 ` Eli Zaretskii
2017-05-16  3:35   ` Noam Postavsky
2017-05-16 20:37   ` Alan Mackenzie
2017-05-17  2:30     ` Eli Zaretskii
2017-05-17 21:32     ` Alan Mackenzie [this message]
2017-05-18 19:16       ` Dani Moncayo
2017-05-18 21:22         ` Alan Mackenzie
2017-05-19  5:32         ` Yuri Khan
2017-05-16  7:22 ` Andreas Schwab
2017-05-16 10:05   ` Dani Moncayo
2017-05-16 13:31     ` Drew Adams
2017-05-16 18:59     ` Toon Claes
2017-05-16 20:56       ` John Yates
2017-05-20 10:34 ` Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer". [Patch] Alan Mackenzie
2017-05-21 15:55   ` Difficulty applying multi-file patches from within emacs (Was: Proposal: new mode-line `%'-construct %o ..) Kaushal Modi
2017-05-21 16:04     ` Noam Postavsky
2017-05-22  1:19       ` Kaushal Modi
2017-05-22  2:35         ` Noam Postavsky
2017-05-21 16:08     ` Difficulty applying multi-file patches from within emacs Alan Mackenzie
2017-05-21 17:20       ` Philipp Stephani
2017-05-21 17:39         ` Alan Mackenzie
2017-05-22  1:21           ` Kaushal Modi
2017-05-22  1:23             ` Kaushal Modi
2017-05-23 11:21     ` Difficulty applying multi-file patches from within emacs (Was: Proposal: new mode-line `%'-construct %o ..) Tino Calancha
2017-05-23  8:00   ` Proposal: new mode-line `%'-construct %o meaning "Degree of travel of window through buffer". [Patch] Dani Moncayo
2017-05-23 20:24     ` Alan Mackenzie
2017-05-24 10:45       ` Dani Moncayo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170517213237.GA4156@acm.fritz.box \
    --to=acm@muc.de \
    --cc=dmoncayo@gmail.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).