Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save textarcana/4611277 to your computer and use it in GitHub Desktop.
Save textarcana/4611277 to your computer and use it in GitHub Desktop.
2020 update: just use bat(1) instead!!!! bat has git integration and also can show invisible characters! OLD STUFF: How to enable syntax-highlighting in less. Use `less -N` (or type -N while in less) to enable line numbers. Based on the procedure described in http://superuser.com/questions/71588
# Enable syntax-highlighting in less.
# Last tested on CentOS 6.3.
#
# First, add these two lines to ~/.bashrc
# export LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s"
# export LESS=" -R "
sudo yum -y install boost boost-devel ctags
wget http://springdale.math.ias.edu/data/puias/unsupported/6/x86_64/source-highlight-3.1.6-3.puias6.x86_64.rpm
source-highlight-3.1.6-3.puias6.x86_64.rpm
sudo yum -y install source-highlight
# Enable syntax-highlighting in less.
#
# First, add these two lines to ~/.bashrc
# export LESSOPEN="| /opt/local/bin/src-hilite-lesspipe.sh %s"
# export LESS=" -R "
sudo port install source-highlight
@textarcana
Copy link
Author

And here's how to install source-highlight with HomeBrew (thx Kastner):

brew install source-highlight

@mfalkvidd
Copy link

Awesome!
I installed source-highlight using the cygwin installer, works great in mintty on Windows.

@akgerber
Copy link

akgerber commented Jan 8, 2014

This is great! Note that, for homebrew, the script is located at:
/usr/local/bin/src-hilite-lesspipe.sh

Copy link

ghost commented Jan 13, 2014

Neat. on mac os x I have added the following to my less setup in .bashrc

### LESS ###
# Enable syntax-highlighting in less.
# brew install source-highlight
# First, add these two lines to ~/.bashrc
export LESSOPEN="| /usr/local/bin/src-hilite-lesspipe.sh %s"
export LESS=" -R "
alias less='less -m -N -g -i -J --underline-special --SILENT'
alias more='less'

Thanks for the pointer to this. very helpful

@nachoaIvarez
Copy link

@rharriso
Copy link

A little different in on my arch ~/.zshrc

### LESS ###
# Enable syntax-highlighting in less.
# brew install source-highlight
# First, add these two lines to ~/.bashrc
export LESSOPEN="| src-hilite-lesspipe.sh %s"
export LESS=" -R "
alias less='less -m -N -g -i -J --underline-special --SILENT'
alias more='less'

@F1LT3R
Copy link

F1LT3R commented Feb 18, 2016

That's awesome.

I've set mine up with highlight (instead of source-highlight) like this:

### Terminal Syntax Highlighting

# Setup: "brew install highlight"

# Pipe Highlight to less
export LESSOPEN="| $(which highlight) %s --out-format xterm256 --line-numbers --quiet --force --style solarized-light"
export LESS=" -R"
alias less='less -m -N -g -i -J --line-numbers --underline-special'
alias more='less'

# Use "highlight" in place of "cat"
alias cat="highlight $1 --out-format xterm256 --line-numbers --quiet --force --style solarized-light"

# Setup JSON Syntax Highlighting
# Copy js.lang to json.lang with the following command
# cp "$(dirname $(brew list highlight | head -n 1))/share/highlight/langDefs/js.lang" "$(dirname $(brew list highlight | head -n 1))/share/highlight/langDefs/json.lang"

I found highlight gave me better options and control over the output.

@bezhermoso
Copy link

Thanks for sharing your config @F1LT3R!

@Fylwind
Copy link

Fylwind commented Sep 14, 2016

@F1LT3R Thanks! The Solarized color scheme of highlight is a lot better than the default of source-highlight, which had black text that was unreadable on a dark console.

@bennypowers
Copy link

for aquatic shell jockeys

# ~/.config/fish/config.fish

set hilite (which highlight)
set -x LESSOPEN "| $hilite %s --out-format xterm256 --quiet --force "
set -x LESS " -R"
# ~/.config/fish/functions/less.fish
function less
    command less -m -N -g -i -J --underline-special --SILENT $argv
end

@almereyda
Copy link

@F1LT3R Any ideas how to tell highlight also to interpret dotfiles, and only those, preferably as sh or a similar syntax?

