tput setaf tabela de cores? Como determinar códigos de cores?

66

Estou no processo de colorir o PS1 do meu terminal.

Estou configurando variáveis de cor usando tput ; por exemplo, aqui está roxo:

PURPLE=$(tput setaf 125)

Pergunta:

Como faço para encontrar os códigos de cores (por exemplo, 125 ) de outras cores?

Existe algum guia / guia de tabela de cores em algum lugar?

Não sei ao certo qual 125 é ... Existe alguma maneira de obter uma cor hexadecimal e converter em um número que setaf possa usar?

    
por mhulse 11.03.2016 / 05:42

4 respostas

123

A contagem de cores disponíveis para processamento é dada por tput colors .

Para ver as 8 cores básicas (usadas por setf no terminal urxvt e setaf no terminal xterm):

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

E geralmente chamado assim:

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

Para ver as 256 cores estendidas (como usado por setaf no urxvt):

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

Se você quiser números e uma saída ordenada:

#!/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}

Os16milhõesdecoresprecisamdeumpoucodecódigo(algunsconsolesnãopodemmostrarisso).
Obásicoé:

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

fb é front/back ou 3/4 .

Um teste simples da capacidade do seu console para apresentar tantas cores é:

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

Eleapresentaráumalinhavermelhacomumapequenaalteraçãonotomdaesquerdaparaadireita.Seessapequenaalteraçãoforvisível,seuconsoleterácapacidadepara16milhõesdecores.

Cadar,gebéumvalorde0a255paraRGB(Vermelho,Verde,Azul).

Seoseutipodeconsolesuportarisso,essecódigocriaráumatabeladecores:

mode2header(){####For16Millioncolorsuse\e[0;38;2;R;G;BmeachRGBis{0..255}printf'\e[mR\n'#resetthecolors.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

Paraconverterumvalordecorhexadecimalemumíndicedecor0-255(maispróximo):

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 ))"
}

Use como:

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048

Para encontrar o número da cor usado no formato de cores 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

Use como ("básico" são as primeiras 16 cores, "cor" é o grupo principal, "cinza" são as últimas cores cinza):

$ tohex 125                  ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec=   6 basic= #008080
$ tohex 235
dec= 235  gray= #262626
    
por 11.03.2016 / 06:44
13

A resposta curta é que você pode encontrar na web tabelas de cores e combiná-las com o número da cor.

A resposta longa é que o mapeamento correto depende do terminal -

O 125 é um parâmetro para uma sequência de escape referida como setaf na descrição do terminal. tput não atribui nenhum significado particular ao número. Isso realmente depende do emulador de terminal em particular.

Um tempo atrás, o ANSI definiu códigos para 8 cores e havia dois esquemas para numerá-los. Os dois são vistos em algumas descrições de terminal como os pares setf/setb ou setaf/setab . Uma vez que este último tem a conotação de "cores ANSI", você verá que usado com mais freqüência. O primeiro (setf / setb) trocou a ordem para vermelho / azul como observado nas perguntas frequentes são vermelhos / azuis trocados? , mas em ambos os casos, o esquema foi estabelecido apenas para numerar as cores. Não há uma relação predefinida entre esses números e o conteúdo RGB.

Para emuladores de terminal específicos, existem paletas de cores predefinidas que podem ser facilmente enumeradas - e podem ser programadas usando essas seqüências de escape. Existem no padrões relevantes, e você verá diferenças entre os emuladores de terminal, conforme observado no FAQ do xterm Eu não gosto desse tom de azul .

No entanto, a convenção é frequentemente confundida com padrões. No desenvolvimento do xterm nos últimos 20 anos, incorporou cores ANSI (8), adaptou as cores aixterm feature (16), adicionou extensões para 88 e 256 cores. Muito disso foi adotado por outros desenvolvedores para diferentes emuladores de terminal. Isso está resumido no FAQ do xterm Por que não tornar o "xterm" equivalente a "xterm-256color"? .

O código-fonte xterm inclui scripts para demonstrar as cores, por exemplo, usando as mesmas seqüências de escape que tput usaria.

Você também pode achar esta pergunta / resposta útil: RGB das cores no índice de cores estendidas Ansi (17-255)

    
por 11.03.2016 / 16:44
8

O tput utility está usando uma tabela de consulta de 256 cores para imprimir 8-bit seqüências de escape ANSI (começando com Esc e [ ) que faz uso de recursos do terminal , para que essas seqüências de controle possam ser interpretadas como cores. Estes são conjuntos pré-definidos de 256 cores usadas comumente em placas gráficas.

Para imprimir todas as 256 cores no terminal, tente o seguinte one-liner:

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

Dica: Anexe o | column à lista de colunas.

Esta tabela de consulta de 256 cores também pode ser encontrada na página da Wikipedia da seguinte forma:

    
por 17.04.2018 / 18:48
3

Com zsh e em um terminal semelhante a xterm ( xterm e vte de terminais baseados como gnome-terminal , xfce4-terminal ... pelo menos), você pode fazer:

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

O equivalente do bash:

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

(você deseja que a sequência de escape consulte a cor a ser enviada após a disciplina de terminal echo está desativada (com -s ) caso contrário, a resposta seria exibida pela disciplina de linha o tempo, portanto, o envio dele como parte do prompt read ( var?prompt em zsh como em ksh, -p prompt em bash)).

para obter a definição de cor 125 (aqui como uma especificação RGB, sendo cada número a intensidade dos componentes Vermelho, Verde e Azul como um número hexadecimal entre 0 e FFFF).

Você pode fazer o mesmo para as primeiras 16 cores com o comando xtermcontrol :

$ xtermcontrol --get-color1
rgb:cdcd/0000/0000
    
por 11.03.2016 / 17:57