all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* Buffer size indicator on the mode line.
@ 2003-08-26 14:46 Lute Kamstra
  2003-08-28 16:53 ` Richard Stallman
  0 siblings, 1 reply; 4+ messages in thread
From: Lute Kamstra @ 2003-08-26 14:46 UTC (permalink / raw)


A user recently asked (on comp.emacs) for a buffer size indicator on
the mode line.  I liked idea and implemented it.  Similar to the
line/column number indication, I wrote a size-indication-mode that
toggles displaying the buffer size on the mode line like this

... 19% 46673 (251,5) ...

To show the size, I added `(size-indication-mode " %i")' to
`mode-line-position' and implemented the `%i'-construct for
`mode-line-format'.

Do you people think this is a nice feature?

The indicator could be improved by printing the buffer size more human
readable by using K, M, G, T, etc.  Gnulib and coreutils (fileutils)
offer this functionality through human.{c,h}, but this would add a new
library dependency.  Maybe we can just steal human.{c,h} from gnulib?


  Lute.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Buffer size indicator on the mode line.
  2003-08-26 14:46 Buffer size indicator on the mode line Lute Kamstra
@ 2003-08-28 16:53 ` Richard Stallman
  2003-08-29 10:19   ` Lute Kamstra
  0 siblings, 1 reply; 4+ messages in thread
From: Richard Stallman @ 2003-08-28 16:53 UTC (permalink / raw)
  Cc: emacs-devel

    To show the size, I added `(size-indication-mode " %i")' to
    `mode-line-position' and implemented the `%i'-construct for
    `mode-line-format'.

    Do you people think this is a nice feature?

I think it is a nice feature, thought it would be better to say
"19% of 46673" to make it clear what the number means.

However, given the shortage of mode line space, I think we should not
turn this on by default.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Buffer size indicator on the mode line.
  2003-08-28 16:53 ` Richard Stallman
@ 2003-08-29 10:19   ` Lute Kamstra
  2003-09-02  9:42     ` Lute Kamstra
  0 siblings, 1 reply; 4+ messages in thread
From: Lute Kamstra @ 2003-08-29 10:19 UTC (permalink / raw)
  Cc: emacs-devel

Richard Stallman <rms@gnu.org> writes:

