`less` 或 `more` 是否支持 ansi 转义 `\x1b[2K` (erase_line)?

`less` 或 `more` 是否支持 ansi 转义 `\x1b[2K` (erase_line)?

基本上我想为我的终端设置动画,但由于文本太长,我需要一个寻呼机。假设我想定期更改文本颜色。是否可以?

答案1

编辑答案由冯布兰德托马斯·迪基技术上更准确。

less-r使用该选项时支持原始 ANSI 转义。它还支持在线擦除。

但您不会看到任何动画。例如:

echo -e "foo\x1b[1G\x1b[2Kbar" > test.ansi
less -r test.ansi

只会打印bar.

more默认情况下会传递 ANSI 转义,但不支持我测试过的行编辑。

也可以看看这个 Stackoverflow 回答了和less的区别moremost

答案2

清除该行与更改终端颜色只有间接关系:如果更改背景颜色,那么许多终端(Linux 控制台、rxvt、xterm 以及模仿其中之一的程序)将使用该颜色为背景的已清除区域着色。

less确实使用了一些清除操作,但没有\x1b[2K。正在阅读来源,它使用 termcap 接口使用多种功能。最相关的部分在术语信息(5)手册页:

   clr_bol                   el1    cb   Clear to beginning
                                         of line
   clr_eol                   el     ce   clear to end of line
                                         (P)

即,\x1b[K\x1b[K,分别为el1el。没有传统的 termcap 功能el2,并且(除非您告诉使用或选项less仅传递文件内容),不会发送.-r-Rless\x1b[2K

的情况也是如此more,例如,如util-linux包:它仅使用 termcap 中的功能。与 不同lessmore没有将非打印字符直接发送到终端的选项。

如果您使用-r-R选项less,您必须记住它是有限的less不知道(或不太关心)那些转义符的作用。来自手册页:

-r或者--raw-control-chars
原因“生的”要显示的控制字符。默认是使用插入符号显示控制字符;例如,control-A(八进制 001)显示为“^A”。 警告:当 -r 使用该选项时,less 不能跟踪屏幕的实际外观(因为这取决于屏幕对每种类型的控制字符的响应方式)。因此,可能会导致各种显示问题,例如长线在错误的位置被分割。

答案3

对转义序列做出反应的通常是 tty(除非正在运行的程序将其设置为不遵守它们,在这种情况下程序本身可能会这样做)。more(1)进行相当原始的屏幕重写(实际上足以写出屏幕长度的行,并等待按键),所以我猜它只是传递输入。less(1)需要备份,所以需要对屏幕进行更细致的控制。

相关内容