内容

名称

Term::ANSIColor - 使用 ANSI 转义序列为屏幕输出着色

概要

use Term::ANSIColor;
print color('bold blue');
print "This text is bold blue.\n";
print color('reset');
print "This text is normal.\n";
print colored("Yellow on magenta.", 'yellow on_magenta'), "\n";
print "This text is normal.\n";
print colored(['yellow on_magenta'], 'Yellow on magenta.', "\n");
print colored(['red on_bright_yellow'], 'Red on bright yellow.', "\n");
print colored(['bright_red on_black'], 'Bright red on black.', "\n");
print "\n";

# Map escape sequences back to color names.
use Term::ANSIColor 1.04 qw(uncolor);
my @names = uncolor('01;31');
print join(q{ }, @names), "\n";

# Strip all color escape sequences.
use Term::ANSIColor 2.01 qw(colorstrip);
print colorstrip("\e[1mThis is bold\e[0m"), "\n";

# Determine whether a color is valid.
use Term::ANSIColor 2.02 qw(colorvalid);
my $valid = colorvalid('blue bold', 'on_magenta');
print "Color string is ", $valid ? "valid\n" : "invalid\n";

# Create new aliases for colors.
use Term::ANSIColor 4.00 qw(coloralias);
coloralias('alert', 'red');
print "Alert is ", coloralias('alert'), "\n";
print colored("This is in red.", 'alert'), "\n";

use Term::ANSIColor qw(:constants);
print BOLD, BLUE, "This text is in bold blue.\n", RESET;

use Term::ANSIColor qw(:constants);
{
    local $Term::ANSIColor::AUTORESET = 1;
    print BOLD BLUE "This text is in bold blue.\n";
    print "This text is normal.\n";
}

use Term::ANSIColor 2.00 qw(:pushpop);
print PUSHCOLOR RED ON_GREEN "This text is red on green.\n";
print PUSHCOLOR BRIGHT_BLUE "This text is bright blue on green.\n";
print RESET BRIGHT_BLUE "This text is just bright blue.\n";
print POPCOLOR "Back to red on green.\n";
print LOCALCOLOR GREEN ON_BLUE "This text is green on blue.\n";
print "This text is red on green.\n";
{
    local $Term::ANSIColor::AUTOLOCAL = 1;
    print ON_BLUE "This text is red on blue.\n";
    print "This text is red on green.\n";
}
print POPCOLOR "Back to whatever we started as.\n";

描述

此模块有两个接口,一个通过 color() 和 colored(),另一个通过常量。它还提供实用程序函数 uncolor()、colorstrip()、colorvalid() 和 coloralias(),这些函数必须显式导入才能使用(参见 "概要")。

如果您在控制台命令中使用 Term::ANSIColor,请考虑支持 CLICOLOR 标准。有关更多信息,请参见 "支持 CLICOLOR"

有关 Term::ANSIColor 引入特定功能的版本以及包含这些功能的 Perl 版本,请参见 "兼容性"

支持的颜色

支持颜色的终端模拟器分为四种类型:只支持八种颜色的、支持十六种颜色的、支持 256 种颜色的和支持 24 位颜色的。此模块提供所有这些颜色的 ANSI 转义代码。这些颜色被称为 ANSI 颜色 0 到 7(正常)、8 到 15(16 色)、16 到 255(256 色)和真彩色(xterm 称为直接色)。

不幸的是,颜色 0 到 7 的解释通常取决于模拟器是否支持八种颜色或十六种颜色。只支持八种颜色的模拟器(如 Linux 控制台)将以正常亮度显示颜色 0 到 7,并忽略颜色 8 到 15,将它们与白色相同对待。支持 16 种颜色的模拟器,如 gnome-terminal,通常将颜色 0 到 7 显示为暗淡或更暗的版本,并将颜色 8 到 15 显示为正常亮度。在这些模拟器上,“正常”白色(颜色 7)通常显示为浅灰色,需要亮白色(15)才能获得真正的白色。亮黑色通常是深灰色,尽管有些终端将其显示为纯黑色。一些十六色终端模拟器还将正常黄色(颜色 3)视为橙色或棕色,并将亮黄色(颜色 11)视为黄色。

