如何保持彩色终端输出,但禁用寻呼机

如何保持彩色终端输出,但禁用寻呼机

在 macOS 上,man 使用寻呼机“/usr/bin/less -is”(请参阅​​ man 的手册页)。当我输入 man 时,我看到彩色输出,我喜欢这个。但是,我更喜欢在使用 man 时使用终端的 find 命令,并将 less 的分页行为视为障碍。

如果我将寻呼机设置为猫,我就会失去颜色。

如何禁用分页,但保持着色?

答案1

如果将 man 的输出通过管道传输到另一个程序(例如 ) ,输出将显示为未格式化,但是如果您使用 hexdump 程序(例如 )cat(1)查看 的输出,您将看到它保留了其格式。catxxd(1)

man man | xxd

格式通过使用退格字符 来表示,0x08用于粗体格式和下划线。要给字符加下划线,首先打印下划线字符,然后是退格字符,将光标向后移动一个位置,然后写入要加下划线的字符。要制作粗体字符,请先写入该字符,然后将光标移回一位,然后再次写入该字符。在硬拷贝终端上的结果将具有预期的效果,但在我们的终端仿真程序中,第二个字符覆盖第一个字符,并且看起来好像没有格式化。可以使用该程序将此格式转换为您的终端使用的格式ul(1)

man man | ul

现在,当您检查此管道输出的字节编码时,您将看到决定使用的ESCterminfo/termcap 终端描述使用或不使用代码或任何其他代码。ul

man man | ul | xxd

请注意,两者都moreless控制代码转换ESC为使用户显而易见的形式,以便用户知道他正在检查的文件中是否嵌入了控制代码。如果您想要分页输出ul并让终端解释ESC代码,则必须将分页器配置为输出原始字符代码。您可以使用 或的-r-R选项来实现此目的。lessmore

man man | ul | less -r

请注意,这些选项不包含在传递给 的默认选项中less,该选项作为 调用less -is

如果您想查看ESC代码但不分页,可以使用-v的选项cat

man man | ul | cat -v

上面解释了如何恢复带下划线和粗体文本的格式,但它不输出颜色,即使less配置为输出颜色也是如此。 (请注意,less可以使用环境变量设置为输出颜色LESS_TERMCAP_*,该功能未在lessMacOS 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 代码或分页输出。

相关内容