Re: Recent change in less(1)

From: Daniel Eischen <deischen_at_freebsd.org>
Date: Tue, 7 Aug 2007 09:41:03 -0400 (EDT)
On Tue, 7 Aug 2007, Ted Lindgreen wrote:

> Hi,
>
> The recent change in the behaviour of less(1)
>
> <ted_at_alpha:2> rcsdiff -u -r1.9 -r1.10 /home/ncvs/src/contrib/less/main.c,v
> ===================================================================
> RCS file: /home/ncvs/src/contrib/less/main.c,v
> retrieving revision 1.9
> retrieving revision 1.10
> diff -u -r1.9 -r1.10
> --- main.c      2007/06/23 15:28:00     1.9
> +++ main.c      2007/08/04 13:16:09     1.10
> _at__at_ -165,7 +165,7 _at__at_
>                quit(QUIT_OK);
>        }
>
> -       if (less_is_more && get_quit_at_eof())
> +       if (less_is_more || get_quit_at_eof())
>                no_init = quit_if_one_screen = TRUE;
>
> wonders me a little.
>
> Is this really the desired behaviour?

Yes, I believe so.  This change in less/screen.c:

$ cvs diff -u -r1.7 -r1.8 screen.c
...

-       /*
-        * This loses for terminals with termcap entries with ti/te strings
-        * that switch to/from an alternate screen, and we're in quit_at_eof
-        * (eg, more(1)).
-        */
-       if (!quit_at_eof && !less_is_more) {
-               sc_init = ltgetstr("ti", &sp);
-               sc_deinit = ltgetstr("te", &sp);
-       }
-
+       sc_init = ltgetstr("ti", &sp);
         if (sc_init == NULL)
                 sc_init = "";

+       sc_deinit= ltgetstr("te", &sp);
         if (sc_deinit == NULL)
                 sc_deinit = "";

and this change in less/main.c:

$ cvs -R diff -u -r1.8 -r1.9 main.c
...

  extern int     missing_cap;
  extern int     know_dumb;
  extern int     quit_if_one_screen;
+extern int     no_init;
  extern int     pr_type;


_at__at_ -165,7 +166,7 _at__at_
         }

         if (less_is_more && get_quit_at_eof())
-               quit_if_one_screen = TRUE;
+               no_init = quit_if_one_screen = TRUE;

attempted to keep historical more(1) behavior, but it didn't work correctly.
Boolean algebra:

   (!A && !B) == !(A || B)

So (!quit_at_eof && !less_is_more) == !(less_is_more || get_quit_at_eof()).

> If so I have a question: how to obtain the former behaviour of the -e
> switch, i.e. quit when EOF is hit twice always (thus whether or not
> when the file happens to fit on a single page)?

Perhaps:

 	if (less_is_more) {
 		no_init = TRUE;
 		if (get_quit_at_eof())
 			quit_if_one_screen = TRUE;
 	}

-- 
DE
Received on Tue Aug 07 2007 - 11:52:46 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:15 UTC