Shell Tips

From miki
Revision as of 09:50, 3 March 2011 by Mip (talk | contribs) (→‎man: color using LESS_TERMCAP)
Jump to navigation Jump to search

Color in Shell

Some tips to provide a more colorful shell experience.

  • cat with color syntax highlighting
  • Colored diff colordiff
  • Color with git
  • Preserve color with less
  • Colors in man pages (using either less or most as pager)
  • Vim-based color viewer view

cat

The example below creates a script ccat, similar to cat but with syntax highlighting (using source-highlight, ref [1]):

  • Define a script ccat:
#!/bin/bash
src-hilite-lesspipe.sh $1
  • The included less script is also nice. Add to your .bashrc:
export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
export LESS=FRX                          # At least R!

Some examples

ccat file.c
ccat file.c | less -FRX


There are some alternatives to source-highlight. For instance on Ubuntu:

colordiff

colordiff is a Perl wrapper around diff to show diff outputs in color:

colordiff file1 file2                     # Diff in colors
alias diff="colordiff -W ${COLUMNS:-130}" # Handy alias that also adds auto-width

Note that colordiff output can be piped through less, or colordiff can also take a diff as standard input:

colordiff file1 file2 | less -FSRX        # Page output
<patchfile colordiff                      # Colorize stdin

git

See Git (configuration section).

less

Use option -R to preserve ANSI color escape sequence in input:

colordiff file1 file2 | less -R       # As command-line option
export LESS=R                         # Better use env. var $LESS
colordiff file1 file2 | less          # ... no need to give -R anymore
export LESS=FRX                       # Even better
colordiff file1 file2 | less          # ... quit asap if less than 1-page

In git, less is called with the following option:

export lESS=FSRX                      # Default git options
                                      # ... F - quit if less than 1-page
                                      # ... S - truncate long lines
                                      # ... R - preserve color
                                      # ... X - don't initialize term (no clear)

man

To have colors in manpages, the simplest is to install the package most:

sudo apt-get install most

And then tell how you want to use it:

# SYSTEM-WIDE
sudo update-alternatives --config pager      # To select 'most' as default pager system-wide
# per USER - in ~/.bashrc
export PAGER=most                            # To select 'most' as default pager for that user
alias man="PAGER=most man"                   # To select 'most' only for manpages

The drawback is that most does not support the same keyboard shortcuts as less. If you still want colors in your man page, you can get the same effect with less thanks to some bash script-fu magic (see [2])

mkdir ~/.terminfo/
cd ~/.terminfo
wget http://nion.modprobe.de/mostlike.txt   # Get the new terminfo description
tic mostlike.txt                            # Compile it using terminfo entry-description compiler

Now just define the following alias in ~/.bashrc:

alias man="TERMINFO=~/.terminfo TERM=mostlike PAGER=LESS LESS=C man"     # LESS=C can be skipped or adapted

Unfortunately the supplied terminfo does not support scrolling the pages with the mousewheel as it used to. Another alternative is to give less some explicit termcap commands (see [3]):

export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;37m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'

view

view is vim front-end document reader. view can highlight syntax of files based on their filename, but also based on their content (unlike source-highlight). Use view - to view standard input:

view file.c                          # Detect .c format from filename
git diff HEAD^ | view -              # Git - Will detect diff format from content
svn diff | view -                    # Svn - idem

Pager

Manpages
  • By default uses pager -s
    • /usr/bin/pager is a symlink to /etc/alternatives/pager.
  • Overridden by env var $PAGER.
  • Overridden by env var $MANPAGER.
  • Overridden by cli option -P pager.