>     To show the size, I added `(size-indication-mode " %i")' to
>     `mode-line-position' and implemented the `%i'-construct for
>     `mode-line-format'.
>
>     Do you people think this is a nice feature?
>
> I think it is a nice feature, thought it would be better to say
> "19% of 46673" to make it clear what the number means.

Good idea.

> However, given the shortage of mode line space, I think we should not
> turn this on by default.

That's what I had in mind.

I now implemented a human readable version as well (see patch below).
The size indicator now says "19% of 47k" instead.  I stole the
algorithm from gnulib's human.c, written by Paul Eggert and Larry
McVoy.  Is it customary to document such origins?  If yes, how?

I'd appreciate any nit-picking comments on the patch as it's the first
C-thingy I wrote for Emacs.

I'll also document the changes in the Emacs Manual and the Emacs Lisp
Reference Manual.

Regards,

  Lute.


Index: lisp/bindings.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/bindings.el,v
retrieving revision 1.121
diff -c -r1.121 bindings.el
*** lisp/bindings.el	10 Jun 2003 04:06:10 -0000	1.121
--- lisp/bindings.el	29 Aug 2003 09:37:14 -0000
***************
*** 312,317 ****
--- 312,319 ----
  
    (setq-default mode-line-position
      `((-3 . ,(propertize "%p" 'help-echo help-echo))
+       (size-indication-mode 
+        (8 ,(propertize " of %I" 'help-echo help-echo)))
        (line-number-mode
         ((column-number-mode
  	 (10 ,(propertize " (%l,%c)" 'help-echo help-echo))
Index: lisp/simple.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/simple.el,v
retrieving revision 1.617
diff -c -r1.617 simple.el
*** lisp/simple.el	17 Aug 2003 00:15:53 -0000	1.617
--- lisp/simple.el	29 Aug 2003 09:37:15 -0000
***************
*** 3454,3459 ****
--- 3454,3466 ----
  When Column Number mode is enabled, the column number appears
  in the mode line."
    :global t :group 'editing-basics :require nil)
+ 
+ (define-minor-mode size-indication-mode
+   "Toggle Size Indication mode.
+ With arg, turn Size Indication mode on iff arg is positive.  When
+ Size Indication mode is enabled, the size of the buffer appears
+ in the mode line."
+   :global t :group 'editing-basics :require nil)
  \f
  (defgroup paren-blinking nil
    "Blinking matching of parens and expressions."
Index: src/buffer.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/buffer.c,v
retrieving revision 1.436
diff -c -r1.436 buffer.c
*** src/buffer.c	19 Aug 2003 12:38:36 -0000	1.436
--- src/buffer.c	29 Aug 2003 09:37:17 -0000
***************
*** 5372,5377 ****
--- 5372,5379 ----
    %c -- print the current column number (this makes editing slower).
          To make the column number update correctly in all cases,
  	`column-number-mode' must be non-nil.
+   %i -- print the size of the buffer.
+   %I -- like %i, but use k, M, G, etc., to abbreviate.
    %p -- print percent of buffer above top of window, or Top, Bot or All.
    %P -- print percent of buffer above bottom of window, perhaps plus Top,
          or print Bottom or All.
Index: src/xdisp.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/xdisp.c,v
retrieving revision 1.843
diff -c -r1.843 xdisp.c
*** src/xdisp.c	9 Jul 2003 14:51:29 -0000	1.843
--- src/xdisp.c	29 Aug 2003 09:37:23 -0000
***************
*** 772,777 ****
--- 772,778 ----
  
  static int next_element_from_ellipsis P_ ((struct it *));
  static void pint2str P_ ((char *, int, int));
+ static void pint2hrstr P_ ((char *, int, int));
  static struct text_pos run_window_scroll_functions P_ ((Lisp_Object,
  							struct text_pos));
  static void reconsider_clip_changes P_ ((struct window *, struct buffer *));
***************
*** 15583,15588 ****
--- 15584,15698 ----
      }
  }
  
+ /* Write a null-terminated, right justified decimal and "human
+    readable" representation of the positive integer D to BUF using a
+    minimal field width WIDTH.  */
+ 
+ static const char power_letter[] =
+   {
+     0,	 /* not used */
+     'k', /* kilo */
+     'M', /* mega */
+     'G', /* giga */
+     'T', /* tera */
+     'P', /* peta */
+     'E', /* exa */
+     'Z', /* zetta */
+     'Y'	 /* yotta */
+   };
+ 
+ static void
+ pint2hrstr (buf, width, d)
+      register char *buf;
+      register int width;
+      register int d;
+ {
+   int base = 1000;
+   int amt = d;
+   int tenths = 0;
+   int exponent = 0;
+   int exponent_max = sizeof power_letter - 1;
+ 
+   char * psuffix = buf + max (width, 4);
+   char * p = psuffix;
+ 
+   /* 0 means D == AMT.TENTHS;
+      1 means AMT.TENTHS < D < AMT.TENTHS + 0.05;
+      2 means D == AMT.TENTHS + 0.05;
+      3 means AMT.TENTHS + 0.05 < D < AMT.TENTHS + 0.1.	*/
+   int rounding = 0;
+ 
+   if (base <= amt)
+     {
+       do
+ 	{
+ 	  int r10 = (amt % base) * 10 + tenths;
+ 	  int r2 = (r10 % base) * 2 + (rounding >> 1);
+ 	  amt /= base;
+ 	  tenths = r10 / base;
+ 	  rounding = (r2 < base
+ 		      ? (r2 + rounding) != 0
+ 		      : 2 + (base < r2 + rounding));
+ 	  exponent++;
+ 	}
+       while (base <= amt && exponent < exponent_max);
+ 
+       if (amt < 10)
+ 	{
+ 	  if (2 < rounding + (tenths & 1))
+ 	    {
+ 	      tenths++;
+ 	      rounding = 0;
+ 
+ 	      if (tenths == 10)
+ 		{
+ 		  amt++;
+ 		  tenths = 0;
+ 		}
+ 	    }
+ 
+ 	  if (amt < 10)
+ 	    {
+ 	      *--p = '0' + tenths;
+ 	      *--p = '.';
+ 	      tenths = rounding = 0;
+ 	    }
+ 	}
+ 
+       if (5 < tenths + (2 < rounding + (amt & 1)))
+ 	{
+ 	  amt++;
+ 
+ 	  if (amt == base && exponent < exponent_max)
+ 	    {
+ 	      exponent++;
+ 	      *--p = '0';
+ 	      *--p = '.';
+ 	      amt = 1;
+ 	    }
+ 	}
+     }
+ 
+   do
+     {
+       int digit = amt % 10;
+       *--p =  '0' + digit;
+     }
+   while ((amt /= 10) != 0);
+ 
+   if (exponent)
+     *psuffix++ = power_letter[exponent];
+ 
+   *psuffix++ = '\0';
+ 
+   for (width -= (int) (psuffix - p); width > 0; --width)
+     *--p = ' ';
+ 
+   if (p > buf)
+     while (p < psuffix)
+       *buf++ = *p++;
+ }
+ 
  /* Set a mnemonic character for coding_system (Lisp symbol) in BUF.
     If EOL_FLAG is 1, set also a mnemonic character for end-of-line
     type of CODING_SYSTEM.  Return updated pointer into BUF.  */
***************
*** 15784,15789 ****
--- 15894,15913 ----
      case 'f':
        obj = b->filename;
        break;
+ 
+     case 'i':
+       {
+ 	int size = ZV - BEGV;
+ 	pint2str (decode_mode_spec_buf, field_width, size);
+ 	return decode_mode_spec_buf;
+       }
+       
+     case 'I':
+       {
+ 	int size = ZV - BEGV;
+ 	pint2hrstr (decode_mode_spec_buf, field_width, size);
+ 	return decode_mode_spec_buf;
+       }
  
      case 'l':
        {

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Buffer size indicator on the mode line.
  2003-08-29 10:19   ` Lute Kamstra
@ 2003-09-02  9:42     ` Lute Kamstra
  0 siblings, 0 replies; 4+ messages in thread
From: Lute Kamstra @ 2003-09-02  9:42 UTC (permalink / raw)
  Cc: emacs-devel

Lute Kamstra <Lute.Kamstra@cwi.nl> writes:

> I now implemented a human readable version as well (see patch
> below).  The size indicator now says "19% of 47k" instead.  I stole
> the algorithm from gnulib's human.c, written by Paul Eggert and
> Larry McVoy.  Is it customary to document such origins?  If yes,
> how?

I rewrote the function from scratch as the gnulib function has a bug
with respect to rounding.

> I'll also document the changes in the Emacs Manual and the Emacs Lisp
> Reference Manual.

Done.

If nobody objects, I'll commit the patch in a few days.

  Lute.


Index: etc/NEWS
===================================================================
RCS file: /cvsroot/emacs/emacs/etc/NEWS,v
retrieving revision 1.846
diff -c -r1.846 NEWS
*** etc/NEWS	1 Sep 2003 18:51:17 -0000	1.846
--- etc/NEWS	2 Sep 2003 09:27:10 -0000
***************
*** 1448,1453 ****
--- 1448,1457 ----
  
  * New modes and packages in 21.4
  
+ +++
+ ** The new global minor mode `size-indication-mode' (off by default)
+ shows the size of accessible part of the buffer on the mode line.
+ 
  ** GDB-Script-mode is used for files like .gdbinit.
  
  ---
***************
*** 2483,2488 ****
--- 2487,2497 ----
  
  ** Mode line display ignores text properties in the value
  of a variable whose `risky-local-variables' property is nil.
+ 
+ +++
+ ** The new `%i' and `%I' constructs for `mode-line-format' can be used
+ to display the size of the accessible part of the buffer on the mode
+ line.
  
  ---
  ** Indentation of simple and extended loop forms has been added to the
Index: lisp/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/ChangeLog,v
retrieving revision 1.5371
diff -c -r1.5371 ChangeLog
*** lisp/ChangeLog	1 Sep 2003 21:36:56 -0000	1.5371
--- lisp/ChangeLog	2 Sep 2003 09:27:15 -0000
***************
*** 69,74 ****
--- 69,79 ----
  	* simple.el (blink-matching-open): Work correctly on chars that
  	are designated as parens through the syntax-table text property.
  
+ 2003-08-29  Lute Kamstra  <Lute.Kamstra@cwi.nl>
+ 
+ 	* simple.el (size-indication-mode): New.
+ 	* bindings.el (mode-line-position): Add buffer size indicator.
+ 
  2003-08-29  Thierry Emery <thierry.emery@club-internet.fr>  (tiny change)
  
  	* kinsoku.el (kinsoku-longer, kinsoku-shorter): Do not choose a
Index: lisp/bindings.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/bindings.el,v
retrieving revision 1.122
diff -c -r1.122 bindings.el
*** lisp/bindings.el	1 Sep 2003 15:45:08 -0000	1.122
--- lisp/bindings.el	2 Sep 2003 09:27:15 -0000
***************
*** 312,317 ****
--- 312,319 ----
  
    (setq-default mode-line-position
      `((-3 . ,(propertize "%p" 'help-echo help-echo))
+       (size-indication-mode 
+        (8 ,(propertize " of %I" 'help-echo help-echo)))
        (line-number-mode
         ((column-number-mode
  	 (10 ,(propertize " (%l,%c)" 'help-echo help-echo))
Index: lisp/simple.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/simple.el,v
retrieving revision 1.619
diff -c -r1.619 simple.el
*** lisp/simple.el	1 Sep 2003 15:45:14 -0000	1.619
--- lisp/simple.el	2 Sep 2003 09:27:17 -0000
***************
*** 3454,3459 ****
--- 3454,3466 ----
  When Column Number mode is enabled, the column number appears
  in the mode line."
    :global t :group 'editing-basics :require nil)
+ 
+ (define-minor-mode size-indication-mode
+   "Toggle Size Indication mode.
+ With arg, turn Size Indication mode on iff arg is positive.  When
+ Size Indication mode is enabled, the size of the accessible part
+ of the buffer appears in the mode line."
+   :global t :group 'editing-basics :require nil)
  \f
  (defgroup paren-blinking nil
    "Blinking matching of parens and expressions."
Index: lispref/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/lispref/ChangeLog,v
retrieving revision 1.90
diff -c -r1.90 ChangeLog
*** lispref/ChangeLog	1 Sep 2003 15:45:40 -0000	1.90
--- lispref/ChangeLog	2 Sep 2003 09:27:17 -0000
***************
*** 3,8 ****
--- 3,13 ----
  	* display.texi (Overlay Properties): Clarify how priorities
  	affect use of the properties.
  
+ 2003-08-29  Lute Kamstra  <Lute.Kamstra@cwi.nl>
+ 
+ 	* modes.texi (%-Constructs): Document new `%i' and `%I'
+ 	constructs.
+ 
  2003-08-19  Luc Teirlinck  <teirllm@mail.auburn.edu>
  
  	* customize.texi (Type Keywords): Correct the description of
Index: lispref/modes.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/lispref/modes.texi,v
retrieving revision 1.62
diff -c -r1.62 modes.texi
*** lispref/modes.texi	1 Sep 2003 15:45:41 -0000	1.62
--- lispref/modes.texi	2 Sep 2003 09:27:17 -0000
***************
*** 1481,1486 ****
--- 1481,1495 ----
  The title (only on a window system) or the name of the selected frame.
  @xref{Window Frame Parameters}.
  
+ @item %i
+ The size of the accessible part of the current buffer; basically
+ @code{(- (point-max) (point-min))}.
+ 
+ @item %I
+ Like @samp{%i}, but the size is printed in a more readable way by using
+ @samp{k} for 10^3, @samp{M} for 10^6, @samp{G} for 10^9, etc., to
+ abbreviate.
+ 
  @item %l
  The current line number of point, counting within the accessible portion
  of the buffer.
Index: man/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/man/ChangeLog,v
retrieving revision 1.212
diff -c -r1.212 ChangeLog
*** man/ChangeLog	1 Sep 2003 15:45:44 -0000	1.212
--- man/ChangeLog	2 Sep 2003 09:27:17 -0000
***************
*** 2,7 ****
--- 2,15 ----
  
  	* misc.texi (Saving Emacs Sessions): Correct previous change.
  
+ 2003-08-29  Lute Kamstra  <Lute.Kamstra@cwi.nl>
+ 
+ 	* screen.texi (Mode Line): Say that POS comes before LINE.
+ 	Mention `size-indication-mode'.
+ 	* display.texi (Optional Mode Line): Document
+ 	`size-indication-mode'.
+ 	* basic.texi (Position Info): Mention `size-indication-mode'.
+ 
  2003-08-26  Per Abrahamsen  <abraham@dina.kvl.dk>
  
  	* widget.texi (User Interface): Explain the need of static text
Index: man/basic.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/man/basic.texi,v
retrieving revision 1.37
diff -c -r1.37 basic.texi
*** man/basic.texi	1 Sep 2003 15:45:45 -0000	1.37
--- man/basic.texi	2 Sep 2003 09:27:18 -0000
***************
*** 572,577 ****
--- 572,580 ----
  @item M-x hl-line-mode
  Enable or disable highlighting of the current line.  @xref{Cursor
  Display}.
+ @item M-x size-indication-mode
+ Toggle automatic display of the size of the buffer.
+ @xref{Optional Mode Line}.
  @end table
  
  @findex what-page
Index: man/display.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/man/display.texi,v
retrieving revision 1.71
diff -c -r1.71 display.texi
*** man/display.texi	1 Sep 2003 15:45:45 -0000	1.71
--- man/display.texi	2 Sep 2003 09:27:18 -0000
***************
*** 756,768 ****
  @node Optional Mode Line
  @section Optional Mode Line Features
  
  @cindex line number display
  @cindex display of line number
  @findex line-number-mode
    The current line number of point appears in the mode line when Line
  Number mode is enabled.  Use the command @kbd{M-x line-number-mode} to
  turn this mode on and off; normally it is on.  The line number appears
! before the buffer percentage @var{pos}, with the letter @samp{L} to
  indicate what it is.  @xref{Minor Modes}, for more information about
  minor modes and about how to use this command.
  
--- 756,789 ----
  @node Optional Mode Line
  @section Optional Mode Line Features
  
+ @cindex buffer size display
+ @cindex display of buffer size
+ @findex size-indication-mode
+   The buffer percentage @var{pos} indicates the percentage of the buffer
+ above the top of the window.  You can additionally display the size of
+ the buffer by turning on Size Indication mode.  The size will be
+ displayed immediately following the buffer percentage like this:
+ 
+ @example
+ @var{POS} of @var{SIZE}
+ @end example
+ 
+ @noindent
+ Here @var{SIZE} is the human readable representation of the number of
+ characters in the buffer, which means that @samp{k} for 10^3, @samp{M}
+ for 10^6, @samp{G} for 10^9, etc., are used to abbreviate.
+ 
+ @cindex narrowing, and buffer size display
+   If you have narrowed the buffer (@pxref{Narrowing}), the size of the
+ accessible part of the buffer is shown.
+ 
  @cindex line number display
  @cindex display of line number
  @findex line-number-mode
    The current line number of point appears in the mode line when Line
  Number mode is enabled.  Use the command @kbd{M-x line-number-mode} to
  turn this mode on and off; normally it is on.  The line number appears
! after the buffer percentage @var{pos}, with the letter @samp{L} to
  indicate what it is.  @xref{Minor Modes}, for more information about
  minor modes and about how to use this command.
  
Index: man/screen.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/man/screen.texi,v
retrieving revision 1.19
diff -c -r1.19 screen.texi
*** man/screen.texi	1 Sep 2003 15:45:46 -0000	1.19
--- man/screen.texi	2 Sep 2003 09:27:18 -0000
***************
*** 189,195 ****
    Normally, the mode line looks like this:
  
  @example
! -@var{cs}:@var{ch}  @var{buf}      @var{line} @var{pos}   (@var{major} @var{minor})------
  @end example
  
  @noindent
--- 189,195 ----
    Normally, the mode line looks like this:
  
  @example
! -@var{cs}:@var{ch}  @var{buf}      @var{pos} @var{line}   (@var{major} @var{minor})------
  @end example
  
  @noindent
***************
*** 211,229 ****
  takes place in.  When we speak of what some command does to ``the
  buffer,'' we are talking about the current buffer.
  
-   @var{line} is @samp{L} followed by the current line number of point.
- This is present when Line Number mode is enabled (which it normally is).
- You can optionally display the current column number too, by turning on
- Column Number mode (which is not enabled by default because it is
- somewhat slower).  @xref{Optional Mode Line}.
- 
    @var{pos} tells you whether there is additional text above the top of
  the window, or below the bottom.  If your buffer is small and it is all
  visible in the window, @var{pos} is @samp{All}.  Otherwise, it is
  @samp{Top} if you are looking at the beginning of the buffer, @samp{Bot}
  if you are looking at the end of the buffer, or @samp{@var{nn}%}, where
! @var{nn} is the percentage of the buffer above the top of the
! window.@refill
  
    @var{major} is the name of the @dfn{major mode} in effect in the
  buffer.  At any time, each buffer is in one and only one of the possible
--- 211,230 ----
  takes place in.  When we speak of what some command does to ``the
  buffer,'' we are talking about the current buffer.
  
    @var{pos} tells you whether there is additional text above the top of
  the window, or below the bottom.  If your buffer is small and it is all
  visible in the window, @var{pos} is @samp{All}.  Otherwise, it is
  @samp{Top} if you are looking at the beginning of the buffer, @samp{Bot}
  if you are looking at the end of the buffer, or @samp{@var{nn}%}, where
! @var{nn} is the percentage of the buffer above the top of the window.
! With Size Indication mode, you can display the size of the buffer as
! well.  @xref{Optional Mode Line}.
! 
!   @var{line} is @samp{L} followed by the current line number of point.
! This is present when Line Number mode is enabled (which it normally is).
! You can optionally display the current column number too, by turning on
! Column Number mode (which is not enabled by default because it is
! somewhat slower).  @xref{Optional Mode Line}.
  
    @var{major} is the name of the @dfn{major mode} in effect in the
  buffer.  At any time, each buffer is in one and only one of the possible
***************
*** 303,310 ****
  @xref{Variables}, for an explanation of how to set variables.
  
    @xref{Optional Mode Line}, for features that add other handy
! information to the mode line, such as the current column number of
! point, the current time, and whether new mail for you has arrived.
  
  The mode line is mouse-sensitive; when you move the mouse across
  various parts of it, Emacs displays help text to say what a click in
--- 304,312 ----
  @xref{Variables}, for an explanation of how to set variables.
  
    @xref{Optional Mode Line}, for features that add other handy
! information to the mode line, such as the size of the buffer, the
! current column number of point, the current time, and whether new mail
! for you has arrived.
  
  The mode line is mouse-sensitive; when you move the mouse across
  various parts of it, Emacs displays help text to say what a click in
Index: src/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/src/ChangeLog,v
retrieving revision 1.3359
diff -c -r1.3359 ChangeLog
*** src/ChangeLog	1 Sep 2003 20:59:07 -0000	1.3359
--- src/ChangeLog	2 Sep 2003 09:27:20 -0000
***************
*** 53,58 ****
--- 53,65 ----
  
  	* abbrev.c (Fexpand_abbrev): Insert before deleting.
  
+ 2003-08-29  Lute Kamstra  <Lute.Kamstra@cwi.nl>
+ 
+ 	* xdisp.c (pint2hrstr): New function.
+ 	(decode_mode_spec): Add `%i' and `%I' specs.
+ 	* buffer.c (syms_of_buffer): Document `%i' and `%I' constructs
+ 	for `mode-line-format'.
+ 
  2003-08-29  Gerd Moellmann  <gerd@gnu.org>
  
  	* xfns.c (lookup_rgb_color): Handle TrueColor visuals specially.
Index: src/buffer.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/buffer.c,v
retrieving revision 1.437
diff -c -r1.437 buffer.c
*** src/buffer.c	1 Sep 2003 15:45:51 -0000	1.437
--- src/buffer.c	2 Sep 2003 09:27:21 -0000
***************
*** 5372,5377 ****
--- 5372,5379 ----
    %c -- print the current column number (this makes editing slower).
          To make the column number update correctly in all cases,
  	`column-number-mode' must be non-nil.
+   %i -- print the size of the buffer.
+   %I -- like %i, but use k, M, G, etc., to abbreviate.
    %p -- print percent of buffer above top of window, or Top, Bot or All.
    %P -- print percent of buffer above bottom of window, perhaps plus Top,
          or print Bottom or All.
Index: src/xdisp.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/xdisp.c,v
retrieving revision 1.846
diff -c -r1.846 xdisp.c
*** src/xdisp.c	1 Sep 2003 15:45:57 -0000	1.846
--- src/xdisp.c	2 Sep 2003 09:27:26 -0000
***************
*** 772,777 ****
--- 772,778 ----
  
  static int next_element_from_ellipsis P_ ((struct it *));
  static void pint2str P_ ((char *, int, int));
+ static void pint2hrstr P_ ((char *, int, int));
  static struct text_pos run_window_scroll_functions P_ ((Lisp_Object,
  							struct text_pos));
  static void reconsider_clip_changes P_ ((struct window *, struct buffer *));
***************
*** 15582,15587 ****
--- 15583,15699 ----
      }
  }
  
+ /* Write a null-terminated, right justified decimal and "human
+    readable" representation of the nonnegative integer D to BUF using
+    a minimal field width WIDTH.	 D should be smaller than 999.5e24. */
+ 
+ static const char power_letter[] =
+   {
+     0,	 /* not used */
+     'k', /* kilo */
+     'M', /* mega */
+     'G', /* giga */
+     'T', /* tera */
+     'P', /* peta */
+     'E', /* exa */
+     'Z', /* zetta */
+     'Y'	 /* yotta */
+   };
+ 
+ static void
+ pint2hrstr (buf, width, d)
+      char *buf;
+      int width;
+      int d;
+ {
+   /* We aim to represent the nonnegative integer D as
+      QUOTIENT.TENTHS * 10 ^ (3 * EXPONENT). */
+   int quotient = d;
+   int remainder = 0;
+   /* -1 means: do not use TENTHS. */
+   int tenths = -1;
+   int exponent = 0;
+ 
+   /* Length of QUOTIENT.TENTHS as a string. */
+   int length;
+ 
+   char * psuffix;
+   char * p;
+ 
+   if (1000 <= quotient)
+     {
+       /* Scale to the appropriate EXPONENT. */
+       do
+ 	{
+ 	  remainder = quotient % 1000;
+ 	  quotient /= 1000;
+ 	  exponent++;
+ 	}
+       while (1000 <= quotient);
+ 
+       /* Round to nearest and decide whether to use TENTHS or not. */
+       if (quotient <= 9)
+ 	{
+ 	  tenths = remainder / 100;
+ 	  if (50 <= remainder % 100)
+ 	    if (tenths < 9)
+ 	      tenths++;
+ 	    else
+ 	      {
+ 		quotient++;
+ 		if (quotient == 10)
+ 		  tenths = -1;
+ 		else
+ 		  tenths = 0;
+ 	      }
+ 	}
+       else
+ 	if (500 <= remainder)
+ 	  if (quotient < 999)
+ 	    quotient++;
+ 	  else
+ 	    {
+ 	      quotient = 1;
+ 	      exponent++;
+ 	      tenths = 0;
+ 	    }
+     }
+ 
+   /* Calculate the LENGTH of QUOTIENT.TENTHS as a string. */
+   if (tenths == -1 && quotient <= 99)
+     if (quotient <= 9)
+       length = 1;
+     else
+       length = 2;
+   else
+     length = 3;
+   p = psuffix = buf + max (width, length);
+ 
+   /* Print EXPONENT. */
+   if (exponent)
+     *psuffix++ = power_letter[exponent];
+   *psuffix = '\0';
+ 
+   /* Print TENTHS. */
+   if (tenths >= 0)
+     {
+       *--p = '0' + tenths;
+       *--p = '.';
+     }
+ 
+   /* Print QUOTIENT. */
+   do
+     {
+       int digit = quotient % 10;
+       *--p =  '0' + digit;
+     }
+   while ((quotient /= 10) != 0);
+ 
+   /* Print leading spaces. */
+   while (buf < p)
+     *--p = ' ';
+ }
+ 
  /* Set a mnemonic character for coding_system (Lisp symbol) in BUF.
     If EOL_FLAG is 1, set also a mnemonic character for end-of-line
     type of CODING_SYSTEM.  Return updated pointer into BUF.  */
***************
*** 15783,15788 ****
--- 15895,15914 ----
      case 'f':
        obj = b->filename;
        break;
+ 
+     case 'i':
+       {
+ 	int size = ZV - BEGV;
+ 	pint2str (decode_mode_spec_buf, field_width, size);
+ 	return decode_mode_spec_buf;
+       }
+ 
+     case 'I':
+       {
+ 	int size = ZV - BEGV;
+ 	pint2hrstr (decode_mode_spec_buf, field_width, size);
+ 	return decode_mode_spec_buf;
+       }
  
      case 'l':
        {

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2003-09-02  9:42 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-08-26 14:46 Buffer size indicator on the mode line Lute Kamstra
2003-08-28 16:53 ` Richard Stallman
2003-08-29 10:19   ` Lute Kamstra
2003-09-02  9:42     ` Lute Kamstra

Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.