彩色端子输出不会复位

Ale*_*tar 5 c linux terminal stdio

在编写更大的程序时,我偶然发现了彩色文本输出的小问题.这是一个更简单的程序,可以重现这个问题.

#include <stdio.h>

#define COL_RESET "\033[0m"
#define COL_BG_RED  "\x1B[41m"

char *str = "the quick brown fox jumped over the lazy dog";

int main(int argc, char *argv[])
{
    int i = 10;
    while (i) {
        puts(COL_BG_RED);
        puts(str);
        puts(COL_RESET);
        puts(str);
        i--;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在这是我运行程序时得到的:

第一次 - 预期的结果

第一次

第二次

在此输入图像描述

如您所知,即使重置红色后,程序也会决定随机打印行.在新终端中启动时,它始终打印预期结果.除非我跑clear,否则无法保证输出不会像第二张图片那样受损.

在我正在使用的图片中xterm,虽然其他终端做同样的事情.

我该怎么做才能防止这种情况发生?

Tho*_*key 3

正如所评论的,这是一些知名终端的已知行为:滚动(或反向滚动)时,屏幕上新清除的区域将填充当前背景颜色。Linux 控制台就是这样做的(除了几年前的一个小故障,在终端数据库中指出)。 xterm 做到了

在 ncurses 中,几个相关的行为被集中在一起作为bce(背景颜色擦除)功能:

  • 填充由于滚动而新清除的行
  • 擦除显示,以及擦除以光标结尾或开始的部分。
  • 删除一行,或者删除光标到行尾的部分
  • 在光标位置插入(空白)
  • 删除一个字符

通常,ncurses 会填充空白(只有当终端条目选择不当时才会出现问题),并且您不会看到这一点。但使用简单的转义序列意味着您可以探索bce一些细微差别。

直接使用转义序列打印颜色的终端应用程序应在写入任何其他不打算着色的文本之前重置颜色。其他应用程序(例如 shell 中的行编辑)在删除行内的文本时必须牢记此规则