【问题标题】:Is there an ansi escape sequence to set colors for empty areas?是否有一个 ansi 转义序列来为空白区域设置颜色?
【发布时间】:2020-06-12 12:51:00
【问题描述】:

我看过一些关于 ansi 序列的概述。在测试中,我发现前景色和背景色设置仅适用于带有文本的部分,导致一些不和谐的对比,尤其是对于语法突出显示。是否有指定非文本区域颜色/关闭此呈现行为的顺序?

我还发现提到了这两个序列,但是我发现的所有地方都指定这些是实现定义的,没有提到任何特定的语法。我尝试使用它,就好像它是一个 rgb 序列一样,没有任何影响。

\033[49
\033[39

这是我试图解决的一个例子。

这就是我想要的。 目前使用 Windows 控制台,便携式解决方案会更可取。

【问题讨论】:

  • \033[39 和 49 应该指定分别使用默认的前景色和背景色,有点像\033[0。例如,尝试echo -e "\e[31mfoo\e[39mbar",您应该会看到红色的“foo”,而默认终端颜色的“bar”。如果第一个 ANSI 转义定义了背景颜色,您将不会看到这两个部分之间有任何区别,因为 \e[39m 只会重置文本颜色
  • 啊,我明白了,我现在明白了,49 和 39 将它们的特定设置重置为默认值。给人的印象是它有一些特定的语法来指定特定的颜色。这很令人沮丧。这几乎看起来像是一个控制台渲染错误,因为更改窗口大小会稍微改变结果。换行符或制表符在使用颜色时会产生问题吗?
  • 我看不到您当前的情况/预期情况(我在一个阻止 imgur 的公司网络上,StackOverflow 使用它来托管用户上传的图像)所以我不确定我会能够为您提供更多帮助。根据我的经验,虽然富文本格式不是您想要在终端上执行的操作。这可能是可能的,但您可以肯定,这比将您的解决方案基于更适应的平台(如文本编辑器、网页、首选语言的 GUI 工具包或 IDE)要麻烦得多
  • 啊,好吧,我想我可以解释一下,它是标准的黑白 Windows 控制台。我显然得到了需要语法突出显示的部分(我正在撕掉 mvsc 的语法突出显示)。似乎尾随换行符或制表符的部分呈现标准的黑色/白色。我没有重置回默认值,它似乎只是自己做的。我的直接思考过程是,哦,可能有某种方法可以控制文本部分等特定颜色(因此我对 39 和 49 转义序列感到困惑)。
  • 在写任何文本之前在每一行上使用\e[K(从光标到行尾擦除)似乎有帮助,至少在我用cygwin打包的mintty上:echo -e "\e[41m(tab)foo(linefeed)bar"只显示foo和bar红色背景,但如果我将其更改为 echo -e "\e[41m\e[K(tab)foo(linefeed)\e[Kbar\e[0m" 我现在有两行红色背景,很可能是因为终端现在认为它必须“重绘”这些单元格。我想这不会解决窗口大小调整问题

标签: ansi-escape


【解决方案1】:

\033[39\033[49 分别用于重置文本和背景颜色。
您可以使用以下命令对其进行测试:

echo -e '\e[43m\e[31mbg&text\e[49mtext\e[39mnone'

要将背景颜色应用于整行,我发现您可以在背景颜色控制序列之后的行开头使用“行内擦除”控制序列((ESC)[K 用于基于 xterm 的终端)强制使用背景颜色重绘该行中的所有单元格:

echo -e '\e[41m\e[Kwhole line with background'

【讨论】:

    【解决方案2】:

    这不是编程问题; OP 可能需要一个教程,这使它偏离主题。也没有MCVE

    “ANSI”(更正式的ECMA-48)定义控制序列的语法并给出(通常是简洁的)描述。问题中的片段

    \033[49
    \033[39
    

    不是控制序列,因为它是不完整的。 ECMA-48 需要一个 final 字符来完成这些。根据问题中的上下文,人们知道 m 是有意的,但这是一种假设。毕竟,ECMA-48(和各种终端文档)定义了其他可能具有 39 和 49 作为参数的序列(例如 set-mode 控件)。

    现在...ECMA-48 在这方面含糊不清(且简洁),因为解释描述的方法不止一种

    Set background color to default
    

    委员会人员不想描述不同终端的细微差别。在不同的上下文中,curses(和 ncurses)库必须处理这个问题。有一些终端功能可用于此目的。 terminfo(5) 手册页提供了一些有用的信息:

    一些基本的颜色功能独立于颜色方法。这 数字能力颜色和对指定最大数量 可以同时显示的颜色和颜色对。 op (原始对)字符串将前景色和背景色重置为其 终端的默认值。 oc 字符串重置所有颜色或 颜色对到终端的默认值。一些终端 (包括许多 PC 终端仿真器)使用当前背景颜色而不是开机默认背景擦除屏幕区域; 这些应该具有布尔功能 bce

    并且还提到了与这个问题有关的不同特征:

    在某些颜色终端上,颜色会与高光发生冲突。您可以使用 ncv 功能注册这些冲突。这是一个位掩码 启用颜色时不使用的属性。对应 curses 理解的属性如下

    也就是说,行为依赖于实现,curses/ncurses 提供了一种调整终端描述以反映差异的方法。 ncurses 常见问题解答My terminal shows some uncolored spaces 中讨论了一些变化。 xterm 中使用的特定功能组合基于 Linux 控制台(请参阅discussion),这反过来又是对某些早期终端的不完美模仿,其行为可能在定义 bce 时被考虑在内ncv.

    【讨论】:

    • 你是对的,我需要一个教程,但问题是 ansi 颜色语法的描述和行为给我的印象是我错过了一些其他具有类似语法的序列来获得我追求的效果。因为我找不到文档,所以我直接去了这里,因为我 100% 确定有人会知道如何获得我想要的东西。至于一个最小的可重现示例,您只需要尝试设置背景颜色并打印一些文本行,就像图像示例中一样。如果其他人问这个问题,我会假设他们也这样做了。
    猜你喜欢
    • 2011-06-18
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2020-09-29
    • 2012-02-01
    • 2014-09-26
    相关资源
    最近更新 更多