tput setaf кольорова таблиця? Як визначити кольорові коди?


79

Я перебуваю в процесі розфарбовування терміналів PS1.

Я встановлюю змінні кольорів за допомогою tput; наприклад, ось фіолетовий:

PURPLE=$(tput setaf 125)

Питання:

Як знайти кольори (наприклад 125) інших кольорів?

Чи є десь довідник / шпаргалка кольорової таблиці?

Я просто не впевнений, що 125таке… Чи є спосіб взяти шістнадцятковий колір і перетворити його в число, яке setafможна використовувати?


Відповіді:


152

Кількість кольорів, доступних tput, задається числом tput colors.

Щоб побачити основні 8 кольорів (як використовується setfв терміналі urxvt та setafв xterm терміналі):

$ 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 кольорів (як використовується setafв urxvt):

$ 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 кольорових діаграм послідовно, позначених їх індексом


На 16 мільйонів кольорів потрібно зовсім небагато коду (деякі консолі цього не можуть показувати).
Основи:

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

fbє front/backабо 3/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

червона лінія, затухаючи від темнішої до світлішої (зліва направо) Він представить червону лінію з дуже невеликою зміною тону зліва направо. Якщо ця невелика зміна помітна, ваша консоль здатна до 16 мільйонів кольорів.

Кожен r, gі bце значення від 0 до 255 для RGB (червоний, зелений, синій).

Якщо ваш тип консолі підтримує це, цей код створить таблицю кольорів:

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

Ваша функція fromhex чудова! Дуже дякую!
mhulse

Закоханий fromhex. Знову дякую! Крім того, я додав чек на# . Відгуки?
mhulse

1
Так, видалення провідного "#" є розумним захистом. Я вважаю набагато простішим у використанні hex=${1#"#"}. Він нічого $1не видалить, якщо не має #, і видалить його, якщо воно існує. Дивіться мій оновлений код.

Приємно! Набагато компактніше. Оновлення коду зараз. Дякую!!!!
mhulse

Зауважте, що принаймні в моїй версії xterm \e[0;%s8;2;%s;%s;%smне дає мені 16М кольорів, а лише колір у палітрі кольорів 240, найближчий до запитуваного rgb.
Стефан Шазелас

14

Коротка відповідь полягає в тому, що ви можете знайти на веб-таблицях кольорів і зіставити їх за кольоровим номером.

Довга відповідь полягає в тому, що правильне відображення залежить від терміналу -

125Є параметром для керуючої послідовності , зазначеної як setafв термінальному описі. tputне надає особливого значення числу. Це насправді залежить від конкретного термінального емулятора.

Нещодавно ANSI визначив коди для 8 кольорів, і існували дві схеми їх нумерації. Вони в деяких описах терміналів розглядаються як пари setf/setbабо setaf/setab. Оскільки в останньому є конотація "ANSI кольорів", ви побачите, що використовується частіше. Колишній (setf / setb) змінив замовлення на червоний / синій, як зазначено у ncurses FAQ Чому червоний / синій обміняються? , але в будь-якому випадку схема була встановлена ​​для просто нумерації кольорів. Не існує заздалегідь визначеної залежності між цими номерами та вмістом RGB.

Для конкретних термінальних емуляторів є заздалегідь визначені палітри кольорів, які можна перерахувати досить легко - і їх можна запрограмувати за допомогою цих послідовностей евакуації. Там немає жодного відповідних стандартів, і ви побачите різницю між емуляторів терміналу, як зазначено в XTERM FAQ Мені не подобається , що відтінок синього .

Однак конвенцію часто плутають зі стандартами. Розробляючи xterm за останні 20 років, вона включила ANSI (8) кольорів, адаптувала aixtermособливості (16) кольорів, додала розширення для 88- та 256-кольорів. Значна частина цього була прийнята іншими розробниками для різних емуляторів терміналів. Це підсумовано у FAQ xterm Чому б не зробити "xterm" прирівнювати до "xterm-256color"? .

Вихідний код xterm включає скрипти для демонстрації кольорів, наприклад, з використанням тих же послідовностей, що tputвикористовуються.

Це питання / відповідь також може бути вам корисним: значення RGB кольорів у розширеному індексі кольорів Ansi (17-255)


Дуже дякую за вашу допомогу, Томасе, я дуже ціную це! Я на Mac / OS X під керуванням iTerm. Ваше пояснення дійсно допомагає мені зрозуміти більше про мої налаштування (я зробив багато копій / вставлення з різних кольорів підказки інших людей в Інтернеті). Я дуже вдячний, що ви знайшли час, щоб написати мені детальну та інформативну відповідь. :)
mhulse

9

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

З Zsh і в xterm-like терміналі ( xtermі vte-На термінали , як gnome-terminal, xfce4-terminal... по крайней мере), ви можете зробити:

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

Баш-еквівалент:

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

(ви хочете, щоб послідовність відхилення запитувала колір, який буде надісланий післяecho вимкнення термінальної дисципліни (з -s), інакше відповідь відображатиметься рядковою дисципліною половину часу, отже, надсилання її як частина readпідказки ( var?promptв zsh як у кш, -p promptв баш)).

щоб отримати визначення кольору 125 (тут як специфікація RGB, кожне число інтенсивності червоного, зеленого та синього компонентів як шістнадцяткове число від 0 до FFFF).

Ви можете зробити те ж саме для перших 16 кольорів за допомогою xtermcontrolкоманди:

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

Дивовижний, дуже дякую за допомогу! +1
mhulse

@Gilles, ви хочете, щоб запит був надісланий через підказку після відключення відлуння термінальної дисципліни. Див. Редагування.
Стефан Шазелас

@ StéphaneChazelas Використовуючи іншу термінальну програму (gnome-terminal) (що є терміналом xterm), я змусив ваш код працювати коректно (і в bash, і в zsh) Як не дивно: tput colorsзвітує лише, 8якщо термінал здатний представляти 256 кольорів. Крім того, xterm-color (Konsole) tput colorsзвітує лише, 8якщо цей термінал повністю здатний представити 16 мільйонів кольорів (і, звичайно, всі 256 кольорів). І ні, жоден tmux або екран, який може "забарвити" :-) (змінити, що є) результати (я знав про цю деталь). Якщо коротко: ваш код може вийти з ладу в деяких терміналах / консолях.