遵循十六色模拟器的常规约定,此模块为每种颜色提供一对属性。对于每种普通颜色(0 到 7),相应的亮色(8 到 15)可以通过在普通颜色名称前添加字符串 bright_ 来获得。例如,red 是颜色 1,而 bright_red 是颜色 9。背景颜色也适用:on_red 是普通颜色,on_bright_red 是亮色。在常量接口中将这些字符串大写。

不幸的是,无法知道当前模拟器是否支持超过八种颜色,这使得颜色选择变得困难。最保守的选择是只使用常规颜色,这些颜色至少在所有模拟器上显示。但是,它们在十六色终端模拟器中会显示为深色,包括大多数 UNIX X 环境中的常见模拟器。如果您知道显示器是这些模拟器之一,您可能希望使用亮色变体。更好的是,为用户提供一种方法来配置给定应用程序的颜色以适合他们的终端模拟器。

对于 256 色模拟器,此模块还提供 ansi0ansi15,它们与十六色模拟器中的颜色 0 到 15 相同,但使用 256 色转义语法,grey0grey23 从近黑色到近白色,以及一组 RGB 颜色。RGB 颜色格式为 rgbRGB,其中 RGB 是 0 到 5 之间的数字,表示红色、绿色和蓝色的强度。如果您想要所有 256 种颜色的简单名称,灰色和 RGB 颜色也可以作为 ansi16ansi255 使用。还提供了所有这些颜色的 on_ 变体。这些颜色在非 256 色终端上可能完全被忽略,或者可能被误解并产生随机行为。闪烁、斜体或粗体等其他属性可能不适用于 256 色调色板。

对于真彩色模拟器,此模块支持 rNNNgNNNbNNNon_rNNNgNNNbNNN 形式的属性,其中 NNN 的值在 0 到 255 之间。这些分别代表前景色和背景色,RGB 值由 NNN 数字给出。这些颜色在非真彩色终端上可能完全被忽略,或者可能被误解并产生随机行为。

函数接口

函数接口使用属性字符串来描述颜色和文本属性以分配给文本。识别的非颜色属性是 clear、reset、bold、dark、faint、italic、underline、underscore、blink、reverse 和 concealed。Clear 和 reset(重置为默认属性)、dark 和 faint(暗淡和饱和)、underline 和 underscore 是等效的,因此使用对您来说最直观的那个。

请注意,并非所有属性都受所有终端类型的支持,并且某些终端可能不支持这些序列中的任何一个。特别是 dark 和 faint、italic、blink 和 concealed 通常没有实现。

识别的普通前景色属性(颜色 0 到 7)是

black  red  green  yellow  blue  magenta  cyan  white

相应的亮前景色属性(颜色 8 到 15)是

bright_black  bright_red      bright_green  bright_yellow
bright_blue   bright_magenta  bright_cyan   bright_white

识别的普通背景色属性(颜色 0 到 7)是

on_black  on_red      on_green  on yellow
on_blue   on_magenta  on_cyan   on_white

识别到的明亮背景颜色属性(颜色 8 到 15)是

on_bright_black  on_bright_red      on_bright_green  on_bright_yellow
on_bright_blue   on_bright_magenta  on_bright_cyan   on_bright_white

对于 256 色终端,识别的前景色是

ansi0 .. ansi255
grey0 .. grey23

加上 rgbRGB,其中 RGB 的值从 0 到 5,例如 rgb000rgb515。类似地,识别的背景颜色是

on_ansi0 .. on_ansi255
on_grey0 .. on_grey23

加上 on_rgbRGB,其中 RGB 的值从 0 到 5。

