git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] pager: set LV=-c alongside LESS=FRSX

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 7, 2014, 17:00 UTC
Message-ID
<xmqqha9fg225.fsf@gitster.dls.corp.google.com>
In-Reply-To
<20140107021404.GK3881@google.com>
Jonathan Nieder <jrnieder@gmail.com> writes:
Show 32 quoted lines
> On systems with lv configured as the preferred pager (i.e.,
> DEFAULT_PAGER=lv at build time, or PAGER=lv exported in the
> environment) git commands that use color show control codes instead of
> color in the pager:
>
> 	$ git diff
> 	^[[1mdiff --git a/.mailfilter b/.mailfilter^[[m
> 	^[[1mindex aa4f0b2..17e113e 100644^[[m
> 	^[[1m--- a/.mailfilter^[[m
> 	^[[1m+++ b/.mailfilter^[[m
> 	^[[36m@@ -1,11 +1,58 @@^[[m
>
> "less" avoids this problem because git uses the LESS environment
> variable to pass the -R option ('output ANSI color escapes in raw
> form') by default.  Use the LV environment variable to pass 'lv' the
> -c option ('allow ANSI escape sequences for text decoration / color')
> to fix it for lv, too.
>
> Noticed when the default value for color.ui flipped to 'auto' in
> v1.8.4-rc0~36^2~1 (2013-06-10).
>
> Reported-by: Olaf Meeuwissen <olaf.meeuwissen@avasys.jp>
> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---
> Olaf Meeuwissen wrote[1]:
>
>> Yes, it's called LV and documented in the lv(1) manual page.  Simply
>> search for 'env' ;-)
>
> Ah, thanks.  How about this patch?
>
> [1] http://bugs.debian.org/730527
Looks good; though I have to wonder two (and a half) things:
 - Scripted Porcelains get LESS=-FRSX while C Porcelains get
   LESS=FRSX as the default (the leading dash being the
   difference), which looks somewhat inconsistent.  Not a new
   problem, though.
 - Can we generalize this a bit so that a builder can pass a list
   of var=val pairs and demote the existing LESS=FRSX to just a
   canned setting of such a mechanism?
 - Can such a code be reused to make this into a runtime setting,
   even?  Would it be worth the complexity?
Thanks.
Show 93 quoted lines
>  Documentation/config.txt |  4 ++++
>  git-sh-setup.sh          |  3 ++-
>  pager.c                  | 11 +++++++++--
>  perl/Git/SVN/Log.pm      |  1 +
>  t/t7006-pager.sh         | 12 ++++++++++++
>  5 files changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/config.txt b/Documentation/config.txt
> index a405806..ed59853 100644
> --- a/Documentation/config.txt
> +++ b/Documentation/config.txt
> @@ -567,6 +567,10 @@ be passed to the shell by Git, which will translate the final
>  command to `LESS=FRSX less -+S`. The environment tells the command
>  to set the `S` option to chop long lines but the command line
>  resets it to the default to fold long lines.
> ++
> +Likewise, when the `LV` environment variable is unset, Git sets it
> +to `-c`.  You can override this setting by exporting `LV` with
> +another value or setting `core.pager` to `lv +c`.
>  
>  core.whitespace::
>  	A comma separated list of common whitespace problems to
> diff --git a/git-sh-setup.sh b/git-sh-setup.sh
> index 190a539..fffa3c7 100644
> --- a/git-sh-setup.sh
> +++ b/git-sh-setup.sh
> @@ -159,7 +159,8 @@ git_pager() {
>  		GIT_PAGER=cat
>  	fi
>  	: ${LESS=-FRSX}
> -	export LESS
> +	: ${LV=-c}
> +	export LESS LV
>  
>  	eval "$GIT_PAGER" '"$@"'
>  }
> diff --git a/pager.c b/pager.c
> index 345b0bc..0cc75a8 100644
> --- a/pager.c
> +++ b/pager.c
> @@ -80,8 +80,15 @@ void setup_pager(void)
>  	pager_process.use_shell = 1;
>  	pager_process.argv = pager_argv;
>  	pager_process.in = -1;
> -	if (!getenv("LESS")) {
> -		static const char *env[] = { "LESS=FRSX", NULL };
> +	if (!getenv("LESS") || !getenv("LV")) {
> +		static const char *env[3];
> +		int i = 0;
> +
> +		if (!getenv("LESS"))
> +			env[i++] = "LESS=FRSX";
> +		if (!getenv("LV"))
> +			env[i++] = "LV=-c";
> +		env[i] = NULL;
>  		pager_process.env = env;
>  	}
>  	if (start_command(&pager_process))
> diff --git a/perl/Git/SVN/Log.pm b/perl/Git/SVN/Log.pm
> index 3f8350a..34f2869 100644
> --- a/perl/Git/SVN/Log.pm
> +++ b/perl/Git/SVN/Log.pm
> @@ -117,6 +117,7 @@ sub run_pager {
>  	}
>  	open STDIN, '<&', $rfd or fatal "Can't redirect stdin: $!";
>  	$ENV{LESS} ||= 'FRSX';
> +	$ENV{LV} ||= '-c';
>  	exec $pager or fatal "Can't run pager: $! ($pager)";
>  }
>  
> diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh
> index ff25908..7fe3367 100755
> --- a/t/t7006-pager.sh
> +++ b/t/t7006-pager.sh
> @@ -37,6 +37,18 @@ test_expect_failure TTY 'pager runs from subdir' '
>  	test_cmp expected actual
>  '
>  
> +test_expect_success TTY 'LESS and LV envvars are set for pagination' '
> +	(
> +		sane_unset LESS LV &&
> +		PAGER="env >pager-env.out" &&
> +		export PAGER &&
> +
> +		test_terminal git log
> +	) &&
> +	grep ^LESS= pager-env.out &&
> +	grep ^LV= pager-env.out
> +'
> +
>  test_expect_success TTY 'some commands do not use a pager' '
>  	rm -f paginated.out &&
>  	test_terminal git rev-list HEAD &&
Previous: Olaf MeeuwissenNext: Andreas Schwab
Message 3 of 7 in “pager: set LV=-c alongside LESS=FRSX”
  1. pager: set LV=-c alongside LESS=FRSXJonathan Nieder, Jan 7, 2014
  2. Olaf MeeuwissenJan 7, 2014
  3. Junio C HamanoJan 7, 2014
  4. Andreas SchwabJan 7, 2014
  5. Anders KaseorgJan 30, 2014
  6. pager test: make fake pager consume all its inputJonathan Nieder, Jan 30, 2014
  7. Junio C HamanoJan 31, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.