So we use man whatever to get usage and other info regarding the whatever command, when the relevant section of info is found, I'd like to quit the man command with the info left on screen. So I can type the next command with the referee above. But the man command quits the whole screen to recover the old screen similar to vim.
Is there a way to achieve this?
- 123
- 363
7 Answers
I believe this is not so much about man itself but rather about your pager of choice (PAGER environment variable) combined with the terminal in use.
I'm guessing your pager is probably less (typical default pager nowadays and fits with the description).
less has an option -X that may get you a behavior along the lines of what you're looking for.
-X or --no-init
Disables sending the termcap initialization and deinitialization
strings to the terminal. This is sometimes desirable if the
deinitialization string does something unnecessary, like clear‐
ing the screen.
Eg PAGER="less -X" man man could be used for testing it out, and if you find this behavior preferable you might consider setting PAGER to this value permanently.
- 36,421
If you are running less as your pager (which is very common), you don't need to deal with modifying your pager, just do I/O redirection:
man <whatever you want to man> | cat -
This will print a copy to the terminal so you can scroll up when you need it.
- 1,847
As not only less but also other text applications like vim exhibit the same extremely annoying feature, what I do is simply removing the ability for the terminal to support the involved commands from the terminfo database.
These commands are smcup and rmcup, which were designed to allow switching on and of a move where the cup command (cursor position) was allowed.
Here is a shell function I used to automatize the task, it works at least with Solaris and likely most Linux distributions :
fixterminfo()
{
(
[[ ! -d /tmp/terminfo ]] && { mkdir /tmp/terminfo || return ; }
cd /tmp/terminfo || return
TERM=xterm infocmp > xterm.src.org
sed -e 's/rmcup=[^,]*,//' -e 's/smcup=[^,]*,//' xterm.src.org > xterm.src
if diff xterm.src.org xterm.src
then
echo xterm terminfo already patched
return
fi
TERMINFO=/tmp/terminfo tic xterm.src
if [ -f /usr/share/lib/terminfo/x/xterm ] ; then
XTERM=/usr/share/lib/terminfo/x/xterm
else
if [ -f /lib/terminfo/x/xterm ] ; then
XTERM=/lib/terminfo/x/xterm
else
if [ -f /usr/share/terminfo/x/xterm ] ; then
XTERM=/usr/share/terminfo/x/xterm
else
echo xterm terminfo not found ; return
fi
fi
fi
if [ ! -f ${XTERM}.org ]
then
sudo cp ${XTERM} ${XTERM}.org || return
fi
cat /tmp/terminfo/x/xterm | sudo dd of=${XTERM}
)
}
If your terminal entry doesn't fallback to xterm, you should replace xterm by the right terminal name in the script.
- 9,031
You can pipe the output to the cat command
man man|cat
or use it instead of the default pager, as in this example which invoke man on itself:
PAGER=cat man man
- 392
- 1
- 4
Without modifying the pager, a solution with pipes that can work in most of the environments:
Examples for man ls
- Leave the entire man page in the screen
man ls | cat - Read a paginated man output, with the possibility of leaving it any time with q:
man ls | more - filter man contents with a pattern and keep matching lines in the screen:
man ls | grep somestring
- 278
- 1
- 4
- 11
Even on my servers (FreeBSD) I install X and xfce. Then I allocate a big buffer (e.g. 10 000 lines) for the terminal emulators so that I can fully scroll out the man page in one of them, and use a separate terminal instance to assemble the command. Works a treat.
- 141