对于真彩色终端,识别的前景色是 rRRRgGGGbBBB,其中 RRRGGGBBB 的值在 0 到 255 之间。类似地,识别的背景颜色是 on_rRRRgGGGbBBB,其中 RRRGGGBBB 的值在 0 到 255 之间。

对于上面列出的任何属性,大小写不敏感。

属性一旦设置,就会一直持续到被取消设置(通过打印属性 clearreset)。请注意这一点,否则您的属性将在脚本运行结束后仍然存在,并且人们会因为他们的提示和输入被更改为奇怪的颜色而感到非常恼火。

color(ATTR[, ATTR ...])

color() 接受任意数量的字符串作为参数,并将它们视为以空格分隔的属性列表。然后它形成并返回设置这些属性的转义序列。它不会打印出来,只是返回它,所以如果你想打印它,你必须自己打印它。这样你就可以将它保存为字符串,传递给其他东西,发送到文件句柄,或者做任何你可能想做的事情。如果给定无效的属性,color() 会抛出异常。

colored(STRING, ATTR[, ATTR ...])
colored(ATTR-REF, STRING[, STRING...])

为了帮助重置颜色,colored() 将标量作为第一个参数,将任意数量的属性字符串作为第二个参数,并返回用转义代码包裹的标量,以便在字符串之前设置请求的属性,并在字符串之后重置为正常。或者,你可以将对数组的引用作为第一个参数传递,然后该数组的内容将被视为属性和颜色代码,其余参数将被视为要着色的文本。

通常,colored() 只在字符串的开头和结尾放置属性代码,但是如果你将 $Term::ANSIColor::EACHLINE 设置为某个字符串,那么该字符串将被视为行分隔符,并且属性将在传递字符串的每一行的开头设置,并在每一行的结尾重置。如果输出包含换行符并且你使用的是背景颜色,这通常是可取的,因为跨越换行符的背景颜色通常被终端解释为为下一行提供默认背景颜色。像分页器这样的程序也可能被跨越行的属性所迷惑。通常情况下,你希望将 $Term::ANSIColor::EACHLINE 设置为 "\n" 来使用此功能。

特别是在将输出交织到标准输出和标准错误,并且没有刷新标准输出(通过 autoflush() 或设置 $|)的情况下,请考虑设置 $Term::ANSIColor::EACHLINE。如果不这样做,重置颜色的代码可能会意外地停留在标准输出缓冲区中,而不是发送到显示器,导致标准错误输出以错误的颜色显示。

uncolor(ESCAPE)

uncolor() 执行与 color() 相反的转换,将转义序列转换为与这些序列设置的属性相对应的字符串列表。uncolor() 永远不会返回 ansi16ansi255,而是更喜欢 greyrgb 名称(以及 on_ansi16on_ansi255 的类似情况)。

colorstrip(STRING[, STRING ...])

colorstrip() 从提供的字符串中删除所有颜色转义序列,在数组上下文中分别返回修改后的字符串,或在标量上下文中将它们连接在一起。它的参数不会被修改。

colorvalid(ATTR[, ATTR ...])

colorvalid() 接受与 color() 相同的属性字符串,如果所有属性都已知则返回 true,否则返回 false。

coloralias(ALIAS[, ATTR ...])

如果指定了 ATTR,则将其解释为一个空格分隔的字符串列表,这些字符串命名属性或现有别名。在这种情况下,coloralias() 为 ATTR 给出的属性集设置 ALIAS 的别名。从那时起,ALIAS 可以传递给 color()、colored() 和 colorvalid(),并将具有与 ATTR 中给出的属性序列相同的含义。此功能的一种可能的用途是为 256 色 RGB 颜色提供更有意义的名称。别名中只允许 ASCII 字母数字、._-

如果 ATTR 包含别名,这些别名将在定义时展开,其值将用于定义新的别名。这意味着,如果您根据另一个别名 B 定义别名 A,然后重新定义别名 B,则别名 A 的值不会改变。

