【发布时间】:2014-10-23 06:40:40
【问题描述】:
有没有办法嵌套 VT100 转义序列?例如,如果我想在红色文本中使用粗体字,如下所示:
有直接的方法吗?如果我执行以下操作,第一个打算关闭粗体的 \e[m 也会关闭红色。
"\e[31mfoo \e[01mbar\e[m baz\e[m"
【问题讨论】:
标签: unix text terminal vt100 text-decoding
有没有办法嵌套 VT100 转义序列?例如,如果我想在红色文本中使用粗体字,如下所示:
有直接的方法吗?如果我执行以下操作,第一个打算关闭粗体的 \e[m 也会关闭红色。
"\e[31mfoo \e[01mbar\e[m baz\e[m"
【问题讨论】:
标签: unix text terminal vt100 text-decoding
不——它们不会“筑巢”。通常,可以设置或重置视频模式。一些重置会影响多种模式,例如,\e[m 会重置粗体、下划线、反转等。
DEC VT100 实现了 ANSI 标准的子集,同时还提供了扩展。相应的标准已被 ISO-6429 淘汰,现在作为 ECMA-48 提供。
仔细阅读该标准可能会发现其中一些是模棱两可的,即可以被解读为暗指不同类型的行为。例如,在 SGR(设置图形再现)部分中没有枚举可能的视频属性,以及它们如何相互关联。由于这种模糊性,存在使用“VT100 转义序列”的终端,这些终端具有明显不同的颜色行为(参见例如 ncurses 常见问题解答My terminal shows some uncolored spaces)。
由于标准没有规定所有内容,我们依靠常见的实践和约定来确定终端仿真器可以做什么,以及可以在哪里开发一个扩展的新功能 标准。例如,ECMA-48 没有提到广泛使用的 VT100 滚动功能。此外,它实际上并没有说 SGR 0 重置 color。虽然现有的终端仿真器碰巧做到了这一点,但早在约定普及之前,就有可能拥有依赖不同转义序列来重置颜色的终端仿真器。 (xterm 中的 动态颜色 功能就是一个例子)。
如上所述,可以提供扩展。 ECMA-48 概述了私人使用(依赖于实现)控制序列的编码。有人可以(没有人......)设计一个提供建议功能类型的终端。如果这不能满足许多人的感知需求,或者如果它使用起来很麻烦,它将被忽略。因为这种类型的转义序列不同于现有的实践,curses 和类似的库中不支持它。使用起来会很麻烦。
这并不是说不可能提供这样的功能。例如,xterm 自patch #251 以来提供了一项功能(并入 GNU 屏幕),通过添加保存标题的 mode 来回避检索窗口标题的长期问题(被视为安全问题)在堆栈上。 GNU 屏幕使用此功能在退出时自动恢复原始窗口标题。
【讨论】:
\e[m 重置所有图形再现选项,包括颜色。要仅清除粗体选项,您可以使用\e[22m,尽管并非所有终端都支持此序列。
【讨论】: