tput setaf 颜色表?如何确定颜色代码?

tput setaf 颜色表?如何确定颜色代码?

我正在为我的终端着色PS1

tput我正在使用;设置颜色变量例如,这是紫色的:

PURPLE=$(tput setaf 125)

问题:

如何找到125其他颜色的颜色代码(例如 )?

某处有颜色表指南/备忘单吗?

我只是不确定什么125是......是否有某种方法可以获取十六进制颜色并转换为可以使用的数字setaf

答案1

可用于输入的颜色数量由 给出tput colors

setf要查看基本的 8 种颜色(在 urxvt 终端和xterm 终端中使用setaf):

$ printf '\e[%sm▒' {30..37} 0; echo           ### foreground
$ printf '\e[%sm ' {40..47} 0; echo           ### background

通常命名为:

Color       #define       Value       RGB
black     COLOR_BLACK       0     0, 0, 0
red       COLOR_RED         1     max,0,0
green     COLOR_GREEN       2     0,max,0
yellow    COLOR_YELLOW      3     max,max,0
blue      COLOR_BLUE        4     0,0,max
magenta   COLOR_MAGENTA     5     max,0,max
cyan      COLOR_CYAN        6     0,max,max
white     COLOR_WHITE       7     max,max,max

要查看扩展的 256 种颜色(如setafurxvt 中使用的):

$ printf '\e[48;5;%dm ' {0..255}; printf '\e[0m \n'

如果您想要数字和有序输出:

#!/bin/bash
color(){
    for c; do
        printf '\e[48;5;%dm%03d' $c $c
    done
    printf '\e[0m \n'
}

IFS=$' \t\n'
color {0..15}
for ((i=0;i<6;i++)); do
    color $(seq $((i*36+16)) $((i*36+51)))
done
color {232..255}

256 个按顺序排列的颜色图表,标有索引


1600 万种颜色需要相当多的代码(某些控制台无法显示这一点)。
基础知识是:

fb=3;r=255;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm▒▒▒ ' "$fb" "$r" "$g" "$b"

fbfront/back3/4.

对控制台呈现多种颜色的能力的简单测试是:

for r in {200..255..5}; do fb=4;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm   ' "$fb" "$r" "$g" "$b"; done; echo

红线,从深到浅(从左到右) 它将呈现一条红线,从左到右色调变化非常小。如果这个微小的变化是可见的,那么您的控制台可以显示 1600 万种颜色。

对于 RGB(红、绿、蓝),每个rg、 和 b都是 0 到 255 之间的值。

如果您的控制台类型支持此功能,此代码将创建一个颜色表:

mode2header(){
    #### For 16 Million colors use \e[0;38;2;R;G;Bm each RGB is {0..255}
    printf '\e[mR\n' # reset the colors.
    printf '\n\e[m%59s\n' "Some samples of colors for r;g;b. Each one may be 000..255"
    printf '\e[m%59s\n'   "for the ansi option: \e[0;38;2;r;g;bm or \e[0;48;2;r;g;bm :"
}
mode2colors(){
    # foreground or background (only 3 or 4 are accepted)
    local fb="$1"
    [[ $fb != 3 ]] && fb=4
    local samples=(0 63 127 191 255)
    for         r in "${samples[@]}"; do
        for     g in "${samples[@]}"; do
            for b in "${samples[@]}"; do
                printf '\e[0;%s8;2;%s;%s;%sm%03d;%03d;%03d ' "$fb" "$r" "$g" "$b" "$r" "$g" "$b"
            done; printf '\e[m\n'
        done; printf '\e[m'
    done; printf '\e[mReset\n'
}
mode2header
mode2colors 3
mode2colors 4

示例前景色的图表及其索引作为标签

示例背景颜色图表及其索引作为标签

要将十六进制颜色值转换为(最接近的)0-255 颜色索引:

