# kludge to avoid screen cluttering by less, vim and others.



## McGeek (Jan 6, 2008)

I have written a script which leaves the screen uncluttered when finishing less.
This script is written for bash in the "good old terminal", but works well with
iTerm too. I wrote this script because less is opposite of more as less is so
much more as more is so much less.

I hope you will use this script and reap the rewards of using less while reading
textfiles, gaining from less's features, avoiding the cluttering which may have
made you disliking using less. You can make a copy of the script and modify and wrap
the script around any other characterbased program which clutters your terminal screen.

The script works by beeing placed in your ~/bin which I assume is before
/usr/bin in your $PATH where the binary less resides. You must modify the paths
in the script if they are different from that. (both the binary less, the script,
and the kludge.scr)

The script installs an interrupthandler which are triggered by changing the
windowsize. The interupthandler figures out what it must do to preserve
your screen when you exit less, and just does so, except for four characters
to the extreme left on one line. (wich may well be part of your prompt).
The interrupthandler gets its work done, by calling a kludge which are
relatively referenced in the script from your homefolder, -presumes ~/bin
- YOU MUST EDIT THE SCRIPT OTHERWISE. The configuration is like it is because
that is what it takes to make the correct things happen in bash.
I think this could have been accomplished much easier using another shell,
but most people uses bash, especially newcomers, and they deserve to have
it as easy as possible, while reaping the productivity gains laying dormant
in the Unix core, so I hope you will share the script with you liberally,
if you think it is worth the time and the work it takes to "install" it.
I hope you will give this script a try, as to make less work comfortably for you,
I have included an environment variable with all settings I like in less, which
you may modify.

Less was the first program I had that made me think "wow" back in 1986, beeing used
to the "more" command, - which was, and is so much less than less. You can for instance
invoke BBedit with a file you are viewing in less by pressing "v" if you have BBedit
specified in the $EDITOR variable. You can pipe some text to the clipboard.
Or you can pipe some lines out of a document you are viewing in less and into
a file while viewing, you can load it with multiple files, and search them all,
a programemer can make less work with tagfiles; you can have less create a logfile
of what you read and, you can even scroll backwards. All in all less is a very handy
tool which I think everybody would gain from using,in opposite to more.
Especially when it leaves the screen uncluttered.

Great care have been taken in order to make this kludge work properly.
Still I MAKE ABSOLUTELY NO WARRANTIES ABOUT WHAT_SO_EVER AND *ANYTHING*.
-USE IT AT YOUR OWN RISK.
You may do whatever you wish to do with it, aside from selling it alone, but you
are free to do whatever that you please with it, aside from distributing
malfunctioning copies or incomplete copies or tinker with the Copyright notice
in the scripts.
-------------------------------------------------- here comes the kludge for less - sends with you a tar as well. 8859 - encoded I think.

#! /bin/bash
# Less - lets us keep our screen nice even after resize, having used less or any other
# character based program - like vim, which may leave an unorderly screen.
# The fact that programs do clutter up the screen is because they probably didn't figure
# that we one day would be able to resize our terminals when they specified the standards at
# Ansi back in the 60's.

# Installing : put it together with "kludge.bash" in your $HOME/bin folder ( ~/bin ).
#	its intended to work with the bash shell under MacOsX, the binary less is supposed
# to reside in /usr/bin, if it isnt; ("which less" reveals where), adjust the path.

# less - to be placed in the ~/bin folder is the wrap around less to make it behave
# Copyright 2008 Tommy Bollman Public Domain. -No WARRANTIES ABOUT WHAT SO EVER-
# Please do modify it for other programs which need helps with its cleanup as well.
# ~ is an expansion for your home directory aka /Users/John\ Doe
# Please document your version properly if you are posting it, relieving others.

export LESS=" -I -r -f -J -S -g -M -x 4"
# -I ignore case when searching
# -r  "raw" do not preparate ctrl-chars,
# -f force open special files (may be binary) BEWARE OF ANSISEQUENCES.
# -J show status column
# -S chop long lines.
# -g highlight on last hit in the search.
# -M Most Verbose status column...
# -x 4 tabspacing = 4
# --------------------------------------  the screen handling starts here.................
ORIGLINES=$LINES

ESC=`printf "\e"`
ScreenRedraw_off=`echo -n "$ESC""[8m"`
ScreenRedraw_on=`echo -n "$ESC""[0m"`

function OkayScreen()
{
	export PS1=""   # Turns off the prompt to avoid cluttering..
	echo -n ${ScreenRedraw_off}
	CURLINES=`bash -i < ~/bin/kludge.bash `
				#    ^^^^^^^^^^^  NB! the path where kludge.bash should be placed.
	if [ $CURLINES -gt $ORIGLINES ] ; then
		TO_SKIP="$(expr "$CURLINES" '-' "$ORIGLINES")"
		if [ $TO_SKIP -lt 3 ] ; then
			TO_SKIP="$(expr "$TO_SKIP" '-' '2')"
		else
			TO_SKIP="$(expr "$TO_SKIP" '-' '1')"
		fi
		tput cuu 1				#cursor up one line
		echo -n ${ScreenRedraw_on}
		echo -n "\$####"			#restores an erased '$' making only 3 chars disappear.
		#       ^ $ = prompt - $PS1. .(I have just a dollar here but if yours is longer,
		#		you can add	the first four if it's static, and you'll loose nothing!!)
		echo -n ${ScreenRedraw_off}
		tput cud $TO_SKIP 		# move cursor to where it should be.
		echo -n ${ScreenRedraw_on}
		echo			# activate the cli at correct position.
	else
		tput cuu 2				
		echo ${ScreenRedraw_on}
	fi
}
trap OkayScreen SIGWINCH
 /usr/bin/less $@
 # ^^^^^^^^ NB! The path where the BINARY less is installed.
trap '' SIGWINCH

-------------------------------------------------------------------------------- and here is the kludge wich makes it all work!
#! /bin/bash
# kludge.scr - to be placed in the ~/bin folder is the inner workings of the bash script named less
# Copyright 2008 Tommy Bollman
PS1=""
shopt -s checkwinsize
echo $LINES


----------

