A Better less
— Kaushal ModiI use emacs – with a server1 and client setup – so that I
can quickly open new files in it using emacsclient
. My typical setup
is to have xterm
+ tmux
on one monitor and a single emacs(client)
frame on another. But there are times when I do not want to
shift focus from one monitor to another, like when I just need to
review some log file. So I started using an alias to emacs -nw -Q
to
quickly open log files, review, filter, and C-x C-c
.
Of course, that’s not where this post ends. An alias was no longer adequate to do what I wanted it to do more ..
I typically do my text editing in the emacs frame, while do just
non-editing actions like viewing, navigating, searching, filtering in
quick emacs sessions from tmux
.
I wanted that “tmux emacs” to be independent of my config, independent
of the server – Just something really quick that I can launch, do,
and quit. I wanted something like less
, but better .. better in
these ways:
- Do syntax highlighting
- Render Org-mode files
- A better navigable man page viewer
- Dired, especially
wdired
(batch edit symbolic links, for example?)2 - Show colored diffs
- Filter log files to only show or not show lines matching a regexp
- Start auto-reverting log files when I want (like
tail -f
) - Quickly change frame and font sizes
- .. and more; basically everything that emacs has to offer!
I call it eless
and here’s a little taste of what it looks like:
Click the below image to see a GIF animation in larger size.
As a bonus:
- This script passes ShellCheck, and
- Unofficial Bash strict mode is enabled.
Try it out and let me know how you find it. As you will see,
eless
is a bash script where most of it is a string containing a
sane emacs configuration for view-mode
. I wanted eless
to be a
monolithic script, and not a multi-file setup.
eless -h | eless
Update (2017/04/25)
Thanks to the PR by Iqbal Ansari, eless
now supports
reading piped-in data even when emacs is run in terminal mode. The
solution was to:
- Always start the emacs process in a sub-shell, and
- Redirect
/dev/tty
into that emacs instance.
That way, that emacs instance would always think that it is receiving input from tty – even when the wrapper bash script is receiving input from the pipe.