在 macOS 上,man 使用寻呼机“/usr/bin/less -is”(请参阅 man 的手册页)。当我输入 man 时,我看到彩色输出,我喜欢这个。但是,我更喜欢在使用 man 时使用终端的 find 命令,并将 less 的分页行为视为障碍。
如果我将寻呼机设置为猫,我就会失去颜色。
如何禁用分页,但保持着色?
答案1
如果将 man 的输出通过管道传输到另一个程序(例如 ) ,输出将显示为未格式化,但是如果您使用 hexdump 程序(例如 )cat(1)
查看 的输出,您将看到它保留了其格式。cat
xxd(1)
man man | xxd
格式通过使用退格字符 来表示,0x08
用于粗体格式和下划线。要给字符加下划线,首先打印下划线字符,然后是退格字符,将光标向后移动一个位置,然后写入要加下划线的字符。要制作粗体字符,请先写入该字符,然后将光标移回一位,然后再次写入该字符。在硬拷贝终端上的结果将具有预期的效果,但在我们的终端仿真程序中,第二个字符覆盖第一个字符,并且看起来好像没有格式化。可以使用该程序将此格式转换为您的终端使用的格式ul(1)
。
man man | ul
现在,当您检查此管道输出的字节编码时,您将看到决定使用的ESC
terminfo/termcap 终端描述使用或不使用代码或任何其他代码。ul
man man | ul | xxd
请注意,两者都more
将less
控制代码转换ESC
为使用户显而易见的形式,以便用户知道他正在检查的文件中是否嵌入了控制代码。如果您想要分页输出ul
并让终端解释ESC
代码,则必须将分页器配置为输出原始字符代码。您可以使用 或的-r
或-R
选项来实现此目的。less
more
man man | ul | less -r
请注意,这些选项不包含在传递给 的默认选项中less
,该选项作为 调用less -is
。
如果您想查看ESC
代码但不分页,可以使用-v
的选项cat
。
man man | ul | cat -v
上面解释了如何恢复带下划线和粗体文本的格式,但它不输出颜色,即使less
配置为输出颜色也是如此。 (请注意,less
可以使用环境变量设置为输出颜色LESS_TERMCAP_*
,该功能未在less
MacOS Big Sur 11.7.3 的手册页中列出,但仍然有效,并且在更新的less
文档中进行了记录,网址为https://github.com/gwsw/less/blob/919fcc8222ebbe8a25f3f81a735222b8fdc78433/less.nro.VER#L2252。据推测,与 Big Sur 一起分发的手册页less
相对于实际程序来说已经过时了。看https://www.2daygeek.com/get-display-view-colored-colorized-man-pages-linux/有关使用环境变量的一些示例LESS_TERMCAP_*
。)但是,ul
有一个-t
选项可以指定要使用的终端描述,因此我们可以创建自己的修改后的终端描述,以我们想要的方式打印粗体和下划线。以下是基于 terminfo 描述的示例 terminfo 描述xterm-256color
:
xterm-256color-manpipecolors|xterm-256color with preset colors for retaining color in piped manpages,
blink=\E[1;31m,
bold=\E[1;36m,
sgr0=\E[0m,
smso=\E[01;44;33m,
rmso=\E[0m,
smul=\E[1;32m,
rmul=\E[0m,
use=xterm-256color,
假设该文件名为,可以使用以下命令xterm-256color-manpipecolors
将其编译为:~/.terminfo
tic xterm-256color-manpipecolors
terminfo 描述可用于未分页的输出,如下所示:
man man | ul -t xterm-256color-manpipecolors
但是如果您想分页该管道的输出,您必须将分页器设置为输出原始字符:
man man | ul -t xterm-256color-manpipecolors | less -r
我们可以使用环境变量来清理它MANPAGER
,我们可以看到结果甚至在通过管道传输到 时也能工作cat
,从而避免了分页:
MANPAGER='ul -t xterm-256color-manpipecolors | less -isr' man man
MANPAGER='ul -t xterm-256color-manpipecolors | less -isr' man man | cat
如果你把
export MANPAGER='ul -t xterm-256color-manpipecolors | less -isr'
在你的~/.bashrc
所以它在 shell 开始时被调用,你可以以man
一种相当简洁的方式获得分页和非分页行为:
man man # with color and paging
man man | cat # with color and without paging
我猜测这是有效的,因为less
检查是否stdout
是 tty,如果它不是 tty,则进行硬编码以不打印 tty 代码或分页输出。