如果未指定 ATTR,则 coloralias() 返回 ALIAS 关联的标准属性或属性(如果有),或者如果 ALIAS 不存在,则返回 undef。如果它与多个属性关联,则返回值将是一个字符串,并且属性将用空格隔开。

这与 ANSI_COLORS_ALIASES 环境变量使用的相同机制(参见下面的 "ENVIRONMENT"),但可以在运行时使用,而不仅仅是在模块加载时使用。

对 coloralias() 的后续调用,使用相同的 ALIAS 将覆盖之前的别名。没有办法删除别名。

别名不会影响 uncolor() 的返回值。

警告:别名是全局的,会影响同一进程中的所有调用者。没有办法设置仅限于特定代码块或特定对象的别名。

常量接口

或者,如果您导入 :constants,您可以直接使用以下常量

CLEAR           RESET             BOLD            DARK
FAINT           ITALIC            UNDERLINE       UNDERSCORE
BLINK           REVERSE           CONCEALED

BLACK           RED               GREEN           YELLOW
BLUE            MAGENTA           CYAN            WHITE
BRIGHT_BLACK    BRIGHT_RED        BRIGHT_GREEN    BRIGHT_YELLOW
BRIGHT_BLUE     BRIGHT_MAGENTA    BRIGHT_CYAN     BRIGHT_WHITE

ON_BLACK        ON_RED            ON_GREEN        ON_YELLOW
ON_BLUE         ON_MAGENTA        ON_CYAN         ON_WHITE
ON_BRIGHT_BLACK ON_BRIGHT_RED     ON_BRIGHT_GREEN ON_BRIGHT_YELLOW
ON_BRIGHT_BLUE  ON_BRIGHT_MAGENTA ON_BRIGHT_CYAN  ON_BRIGHT_WHITE

这些与 color('attribute') 相同,如果您更喜欢键入,可以使用它们

print BOLD BLUE ON_WHITE "Text", RESET, "\n";

print colored ("Text", 'bold blue on_white'), "\n";

(请注意,换行符是单独保留的,以避免混淆终端,如上所述,因为正在使用背景颜色。)

如果您导入 :constants256,您可以直接使用以下常量

ANSI0 .. ANSI255
GREY0 .. GREY23

RGBXYZ (for X, Y, and Z values from 0 to 5, like RGB000 or RGB515)

ON_ANSI0 .. ON_ANSI255
ON_GREY0 .. ON_GREY23

ON_RGBXYZ (for X, Y, and Z values from 0 to 5)

请注意,:constants256 不包括其他常量,因此如果您想混合使用两者,您还需要包含 :constants。您可能希望显式导入至少 RESET,例如

use Term::ANSIColor 4.00 qw(RESET :constants256);

常量接口不支持真彩色和别名。

使用常量时,如果您不想记住在每行打印的末尾添加 , RESET,您可以将 $Term::ANSIColor::AUTORESET 设置为真值。然后,如果常量后面没有逗号,显示模式将自动重置。换句话说,设置了该变量

print BOLD BLUE "Text\n";

之后将重置显示模式,而

print BOLD, BLUE, "Text\n";

不会。如果您使用背景颜色,您可能需要使用 say()(在较新的 Perl 版本中)或使用单独的 print 语句打印换行符,以避免混淆终端。

如果设置了 $Term::ANSIColor::AUTOLOCAL(见下文),它将优先于 $Term::ANSIColor::AUTORESET,后者将被忽略。

子例程接口相对于常量接口的优势在于,只有两个子例程被导出到您的命名空间中,而常量接口中则有 38 个,并且支持别名和真彩色属性。另一方面,常量接口的优势在于更好的编译时错误检查,因为在调用 color() 和 colored() 时拼写错误的颜色或属性名称直到运行时才会被捕获,而拼写错误的常量名称将在编译时被捕获。所以,用您可能并不经常使用的近二十个子例程污染您的命名空间,或者冒着因拼写错误的属性而导致愚蠢错误的风险。您的选择,毕竟 TMTOWTDI。