Ах, tohex додав до моєї відповіді: Трохи довше, ніж я очікував, але 256 кольорів мають досить багато вигадок.

0

Кольори ANSI на консольному терміні

Залежно від протоколу терміна, який використовує ваша консоль, послідовність може бути: \e[38;5;XXXmабо \e[3XXXmтам, де XXXвідповідають номеру ansi.

Щоб переконатися, що ви використовуєте правильну послідовність ANSI, вам потрібно скористатися tput.

Щодо коду втечі від ANSI у Вікіпедії , я написав це:

#!/bin/bash


for ((i=0; i<256; i++)) ;do
    echo -n '  '
    tput setab $i
    tput setaf $(( ( (i>231&&i<244 ) || ( (i<17)&& (i%8<2)) ||
        (i>16&&i<232)&& ((i-16)%6 <(i<100?3:2) ) && ((i-16)%36<15) )?7:16))
    printf " C %03d " $i
    tput op
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

Могло б зробити щось на зразок:

введіть тут опис зображення

... Тоді, оскільки я ненавиджу трохи більше 200 вилок у невеликому сценарії, я написав це:

#!/bin/bash

# Connector fifos directory
read TMPDIR < <(mktemp -d /dev/shm/bc_shell_XXXXXXX)

fd=3
# find next free fd
nextFd() { while [ -e /dev/fd/$fd ];do ((fd++)) ;done;printf -v $1 %d $fd;}

tputConnector() {
    mkfifo $TMPDIR/tput
    nextFd TPUTIN
    eval "exec $TPUTIN> >(LANG=C exec stdbuf -o0 tput -S - >$TMPDIR/tput 2>&1)"
    nextFd TPUTOUT
    eval "exec $TPUTOUT<$TMPDIR/tput"
}
myTput() { echo -e "$1\ncr" 1>&$TPUTIN && IFS= read -r -d $'\r' -u $TPUTOUT $2
}
tputConnector

myTput op op
myTput "setaf 7" grey
myTput "setaf 16" black
fore=("$black" "$grey")
for ((i=0; i<256; i++)) ;do
    myTput "setab $i" bgr
    printf "  %s%s  %3d  %s" "$bgr" "${fore[ i>231 && i<244||(i<17)&& (i%8<2)||
        (i>16&&i<232)&&((i-16)%6*11+(i-16)/6%6*14+(i-16)/36*10)<58
        ? 1 : 0 ]}" $i "$op"
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

З лише 1 виделкою! Той самий результат, але набагато швидше!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.