টিপুট সেফ রঙের টেবিল? রঙ কোডগুলি কীভাবে নির্ধারণ করবেন?


79

আমি আমার টার্মিনালটি রঙিন করার প্রক্রিয়াধীন PS1

আমি ব্যবহার করে রঙের ভেরিয়েবল সেট করছি tput; উদাহরণস্বরূপ, এখানে বেগুনি:

PURPLE=$(tput setaf 125)

প্রশ্ন:

125অন্যান্য রঙের রঙ কোডগুলি (উদাঃ ) কীভাবে খুঁজে পাব?

কোথাও কোনও রঙিন টেবিল গাইড / ঠকানো শীট আছে?

আমি ঠিক কি তা নিশ্চিত নই 125… হেক্স রঙ নিতে এবং setafব্যবহার করতে পারে এমন একটি সংখ্যায় রূপান্তর করার কোনও উপায় আছে কি ?


উত্তর:


152

টিপুটতে উপলভ্য রঙগুলির গণনা দ্বারা প্রদত্ত tput colors

বেসিক 8 টি রঙ দেখতে (যেমন setfurxvt টার্মিনাল এবং এক্সটার্ম টার্মিনালে ব্যবহৃত 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 রঙের চার্ট, তাদের সূচকে লেবেলযুক্ত


১ million মিলিয়ন রঙের বেশ কয়েকটি কোড দরকার (কিছু কনসোল এটি প্রদর্শন করতে পারে না)।
বেসিকগুলি হ'ল:

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

লাল রেখা, গাer় থেকে হালকা হয়ে যাওয়া (বাম থেকে ডানে) বাম থেকে ডানে স্বরটিতে খুব ছোট পরিবর্তন সহ এটি একটি লাল রেখা উপস্থাপন করবে। যদি সেই ছোট পরিবর্তন দৃশ্যমান হয় তবে আপনার কনসোলটি 16 মিলিয়ন রঙের জন্য সক্ষম।

প্রতিটি r, gএবং 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

এইচটিএমএল রঙের ফর্ম্যাটে ব্যবহৃত রঙের সন্ধান করতে :

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

আপনার থেহেক্স ফাংশন দুর্দান্ত! অনেক ধন্যবাদ!
mululse

লভিন ' fromhex। আবার ধন্যবাদ! এছাড়াও, আমি এর জন্য একটি চেক যুক্ত# করেছি । প্রতিক্রিয়া?
mululse

1
হ্যাঁ, নেতৃস্থানীয় '#' অপসারণ করা যুক্তিসঙ্গত সুরক্ষা। আমি ব্যবহার করতে অনেক সহজ খুঁজে hex=${1#"#"}। এটা তোলে যদি কিছুই সরাবে $1একটি নেই #, এবং সেটিকে সরান যদি উপস্থিত থাকে। আমার আপডেট হওয়া কোডটি দেখুন।

নিস! আরও অনেক কমপ্যাক্ট। এখনই আমার কোড আপডেট করা হচ্ছে। ধন্যবাদ!!!!
mululse

নোট করুন যে কমপক্ষে আমার এক্সটারমের সংস্করণে এটি \e[0;%s8;2;%s;%s;%smআমাকে 16 এম রঙ দেয় না, কেবল অনুরোধ করা আরজিবি-র নিকটতম 240 রঙের প্যালেটে রঙ।
স্টাফেন চেজেলাস

14

সংক্ষিপ্ত উত্তরটি হ'ল আপনি রঙের ওয়েব টেবিলগুলিতে সন্ধান করতে পারেন এবং সেগুলি রঙের সাথে মেলে।

দীর্ঘ উত্তরটি হ'ল সঠিক ম্যাপিং টার্মিনালের উপর নির্ভর করে -

125এড়িয়ে যাওয়ার জন্য একটি ক্রম হিসাবে উল্লেখ করা করার জন্য একটি প্যারামিটার setafটার্মিনাল বর্ণনাতে। tputসংখ্যার সাথে কোন বিশেষ অর্থ সংযুক্ত করে। এটি আসলে নির্দিষ্ট টার্মিনাল এমুলেটারের উপর নির্ভর করে।

কিছুক্ষণ আগে, এএনএসআই 8 টি রঙের জন্য কোডগুলি সংজ্ঞায়িত করেছিল এবং সেগুলি সংখ্যা করার জন্য দুটি স্কিম ছিল। দুজনকে কিছু টার্মিনাল বিবরণে জুটি setf/setbবা হিসাবে দেখা যায় setaf/setab। যেহেতু পরেরটির "এএনএসআই রঙগুলির" রূপান্তর রয়েছে, আপনি দেখতে পাবেন যে এটি প্রায়শই ব্যবহৃত হয়। প্রাক্তন (setf / setb) লাল / নীল জন্য ক্রম স্যুইচ করা ncurses এফএকিউ হিসাবে উল্লিখিত হয়েছে কেন লাল / নীল পরিবর্তিত হয়? , তবে উভয় ক্ষেত্রেই, স্কিমটি কেবল রঙিন সংখ্যার জন্য প্রতিষ্ঠিত হয়েছিল। এই সংখ্যাগুলি এবং আরজিবি সামগ্রীগুলির মধ্যে কোনও পূর্বনির্ধারিত সম্পর্ক নেই।

নির্দিষ্ট টার্মিনাল এমুলেটরগুলির জন্য, এখানে পূর্বনির্ধারিত রঙ প্যালেটগুলি রয়েছে যা সহজেই যথেষ্ট পরিমাণে গণনা করা যায় - এবং এই পালানোর ক্রমগুলি ব্যবহার করে প্রোগ্রাম করা যায়। আছে কোন প্রাসঙ্গিক মান, এবং আপনি টার্মিনাল emulators মধ্যে পার্থক্য দেখতে পাবেন, xterm FAQ এ উল্লিখিত আমি নীল যে আলোছায়া পছন্দ করি না

যাইহোক, সম্মেলন প্রায়শই মান নিয়ে বিভ্রান্ত হয়। গত ২০ বছরে এক্সটার্মের বিকাশে এটি এএনএসআই (8) রঙগুলি সংহত করেছে, aixtermবৈশিষ্ট্যটি (16) রূপান্তর করেছে , 88- এবং 256-বর্ণের জন্য এক্সটেনশান যুক্ত করেছে। এর বেশিরভাগ অংশ অন্যান্য টার্মিনাল এমুলেটরগুলির জন্য অন্যান্য বিকাশকারীরা গ্রহণ করেছেন। এটি xterm FAQ এ সংক্ষিপ্তসারিত হয়েছে কেন "xterm "টিকে" xterm-256color "এর সমান করা হবে না?

এক্সটার্ম উত্স-কোডে বর্ণগুলি প্রদর্শনের জন্য স্ক্রিপ্টগুলি অন্তর্ভুক্ত করা হয়, যেমন, একইরকম এস্কেপ সিকোয়েন্সগুলি tputব্যবহার করা হবে।

আপনি এই প্রশ্ন / উত্তরটি সহায়ক হিসাবেও পেতে পারেন: আনসির বর্ধিত রং সূচকে রঙগুলির আরজিবি মান (17-255)


আপনার সহায়তার জন্য থমাসকে অনেক ধন্যবাদ, আমি সত্যই এটির প্রশংসা করি! আমি ম্যাক / ওএস এক্সে আইটির্ম চালাচ্ছি। আপনার ব্যাখ্যাটি আমাকে আমার সেটআপ সম্পর্কে আরও বুঝতে সহায়তা করে (আমি ওয়েবে বিভিন্ন লোকের প্রম্পট রঙ থেকে অনেক অনুলিপি / পেস্ট করেছি)। আমি আমাকে একটি বিস্তারিত এবং তথ্যমূলক জবাব লিখতে সময় দেওয়ার জন্য সত্যই প্রশংসা করি। :)
mululse

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 বর্ণের সারণীটি নিম্নলিখিত হিসাবে উইকিপিডিয়া পৃষ্ঠায় পাওয়া যাবে :

চার্ট;  এএনএসআই পলায়নের কোড;  উইকিপিডিয়ায় 8-বিট 256- বর্ণন সারণী;  256- রঙ মোড - অগ্রভাগ: ESC [38; 5; # মি ব্যাকগ্রাউন্ড: ESC [48; 5; # মি


3

Zsh সঙ্গে এবং একটি ইন xterm-একটি টার্মিনাল ( 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?promptzsh মধ্যে যেমন ksh, -p promptবাশে))

বর্ণের সংজ্ঞা পেতে 125 (এখানে একটি আরজিবি স্পেসিফিকেশন হিসাবে, প্রতিটি সংখ্যা 0 এবং এফএফএফএফের মধ্যে একটি হেক্স সংখ্যা হিসাবে লাল, সবুজ এবং নীল উপাদানগুলির তীব্রতা বলে)।

xtermcontrolকমান্ডটি দিয়ে প্রথম 16 টি রঙের জন্য আপনি একই কাজটি করতে পারেন :

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

দুর্দান্ত, সহায়তার জন্য আপনাকে অনেক ধন্যবাদ! +1
mululse

@ গিলস, আপনি টার্মিনাল শৃঙ্খলা প্রতিধ্বনি অক্ষম হওয়ার পরে প্রোম্পের মাধ্যমে ক্যোয়ারী প্রেরণ করতে চান। সম্পাদনা দেখুন।
স্টাফেন চেজেলাস

@ স্টাফেনচেজেলাস অন্য একটি টার্মিনাল প্রোগ্রাম ব্যবহার করে (জিনোম-টার্মিনাল) (যা একটি এক্সটার্ম টার্মিনাল) আপনার কোডটি সঠিকভাবে কাজ করার জন্য পেয়েছি (ব্যাশ এবং জেডএস উভয় ক্ষেত্রেই) অদ্ভুতভাবে যথেষ্ট: টার্মিনালটি 256 টি রঙ উপস্থাপন করতে সক্ষম হলেও tput colorsকেবল প্রতিবেদন করে 8। এছাড়াও, এক্সটার্ম-কালার (কনসোল) tput colorsকেবলমাত্র 8যদি টার্মিনালটি 16 মিলিয়ন রঙ (এবং অবশ্যই 256 টি বর্ণ অবশ্যই) উপস্থাপনে সম্পূর্ণ সক্ষম হয় তবেই প্রতিবেদন করে । এবং না, কোনও tmux বা স্ক্রিন যা "রঙ" করতে পারে :-) (এটি পরিবর্তন হয়) ফলাফলগুলি (আমি সেই বিশদটি সম্পর্কে অবগত ছিলাম)। সংক্ষেপে: আপনার কোড কিছু টার্মিনাল / কনসোলগুলিতে ব্যর্থ হতে পারে।

আহ, টেক্সেক্স আমার জবাবটিতে যোগ করেছে, আমি যেটা প্রত্যাশা করছিলাম তার থেকে কিছুটা দীর্ঘ, তবে 256 টি বর্ণের মধ্যে বেশ খানিকটা বিড়বিড় মোড় রয়েছে।

0

কনসোল মেয়াদে এএনএসআই রঙ

আপনার কনসোল ব্যবহারের জন্য উইচ টার্ম প্রোটোকলের উপর নির্ভর করে সিকোয়েন্সটি হতে পারে: \e[38;5;XXXmবা \e[3XXXmযেখানে XXXআনসি সংখ্যাটির সাথে মিল রয়েছে correspond

আপনি সঠিক এএনএসআই ক্রম ব্যবহার করেছেন তা নিশ্চিত করতে আপনাকে ব্যবহার করতে হবে 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 টি কাঁটা! একই ফলাফল, কিন্তু অনেক দ্রুত!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.