因此我们使用man whatever
来获取有关whatever
命令的使用方法和其他信息,当找到相关信息部分时,我想退出命令man
并将信息留在屏幕上。这样我就可以使用上面的裁判输入下一个命令。但该man
命令会退出整个屏幕以恢复旧屏幕,类似于vim
。有没有办法实现这一点?
答案1
我相信这与其说是有关man
,不如说是与您选择的寻呼机(PAGER
环境变量)以及正在使用的终端相结合有关。
我猜你的寻呼机可能是less
(现在典型的默认寻呼机并且符合描述)。
less
有一个选项-X
可能会让您获得符合您所寻找的行为。
-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.
例如PAGER="less -X" man man
可以用来测试它,如果你发现这种行为更可取,你可以考虑PAGER
永久设置为该值。
答案2
如果你运行 less 作为你的分页器(这很常见),你不需要修改分页器,只需进行 I/O 重定向:
man <whatever you want to man> | cat -
这会将副本打印到终端,以便您在需要时向上滚动。
答案3
由于不仅如此less
,其他文本应用程序也vim
表现出同样极其烦人的功能,我所做的只是删除终端支持来自terminfo
数据库的相关命令的能力。
这些命令是smcup
和rmcup
,旨在允许在cup
允许命令(光标位置)的移动处打开和关闭移动。
下面是我用来自动执行任务的 shell 函数,它至少适用于 Solaris 和大多数 Linux 发行版:
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}
)
}
如果您的终端条目没有回退到xterm
,您应该xterm
在脚本中用正确的终端名称替换。
答案4
无需修改寻呼机,解决方案是管道可以在大多数环境中工作:
示例man ls
- 留下整个男人屏幕上的页面
man ls | cat
- 阅读分页男人输出,可以随时将其保留问:
man ls | more
- 筛选男人用模式保存内容并在屏幕上保留匹配的行:
man ls | grep somestring