颜色栈

您可以导入 :pushpop 并使用 PUSHCOLOR、POPCOLOR 和 LOCALCOLOR 来维护一个颜色栈。PUSHCOLOR 接受以其参数开头的属性字符串,并将其压入属性栈。POPCOLOR 删除栈顶并恢复先前由先前 PUSHCOLOR 的参数设置的属性。LOCALCOLOR 将其参数包含在 PUSHCOLOR 和 POPCOLOR 中,以便颜色在之后重置。

如果设置了 $Term::ANSIColor::AUTOLOCAL,每个颜色常量序列将隐式地以 LOCALCOLOR 开头。换句话说,以下内容

{
    local $Term::ANSIColor::AUTOLOCAL = 1;
    print BLUE "Text\n";
}

等效于

print LOCALCOLOR BLUE "Text\n";

如果设置了 $Term::ANSIColor::AUTOLOCAL,它将优先于 $Term::ANSIColor::AUTORESET,后者将被忽略。

在使用 PUSHCOLOR、POPCOLOR 和 LOCALCOLOR 时,特别重要的是不要在常量之间放置逗号。

print PUSHCOLOR BLUE "Text\n";

将正确地将 BLUE 压入栈顶。

print PUSHCOLOR, BLUE, "Text\n";    # wrong!

不会,并且随后的弹出操作不会恢复正确的属性。PUSHCOLOR 压入其参数设置的属性,该参数通常是颜色常量的字符串。它无法询问终端当前的属性是什么。

支持 CLICOLOR

https://bixense.com/clicolors/ 提出了一个标准,用于使用两个环境变量 CLICOLOR 和 CLICOLOR_FORCE 来启用和禁用来自控制台命令的颜色输出。Term::ANSIColor 无法自动支持此标准,因为正确的操作取决于输出的目标位置,并且 Term::ANSIColor 可能在颜色应始终生成的上下文中使用,即使在环境中设置了 CLICOLOR。但是,您可以使用支持的环境变量 ANSI_COLORS_DISABLED 在您自己的程序中实现 CLICOLOR,代码如下

if (exists($ENV{CLICOLOR}) && $ENV{CLICOLOR} == 0) {
    if (!$ENV{CLICOLOR_FORCE}) {
        $ENV{ANSI_COLORS_DISABLED} = 1;
    }
}

如果您使用的是常量接口,请确保在使用任何颜色常量之前(例如在脚本的最顶部)包含此代码,因为此环境变量仅在第一次看到颜色常量时才生效。

请注意,这也会将 ANSI_COLORS_DISABLED 导出到程序的任何子进程。

诊断

颜色映射错误 %s

(W) 从 ANSI_COLORS_ALIASES 指定的颜色映射无效,无法解析。它被忽略了。

错误的转义序列 %s

(F) 您向 uncolor() 传递了无效的 ANSI 转义序列。

使用 "strict subs" 时不允许裸词 "%s"

(F) 您可能误输入了常量颜色名称,例如

$Foobar = FOOBAR . "This line should be blue\n";

@Foobar = FOOBAR, "This line should be blue\n";

这只会出现在使用 strict 模式下(另一个使用 strict 模式的充分理由)。

无法为标准颜色 %s 设置别名

(F) 传递给 coloralias() 的别名与标准颜色名称匹配。标准颜色名称不能设置别名。

无法在 %s 中为标准颜色 %s 设置别名

(W) 相同,但在 ANSI_COLORS_ALIASES 中。颜色映射被忽略了。

无效的别名 %s

(F) 您向 coloralias() 传递了无效的别名。别名必须仅包含字母数字、.-_

在 %s 中无效的别名 %s

(W) 您在 ANSI_COLORS_ALIASES 中颜色映射的等号左侧指定了无效的别名。颜色映射被忽略了。

无效的属性名称 %s

(F) 您向 color()、colored() 或 coloralias() 传递了无效的属性名称。

在 %s 中无效的属性名称 %s

(W) 您在 ANSI_COLORS_ALIASES 中颜色映射的等号右侧指定了无效的属性名称。颜色映射被忽略。

名称 "%s" 仅使用一次:可能是拼写错误

(W) 您可能误输入了常量颜色名称,例如

print FOOBAR "This text is color FOOBAR\n";

最好在常量名称后始终使用逗号,以强制执行下一个错误。

文件句柄后不允许使用逗号

(F) 您可能误输入了常量颜色名称,例如

print FOOBAR, "This text is color FOOBAR\n";

生成此致命编译错误是使用常量接口的主要优势之一,因为您将立即知道是否误输入了颜色名称。

转义序列 %s 没有名称

(F) 传递给 uncolor() 的 ANSI 转义序列包含无法识别且无法转换为名称的转义符。

环境

ANSI_COLORS_ALIASES

此环境变量允许用户指定自定义颜色别名,这些别名将被 color()、colored() 和 colorvalid() 理解。其他函数都不会受到影响,也不会创建新的颜色常量。自定义颜色是现有颜色名称的别名;不能引入新的转义序列。别名中只允许使用字母数字、._-

格式为

ANSI_COLORS_ALIASES='newcolor1=oldcolor1,newcolor2=oldcolor2'

空格将被忽略。别名值可以是单个属性或以空格分隔的属性列表。

例如,Solarized 颜色可以使用以下方式映射

ANSI_COLORS_ALIASES='\
    base00=bright_yellow, on_base00=on_bright_yellow,\
    base01=bright_green,  on_base01=on_bright_green, \
    base02=black,         on_base02=on_black,        \
    base03=bright_black,  on_base03=on_bright_black, \
    base0=bright_blue,    on_base0=on_bright_blue,   \
    base1=bright_cyan,    on_base1=on_bright_cyan,   \
    base2=white,          on_base2=on_white,         \
    base3=bright_white,   on_base3=on_bright_white,  \
    orange=bright_red,    on_orange=on_bright_red,   \
    violet=bright_magenta,on_violet=on_bright_magenta'

加载 Term::ANSIColor 模块时会读取并应用此环境变量,然后将其忽略。加载模块后对 ANSI_COLORS_ALIASES 的更改将无效。有关可在运行时使用的等效功能,请参阅 coloralias()。

ANSI_COLORS_DISABLED

如果此环境变量设置为真值,则此模块定义的所有函数(color()、colored() 和所有常量)都不会输出任何转义序列,而是只返回空字符串或按需传递原始文本。这旨在支持在不支持 ANSI 转义序列的平台上轻松使用使用此模块的脚本。

NO_COLOR

如果此环境变量设置为任何值,它将抑制转义序列的生成,就像 ANSI_COLORS_DISABLED 设置为真值一样。这实现了 https://no-color.org/ 非正式标准。希望在设置 NO_COLOR 后启用颜色的程序需要在使用此模块提供的任何常量或函数之前取消设置该环境变量。

兼容性

Term::ANSIColor 最初包含在 Perl 5.6.0 中。

uncolor() 函数和对 ANSI_COLORS_DISABLED 的支持是在 Term::ANSIColor 1.04 中添加的,包含在 Perl 5.8.0 中。

对 dark 的支持是在 Term::ANSIColor 1.08 中添加的,包含在 Perl 5.8.4 中。

颜色栈,包括:pushpop导入标签、PUSHCOLOR、POPCOLOR、LOCALCOLOR和$Term::ANSIColor::AUTOLOCAL变量,是在Term::ANSIColor 2.00中添加的,包含在Perl 5.10.1中。

colorstrip()是在Term::ANSIColor 2.01中添加的,而colorvalid()是在Term::ANSIColor 2.02中添加的,两者都包含在Perl 5.11.0中。

