Can less retain colored output?

Can I get less not to monochrome its output?

E.g., the output from git diff is colored, but git diff | less is not.

Asked By: ripper234

||

Use -r (--raw-control-chars) option to less, or also -R (only ANSI escape sequences).

I have an alias for this in ~/.bashrc

alias rless='less -r'
Answered By: enzotib

Use:

git diff --color=always | less -r

--color=always is there to tell git to output color codes even if the output is a pipe (not a tty). And -r is there to tell less to interpret those color codes and other escape sequences. Use -R for ANSI color codes only.

Answered By: Stéphane Gimenez

Another option would be to enable colors and use ‘less -r’ as your pager.

git config --global color.ui true
git config --global core.pager 'less -r'

This results in

[color]
    ui = true
[core]
    pager = less -r

in your ~/.gitconfig

For more information see the Pro Git book.

Possible values for color.ui can be found in the man page of git-config. The output of man git-config | grep "color.ui$" -A8 is

color.ui
    This variable determines the default value for variables such as color.diff and
    color.grep that control the use of color per command family. Its scope will expand as
    more commands learn configuration to set a default for the --color option. Set it to
    false or never if you prefer Git commands not to use color unless enabled explicitly
    with some other configuration or the --color option. Set it to always if you want all
    output not intended for machine consumption to use color, to true or auto (this is the
    default since Git 1.8.4) if you want such output to use color when written to the
    terminal.

Just to add another version on the “use less -r“:

Use the environment variable LESS with the value r (or add r to whatever it already is)

E.g., as I use it in my .bashrc:

export LESS=-Xr

The X stops the screen from clearing when exiting less.

Answered By: MortenSickel

Also tree has an option to force colors on:

tree -C | less -r

And so on for ls:

ls -lR --color | less -r
Answered By: Antonio Bardazzi

In case anyone is interested in paging a json with jq and less it can be achieved using:

jq -C <jq args> file.json | less -R

e.g.

jq -C . file.json | less -R

Source: https://github.com/stedolan/jq/issues/764#issuecomment-95355331

Answered By: dimid

I know this is old and many have already provided the right answer but I would like to add that it is always better to use less -R and not less -r if you only need ANSI colors as -r may cause problems in displaying the characters.

From the manual:

  -r or --raw-control-chars
         Causes "raw" control characters to be displayed.   The  default
         is  to display control characters using the caret notation; for
         example, a control-A (octal 001) is displayed as  "^A".   Warn‐
         ing:  when the -r option is used, less cannot keep track of the
         actual appearance of the screen (since this depends on how  the
         screen responds to each type of control character).  Thus, var‐
         ious display problems may result,  such  as  long  lines  being
         split in the wrong place.

  -R or --RAW-CONTROL-CHARS
         Like  -r,  but only ANSI "color" escape sequences are output in
         "raw" form.  Unlike -r, the  screen  appearance  is  maintained
         correctly  in  most  cases.   ANSI "color" escape sequences are
         sequences of the form:

              ESC [ ... m
Answered By: Naheel

I believe the ultimate solution is to use unbuffer which can be found in the expect package.

In essence, you retain git diff color by running the command as follows:

unbuffer git --no-pager diff [some_file] | less -r

You have to use --no-pager as otherwise the command hangs.

I’d have liked to take credit for this but jcubic got there long before me.

Answered By: AnthonyK

I was looking for a way to achieve this for yq to parse YAML files because I have to work with large YAML files on a daily basis. A quick look at the man yq confirmed that -C flag is also available for yq. The following worked for me.

kustomize build k8s/overlays/dev | yq eval -C | less -r

I added and alias in my ~/.zshrc file for convenience

alias yqlc='yq eval -C | less -r'

Now

kustomize build k8s/overlays/dev | yqlc

works like a charm.

Answered By: Md Zannatul Ferdous

Thanks @gerald-senarclens-de-grancy

Gerald answer

Helped me a lot. I only change less -rby more, this keep changes on terminal.

git config --global color.ui true
git config --global core.pager 'more'

This results in

[color]
    ui = true
[core]
    pager = more

Answered By: DEV Tiago França
Categories: Answers Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.