@shelldandy
Copy link

shelldandy commented Mar 20, 2017

Actual way to make less work on fish shell since @bennypowers solution didn't work for me:

# ~/.config/fish/config.fish
# or
# ~/.config/omf/init.fish
# If you're using oh-my-fish
set hilite (which src-hilite-lesspipe.sh)
set -x LESSOPEN "| $hilite %s"
set -x LESS " -R -X -F "

@aleshivan
Copy link

aleshivan commented Sep 18, 2017

First install on Linux Mint or Ubuntu

apt-get install source-highlight

add at end of on my arch ~/.zshrc also works on ~/.bashrc

# Enable syntax-highlighting in less.
# apt-get install source-highlight
export LESSOPEN="| /usr/share/source-highlight/src-hilite-lesspipe.sh %s"
export LESS=" -R "
alias less='less -m -N -g -i -J --underline-special --SILENT'
alias more='less'

@WesleyBlancoYuan
Copy link

At last I cannot put this in /etc/profile.d/xxx.sh. I have to put these lines into ~/.bashrc to take effect. Don't know why. I am with CentOS 7 and I am with Putty.

@alexanderkjeldaas
Copy link

alexanderkjeldaas commented Mar 5, 2018

So how do I avoid only being able to see the top of the file because of:

source-highlight: The complexity of matching the regular expression exceeded predefined bounds.  Try 
refactoring the regular expression to make each choice made by the state machine unambiguous.  This 
exception is thrown to prevent "eternal" matches that take an indefinite period time to locate.

printed to stderr?

Can there be some sort of "if highlighting fails, just do a normal less"?

@gnumoksha
Copy link

@3v1n0
Copy link

3v1n0 commented Mar 11, 2019

The problem with src-hilite-lesspipe and friends is that if you use https://github.com/wofr06/lesspipe so that it opens binary files, using a such LESSOPEN breaks it.

So I've defined something like in my .bashrc:

lesscolors()
{
  env LESSOPEN='| /usr/share/source-highlight/src-hilite-lesspipe.sh %s' \
      LESS=' --RAW-CONTROL-CHARS ' \
      $(which less) $@
}

less()
{
  less=$(which less)
  has_file=false
  all_text=true

  for arg in $@; do
    if [[ "$arg" != -* ]] && [ -e "$arg" ]; then
      has_file=true
      enc=$(file -b --mime-encoding "$(realpath $arg)")

      if [[ "$enc" != *"-ascii" ]] && [ "$enc" != "utf-8" ]; then
        all_text=false
        break
      fi
    fi
  done

  if [ $has_file == true ] && [ "$all_text" == true ]; then
    less=lesscolors
  fi

  $less $@
}

It can indeed make it more complex, but it works for most of cases, so it will allow to use both default lesspipe (i.e. to open pdf or zip files) while it will colorize the text ones.

@174n
Copy link

174n commented Apr 5, 2019

echo 'good luck with that' | less

@tonatiuh
Copy link

On fish shell what worked for me was:

$ brew install source-highlight
$ vim ~/.config/fish/functions/less.fish add the following content

function less
  src-hilite-lesspipe.sh $argv | less -N
end

$ source ~/.config/fish/config.fish
$ less

@bzed
Copy link

bzed commented Jan 22, 2020

For dark displays use the esc256 style in src-hilite-lesspipe.sh:

#! /bin/bash

for source in "$@"; do
    case $source in
	*ChangeLog|*changelog) 
        source-highlight --failsafe -f esc256 --lang-def=changelog.lang --style-file=esc256.style -i "$source" ;;
	*Makefile|*makefile) 
        source-highlight --failsafe -f esc256 --lang-def=makefile.lang --style-file=esc256.style -i "$source" ;;
	*.tar|*.tgz|*.gz|*.bz2|*.xz)
        lesspipe "$source" ;;
        *) source-highlight --failsafe --infer-lang -f esc256 --style-file=esc256.style -i "$source" ;;
    esac
done

( sed 's,esc,esc256,g' will help ;)

@textarcana
Copy link
Author

2020 update I think that bat(1) replaces all of this and that one should use bat going forward instead of the less / source-highlight combo. https://github.com/sharkdp/bat#syntax-highlighting

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment