Recently I got around to configuring less, and I found these few tricks:
Sometimes I look at lists with
less, and then do things step-by-step, keeping the current action at the top of the page. This works nicely until you end up at the last page of the file, because you can’t scroll down. Then you lose track of where you are at and get confused.It would be much nicer scrolling down, and filling up the buffer with
~after the end of file, just as if you had searched in the pager.Actually, with
ESC-SPC, you can move a full page down, filling up the buffer with~. Toying around a bit, you’ll find out that you can set the “page length” with a prefix, i.e.1 ESC-SPCwill move down one line only!However, this is still inconvenient to type all the time, thus let’s define a keybinding. For this, create a file
~/.lesskeywhere we will put the key definitions. This file then will be compiled usinglesskey(1)and generate a binary configuration file~/.less. (I guess you can be lucky thatm4is not involved in this mess…)One problem is actually binding the key. You can easily bind the cursor down key (
\kd) toforw-screen-force, but how do you pass 1? The canonical hack is to use thenoactionaction, which will behave just like you’ve typed the keys after it. Thus, we write:#command \kd noaction 1\e\40 j noaction 1\e\40That
#commandis important to telllesskeyyou are defining key commands.Finally, scrolling bliss!
Actually, scrap that.
The badly underdocumented keys
J(andK) will scroll how I want, but you only read about that in the example insidelesskey(1). Therefore, we can just do:#command \kd forw-line-force j forw-line-forceThese keybindings are there since at least 1997 and I’ve never found them before…
While we are redefining keys, I’ve always found it a bit clumsy to read multiple files, having to type
:nand:p. Using[and]is much more convenient (at least on a US keyboard), and by default these keys do things of questionable utility.#command [ prev-file ] next-fileDid you ever wish to give feedback from
less? Like have a script output some info, and you decide how to go on? Sincelessalways exits with status 0 usually, this I thought this was tricky to do, but thequitaction actually can return an arbitrary exit code, encoded as character.I bound
Qand:cq(like in vim) to exit with status 1:#command Q quit \1 :cq quit \1Now you can do stuff like look at all files and have them deleted when you press
Q:for f in *; do less $f || rm $f; doneI use
lessa lot to look at patches,git logoutput and ocassionally, mailboxes. TheDcommand as defined below will move to the next line starting withdifforcommitorFromā£.#command D noaction j/\^diff|commit|From \n\euIt will also “type”
ESC-uto hide the highlighting. Now I can simply pressDto jump to the next chunk.Back in the old days of X11R2(?) there was a tool called
xless, which was exactly that: a pager likelessthat ran in its own X11 window. It’s quite useful. We can recreate this by combining a X11 terminal emulator and plainlesswith a smallzshsnippet:xless() { { exec {stdin}<&0 exec urxvt -e sh -c "less ${(j: :)${(qq)@}} < /dev/fd/$stdin" } &! }Watch the trick how we pass the stdin file descriptor and the file arguments!
Now you can just run
command-spitting-out-loads | xlessand the output will be shown in a new terminal.NP: Feine Sahne Fischfilet—Dreieinhalb Meter Lichtgestalt