git & less
For the UNIX users out there who use the git revision control system with the oldskool less pager, try adding the following to your ~/.gitconfig
file:
[core]
# search for core.pager in
# <http://www.kernel.org/pub/software/scm/git/docs/git-config.html>
# to see why we use this convoluted syntax
pager = less -$LESS -SFRX -SR +'/^---'
That’ll launch less with three options set:
-S
: chops long lines rather than folding them (personal preference),-R
: permits ANSI colour escape sequences so that git’s diff colouring still works, and+'/^---'
: sets the default search regex to^---
(find---
at the beginning of the line), so that you can easily skip to the next file in your pager with then
key.
The last one’s the handy tip. I browse commits using git diff
before committing them, and like being able to jump quickly back and forth between files. Alas, since less is a dumb pager and doesn’t understand the semantics of diff patches, we simply set the find regex to ^---
, which does what we want.
Of course, feel free to change the options to your heart’s content. See the less(1)
manpage for the gory details.
As the comment in the configuration file says, you’ll need to use the convoluted less -$LESS -SFRX
prefix due to interesting git behaviour with the LESS
environment variable:
Note that git sets the LESS environment variable to
FRSX
if it is unset when it runs the pager. One can change these settings by setting theLESS
variable to some other value. Alternately, these settings can be overridden on a project or global basis by setting thecore.pager
option. Settingcore.pager
has no affect on theLESS
environment variable behaviour above, so if you want to override git’s default settings this way, you need to be explicit. For example, to disable theS
option in a backward compatible manner, setcore.pager
to"less -+$LESS -FRX"
. This will be passed to the shell by git, which will translate the final command to"LESS=FRSX less -+FRSX -FRX"
.
(And sure, I could switch to using a different pager, but I’ve been using less for more than a decade. Yep, I know all about Emacs & Vim’s diff-mode and Changes.app. It’s hard to break old habits.)