Answers:
setf
仅限于8种颜色。setaf
最多可以设置256种颜色。
(以下所有信息将特定于urxvt,因为这是我的终端机,但该信息与其他终端机相似,如果不相同)
两者setf
和setaf
提供不同的转义码。您可以在下面查看此内容:
# tput setf 2 | xxd
0000000: 1b5b 3332 6d .[32m
# tput setaf 2 | xxd
0000000: 1b5b 3338 3b35 3b32 6d .[38;5;2m
从我的urxvt(7)
手册页:
"ESC [ Pm m"
Character Attributes (SGR)
...
Pm = 30 / 40 fg/bg Black
Pm = 31 / 41 fg/bg Red
Pm = 32 / 42 fg/bg Green
Pm = 33 / 43 fg/bg Yellow
Pm = 34 / 44 fg/bg Blue
Pm = 35 / 45 fg/bg Magenta
Pm = 36 / 46 fg/bg Cyan
Pm = 37 / 47 fg/bg White
Pm = 38;5 / 48;5 set fg/bg to colour #m (ISO 8613-6)
因此,从上面的xxd
输出中,我们可以看到tput setf 2
使用了Pm = 32
,它将颜色设置为绿色。tput setaf 2
另一方面,使用Pm = 38;5
,该代表ISO 8613-6(也是绿色)中定义的颜色代码。
在ISO 8613-6中,颜色0x00-0x07与标准颜色相同,而0x08-0x0f是标准“粗体”颜色。一旦达到0x10-0xff,您就会获得新的颜色。
从维基百科窃取:
0x00-0x07: standard colors (as in ESC [ 30..37 m)
0x08-0x0f: high intensity colors (as in ESC [ 90..97 m)
0x10-0xe7: 6*6*6=216 colors: 16 + 36*r + 6*g + b (0≤r,g,b≤5)
0xe8-0xff: grayscale from black to white in 24 steps
tput
不过,似乎并没有实际使用可用的ANSI颜色序列范围。对于任何n > 7
,tput setaf n
都不会影响我终端中的文本。
tput setf 2
和tput setaf 2
是两个 .[32m
。
从手册中: man 5 terminfo
要更改Tektronix型终端上的当前前景或背景颜色,请使用setaf(设置ANSI前景)和setab(设置ANSI背景)或setf(设置前景)和setb(设置背景)。它们采用一个参数,即色号。SVr4文档仅描述了setaf / setab ; XPG4草案说: “如果终端支持ANSI转义序列来设置背景和前景,则应分别将其编码为setaf和setab。如果终端支持其他转义序列来设置背景和前景,则应将其编码为setf和。塞特, 分别。如果定义了vidputs()函数和刷新函数,则使用setaf和setab。”
因此答案是:setaf表示设置ANSI前景,即使用ANSI转义序列,而setf表示设置前景(使用ANSI以外的某些转义序列)。
两组功能对ANSI颜色列表中的红色/蓝色使用不同的顺序。
如前所述,它在ncurses terminfo手册页中进行了说明。一些历史:
setf/setb
。Sf/Sb
代码而不是setaf/setab
(和AF/AB
termcap)使用而是使用ANSI转义序列(与termcap一起使用)而不是使用具有ANSI功能的正确功能的termcap用户有些困惑。setaf/setab
可以在terminfo的历史中添加ANSI ,因为您可以从它们在功能字符串列表中的位置推断出来。请记住,这些是在几年内分阶段添加的,并且某些系统有所不同(ncurses提供了一些示例,例如Caps.hpux
让其进行编译以匹配那些系统)。这说明有用的终端描述数量很少,可用于参考。
所有这些,setf/setb
并没有立即注意到现有字符串与ANSI顺序不匹配的事实,这导致在1998年进行了一些修复,并且常见问题解答为什么红/蓝互换?。
虽然可以将8色ANSI序列扩展为16色(通过假设8-15色是0-7的较亮版本),但没有充分的理由发明一种方案来扩展setf/setb
到前16色。
terminfo(5)
,请参见随附的手册页ncurses
。