使用VT100转义序列嵌套文本修饰

时间:2014-10-23 06:40:41

标签: unix text terminal vt100 text-decoding

有没有办法嵌套VT100转义序列?例如,如果我想在红色文本中使用粗体字,如下所示:

enter image description here

有直接的方法吗?如果我执行以下操作,则第一个用于关闭粗体的\e[m也会关闭红色。

"\e[31mfoo \e[01mbar\e[m baz\e[m"

2 个答案:

答案 0 :(得分:2)

不 - 他们没有"筑巢"。通常,可以设置或重置视频模式。某些重置会影响多种模式,例如,\e[m会重置粗体,下划线,反转等。

DEC VT100实现了ANSI标准的子集,同时还提供了扩展。相应的标准已被ISO-6429淘汰,ISO-6429可作为ECMA-48使用。

仔细阅读标准可能表明其中一些标准含糊不清,即可以理解为暗示不同类型的行为。例如,SGR(设置图形再现)部分中没有可能的视频属性的枚举,以及它们如何相互关联。由于这种模糊性,存在使用" VT100转义序列的终端"它具有明显不同的颜色行为(例如参见ncurses FAQ My terminal shows some uncolored spaces)。

由于标准没有指定所有内容,我们依靠通用惯例和约定来确定终端模拟器可以做什么,以及可以开发扩展的新功能的位置标准。例如,ECMA-48没有提到广泛使用的VT100滚动功能。此外,它实际上并没有说SGR 0重置颜色。虽然现有的终端仿真器碰巧这样做,但在约定常见的早期,有可能使终端仿真器依赖不同的转义序列来重置颜色。 (xterm中的动态颜色功能就是一个例子。)

如上所述,可以提供扩展。 ECMA-48概述了私人使用(依赖于实现的)控制序列的编码。有人可以(没有人......)设计一个提供所建议功能类型的终端。如果这不能满足许多​​人的感知需求,或者使用起来很麻烦,那么它将被忽略。因为这种类型的转义序列与现有的实践不同,所以在curses和类似的库中不支持它。这会使用起来很麻烦。

这并不是说不可能提供这样的功能。作为一个例子,xterm自patch #251提供了一个功能(并入GNU屏幕),它通过添加模式来回避长期存在的检索窗口标题(被视为安全问题)的问题。保存在堆栈中。 GNU屏幕使用此功能,以便在退出时自动恢复原始窗口标题。

答案 1 :(得分:1)

\e[m重置所有图形呈现选项,包括颜色。要仅清除粗体选项,您可以使用\e[22m,但并非所有终端都支持此序列。