fromhex(){
    hex=${1#"#"}
    r=$(printf '0x%0.2s' "$hex")
    g=$(printf '0x%0.2s' ${hex#??})
    b=$(printf '0x%0.2s' ${hex#????})
    printf '%03d' "$(( (r<75?0:(r-35)/40)*6*6 + 
                       (g<75?0:(g-35)/40)*6   +
                       (b<75?0:(b-35)/40)     + 16 ))"
}

将其用作:

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048

查找中使用的颜色编号HTML 颜色格式:

#!/bin/dash
tohex(){
    dec=$(($1%256))   ### input must be a number in range 0-255.
    if [ "$dec" -lt "16" ]; then
        bas=$(( dec%16 ))
        mul=128
        [ "$bas" -eq "7" ] && mul=192
        [ "$bas" -eq "8" ] && bas=7
        [ "$bas" -gt "8" ] && mul=255
        a="$((  (bas&1)    *mul ))"
        b="$(( ((bas&2)>>1)*mul ))" 
        c="$(( ((bas&4)>>2)*mul ))"
        printf 'dec= %3s basic= #%02x%02x%02x\n' "$dec" "$a" "$b" "$c"
    elif [ "$dec" -gt 15 ] && [ "$dec" -lt 232 ]; then
        b=$(( (dec-16)%6  )); b=$(( b==0?0: b*40 + 55 ))
        g=$(( (dec-16)/6%6)); g=$(( g==0?0: g*40 + 55 ))
        r=$(( (dec-16)/36 )); r=$(( r==0?0: r*40 + 55 ))
        printf 'dec= %3s color= #%02x%02x%02x\n' "$dec" "$r" "$g" "$b"
    else
        gray=$(( (dec-232)*10+8 ))
        printf 'dec= %3s  gray= #%02x%02x%02x\n' "$dec" "$gray" "$gray" "$gray"
    fi
}

for i in $(seq 0 255); do
    tohex ${i}
done

将其用作(“基本”是前 16 种颜色,“颜色”是主要组,“灰色”是最后的灰色颜色):

$ tohex 125                  ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec=   6 basic= #008080
$ tohex 235
dec= 235  gray= #262626

答案2

tput公用事业正在使用 256 色查找表进行打印8 位 ANSI 转义序列(以 和 开头Esc[它利用终端能力,因此这些控制序列可以解释为颜色。这些是图形卡中常用的预定义 256 种颜色。

要在终端中打印所有 256 种颜色,请尝试以下一行:

for c in {0..255}; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done

提示:追加| column到列列表。

这个 256 色查找表也可以在维基百科页面如下:

图表; ANSI 转义码;维基百科上的 8 位 256 色查找表; 256 色模式 — 前景:ESC[38;5;#m 背景:ESC[48;5;#m

答案3

简而言之,您可以在网络上找到颜色表并将其与颜色编号进行匹配。

长答案是正确的映射取决于终端 -

这是终端描述中 125引用的转义序列的参数。该数字没有特殊含义。这实际上取决于特定的终端仿真器。setaftput

不久前,ANSI 定义了 8 种颜色的代码,并且有两种编号方案。在某些终端描述中,这两者被视为成对setf/setbsetaf/setab。由于后者具有“ANSI 颜色”的含义,因此您会看到它使用得更频繁。前者 (setf/setb) 切换了红色/蓝色的顺序,如 ncurses FAQ 中所述为什么红/蓝互换?,但无论哪种情况,该方案都是为了对颜色进行编号而建立的。这些数字和 RGB 内容之间没有预定义的关系。

对于特定的终端仿真器,有预定义的调色板,可以很容易地枚举它们,并且可以使用这些转义序列进行编程。有相关标准,您将看到终端仿真器之间的差异,如 xterm FAQ 中所述我不喜欢那种蓝色

然而,约定常常与标准混淆。在过去 20 年的 xterm 开发过程中,它合并了 ANSI (8) 颜色、调整了aixterm功能 (16) 颜色、添加了 88 色和 256 色的扩展。其中大部分已被其他开发人员用于不同的终端仿真器。 xterm 常见问题解答中对此进行了总结为什么不让“xterm”等同于“xterm-256color”?

xterm 源代码包括用于演示颜色的脚本,例如,使用与tput将要使用的相同的转义序列。

您可能会发现这个问题/答案也很有帮助:Ansi 扩展颜色索引 (17-255) 中颜色的 RGB 值

答案4

使用 zsh 并在xterm类似终端(xterm以及vte基于终端,如gnome-terminal, xfce4-terminal... 至少)中,您可以执行以下操作:

$ read -s -t1 -d $'\a' $'c?\e]4;125;?\a' && echo "${c##*;}"
rgb:afaf/0000/5f5f

bash 等效项:

read -s -t1 -d $'\a' -p $'\e]4;125;?\a' c && echo "${c##*;}"

(您希望转义序列查询要发送的颜色终端规则echo被禁用(使用-s),否则响应将由线路规则显示一半的时间,因此将其作为read提示的一部分发送(var?prompt在 zsh 中,如在 ksh 中、-p prompt在 bash 中))。

得到颜色 125 的定义(这里作为 RGB 规范,每个数字是红色、绿色和蓝色分量的强度,以 0 到 FFFF 之间的十六进制数字表示)。

您可以使用以下命令对前 16 种颜色执行相同的操作xtermcontrol

$ xtermcontrol --get-color1
rgb:cdcd/0000/0000

相关内容