对颜色8到15(bright_变体)的支持是在Term::ANSIColor 3.00中添加的,包含在Perl 5.13.3中。

对斜体的支持是在Term::ANSIColor 3.02中添加的,包含在Perl 5.17.1中。

对颜色16到256(ansirgbgrey颜色)、:constants256导入标签、coloralias()函数以及对ANSI_COLORS_ALIASES环境变量的支持是在Term::ANSIColor 4.00中添加的,包含在Perl 5.17.8中。

在Term::ANSIColor 4.00中,包含在Perl 5.17.8中,$Term::ANSIColor::AUTOLOCAL被更改为优先于$Term::ANSIColor::AUTORESET,而不是相反。

ansi16ansi255,作为rgbgrey颜色的别名,以及相应的on_ansi名称和ANSION_ANSI常量是在Term::ANSIColor 4.06中添加的,包含在Perl 5.25.7中。

对真彩色(rNNNgNNNbNNNon_rNNNgNNNbNNN属性)、根据其他别名定义别名以及别名映射到多个属性而不是仅单个属性的支持是在Term::ANSIColor 5.00中添加的。

对NO_COLOR的支持是在Term::ANSIColor 5.01中添加的。

限制

colored()和许多颜色常量的使用都会在换行符后添加重置转义序列。如果程序将彩色输出到标准输出与输出到标准错误混合,这会导致标准错误文本具有错误的颜色,因为重置转义序列尚未刷新到显示器(因为默认情况下,终端的标准输出是行缓冲的)。为了避免这种情况,要么在STDOUT上设置autoflush(),要么将$Term::ANSIColor::EACHLINE设置为"\n"

如果可以完全省略常量周围的逗号,只说

print BOLD BLUE ON_WHITE "Text\n" RESET;

但 Perl 的语法不允许这样做。你需要在字符串后面加一个逗号。(当然,你可能认为在所有常量之间不需要逗号是一个错误,在这种情况下,你可以随意插入逗号,除非你使用的是 $Term::ANSIColor::AUTORESET 或 PUSHCOLOR/POPCOLOR。)

为了便于调试,你可能更喜欢在不设置 $Term::ANSIColor::AUTORESET 或 PUSHCOLOR/POPCOLOR 时始终使用逗号,这样你将得到一个致命的编译错误而不是警告。

无法使用此模块通过 Perl 格式嵌入格式和颜色属性。它们将转义字符替换为空格(如 perlform(1) 中所述),导致从无法识别的属性中产生乱码输出。即使有办法解决这个问题,格式也不知道非打印转义序列是零长度的,并且会错误地格式化输出。对于使用颜色或其他属性的格式化输出,可以使用 sprintf() 代替,或者使用 formline(),然后在格式化后和输出之前添加颜色或其他属性。

注释

此模块生成的代码是标准终端控制代码,符合 ECMA-048 和 ISO 6429(通常称为“ANSI 颜色”以表示颜色代码)。非颜色控制代码(粗体、暗色、斜体、下划线和反转)是早期 ANSI X3.64 标准的一部分,用于视频终端和外设的控制序列。

请注意,并非所有显示器都符合 ISO 6429,甚至不符合 X3.64(或者甚至试图这样做)。此模块在不遵守这些转义序列的显示器上将无法按预期工作,例如 Windows NT 或 Windows 2000 下的 cmd.exe、4nt.exe 和 command.com。它们可能被忽略,或者可能显示为 ESC 字符后跟一些明显的垃圾。

Jean Delvare 提供了以下不同常见终端模拟器及其对各种属性的支持的表格,其他人帮助我完善了它。

             clear    bold     faint   under    blink   reverse  conceal
------------------------------------------------------------------------
xterm         yes      yes      no      yes      yes      yes      yes
linux         yes      yes      yes    bold      yes      yes      no
rxvt          yes      yes      no      yes  bold/black   yes      no
dtterm        yes      yes      yes     yes    reverse    yes      yes
teraterm      yes    reverse    no      yes    rev/red    yes      no
aixterm      kinda   normal     no      yes      no       yes      yes
PuTTY         yes     color     no      yes      no       yes      no
Windows       yes      no       no      no       no       yes      no
Cygwin SSH    yes      yes      no     color    color    color     yes
Terminal.app  yes      yes      no      yes      yes      yes      yes

Windows 是 Windows telnet,Cygwin SSH 是 Windows NT 上 Cygwin 下的 OpenSSH 实现,Mac Terminal 是 Mac OS X 中的 Terminal 应用程序。如果条目不是 yes 或 no,则该模拟器将以其他方式显示给定的属性。请注意,在 aixterm 上,clear 不会重置颜色;你必须显式地将颜色设置回你想要的颜色。欢迎在表格中添加更多条目。

代码 3(斜体)的支持很少见,因此在该表中没有提及。据信,所有列出的终端都不完全支持它,尽管它在 Linux 控制台中显示为绿色,但据报道 urxvt 支持它。

请注意,代码 6(快速闪烁)和 9(删除线)在 ANSI X3.64 和 ECMA-048 中有规定,但大多数显示器和模拟器并不常见地支持它们,因此此模块也不支持它们。ECMA-048 还指定了许多其他属性,包括用于字体更改、哥特体字符、双下划线、框架、圆圈和上划线的属性序列。由于这些属性都没有得到广泛支持或有用,因此此模块目前也不支持它们。

大多数现代 X 终端模拟器支持 256 色。已知不支持这些颜色的有 aterm、rxvt、Terminal.app 和 TTY/VC。

有关各种终端模拟器中真彩色支持的信息,请参阅 真彩色支持

作者

最初的想法(使用常量)由 Zenin 提出,由 Russ Allbery <[email protected]> 使用子例程重新实现,然后由 Russ 结合了 Zenin 的意见。256 色支持基于 Kurt Starsinic 的工作。Russ Allbery 现在维护此模块。

PUSHCOLOR、POPCOLOR 和 LOCALCOLOR 由 openmethods.com 语音解决方案贡献。

版权和许可

版权 1996-1998, 2000-2002, 2005-2006, 2008-2018, 2020 Russ Allbery <[email protected]>

版权 1996 Zenin

版权 2012 Kurt Starsinic <[email protected]>

本程序是自由软件;您可以根据与 Perl 本身相同的条款重新发布和/或修改它。

另请参阅

CPAN 模块 Term::ExtendedColor 为 256 色模拟器提供了一个不同的、更全面的接口,可能更方便。CPAN 模块 Win32::Console::ANSI 在 Win32 控制台环境中提供 ANSI 颜色(和其他转义序列)支持。CPAN 模块 Term::Chrome 使用对象和运算符重载提供不同的接口。

ECMA-048 可在线获取(至少在撰写本文时),网址为 https://www.ecma-international.org/publications/standards/Ecma-048.htm

ISO 6429 可从 ISO 获得,需付费;本模块作者没有副本。由于 ISO 6429 的源材料是 ECMA-048,而后者可免费获得,因此似乎没有理由获取 ISO 标准。

256 色控制序列在 https://invisible-island.net/xterm/ctlseqs/ctlseqs.html 中有记录(搜索 256 色)。

有关各种终端模拟器中真彩色支持的信息以及可用于检查终端模拟器中真彩色支持的测试程序,请访问 https://gist.github.com/XVilka/8346728

CLICOLORSNO_COLOR 是任何使用颜色的应用程序都应该了解并遵循的有用标准。Term::ANSIColor 符合后者。

本模块的当前版本始终可在其网站 https://www.eyrie.org/~eagle/software/ansicolor/ 上获得。它也是 Perl 核心发行版的一部分,从 5.6.0 版本开始。