私の質問は一般的にANSIカラーを使用したシェルスクリプトですが、参考までにApple Mac OS X 10.9 Mavericksを使用しています。デフォルトの端末として「iTerm」端末アプリを使用していますが、ビルド済みの端末でも確認しています。 「ターミナル」アプリでも。デフォルトのシェルとしてZSH(5.0.7)を使用していますが、BASH(3.2.51)もチェックインしています。
Esc [38; 5; xmおよびesc [48; 5; xmで使用できる256色のインデックス付き拡張フォア/バックグラウンドAnsiエスケープコードのRGB値のリストがあるかどうかを調べようとしています。xは0から255までの数値。(インデックスを使用して)色をブロックとして出力するスクリプトをいくつか見つけましたが、インデックス内の各色のrgb値を知りたいです。
使用中のANSIコードの例を次に示します。
printf '\e[38;5;222;48;5;238m Hi \e[m\n'
(\ eは\ 033または\ x1bに置き換えることができます)
それで、基本的に私はこれらのインデックスカラーのリストまたは合意された設定があるかどうか疑問に思っていますか?たとえば、232-255は常に灰色のグラデーションのようです。拡張された色を参照していることがわかったすべてのサイトは、その使用方法を説明しているだけで、特定の色はリストされていません。
X11とrgb.txtファイルへの参照がいくつか見つかりました。最初はそれが探していたもののように見えましたが、インデックス番号と一致していないようです。私が見つけたファイルには752色があります(ほとんどが重複しているので、さらに256である376と言います)。また、50のグレーの色合い(重複を数える場合は100)がありますが、Ansiのインデックスカラーは23であるため、同じではないようです。これらが何らかの方法でansi拡張カラーインデックスの色を含んでいる場合、誰かがどの名前がどのインデックスにあるかのリストを持っていますか?
PS。 esc [38; 2; r; g:bmはおそらくrgb値を使用して色を設定できることは知っていますが、Macで機能させることができず、インデックスカラーのデフォルト値にもっと興味があります。
いくつかのサイト:(低い担当者のために2つしか投稿できませんか?しかし、私は多くのサイトをチェックしました)
256色の端末の色の範囲は4つの部分で構成され、多くの場合5つです。この場合、実際には258色になります。
色番号0〜7はデフォルトの端末色であり、実際のRGB値は標準化されておらず、多くの場合構成できます。
色番号8から15は「明るい」色です。ほとんどの場合、これらはインデックス-8の明るい色合いです。また、標準化されておらず、構成できることもよくあります。ターミナルとシェルによっては、太字のフォントフェースの代わりに、またはそれらと組み合わせて使用されることがよくあります。
色番号16〜231はRGBカラーです。これらの216色は、3つのRGB軸のそれぞれの6つの値によって定義されます。つまり、値0〜255の代わりに、各色の範囲は0〜5のみです。
次に、色番号は次のように計算されます。
number = 16 + 36 * r + 6 * g + b
r
、g
、およびb
の範囲は0〜5です。
色番号232から255はグレースケールで、暗い色から明るい色まで24色のグレーがあります。
前景と背景のデフォルトの色。多くの端末では、256のインデックスカラーとは独立して構成でき、さらに2つの構成可能な色を提供します。他の色を設定していないとき、または他の色を無効にしているときに取得します(つまり、print '\e[m'
)。
いくつかの情報源:
urxvt
マンページ:
デフォルトの前景色と背景色に加えて、urxvtは最大88/256色を表示できます:8つのANSI色と同じ高輝度(太字/点滅の可能性がある)バージョン、および72(または256色モードでは240)色が配置されています4x4x4(または6x6x6)カラーRGBキューブと8(24)カラーグレースケールランプ。
xterm
マンページ:
これらは、256色の拡張機能の色を指定します。デフォルトのリソース値は、6x6x6カラーキューブを作成するための16〜231色、およびグレースケールランプを作成するための232〜255色です。
ANSIエスケープコードに関するウィキペディアの記事 (それ自体がトピックに関する引用を欠いています)
理論的には、均等に分散された色の範囲を取得するために、16〜231の範囲の色のRGB値を次のように計算できます。
# example in Python: // is integer divison, % is modulo
rgb_R = ((number - 16) // 36) * 51
rgb_G = (((number - 16) % 36) // 6) * 51
rgb_B = ((number - 16) % 6) * 51
しかし実際の方法は異なるようです:
私がテストしたターミナルエミュレータは、XTermに従い、赤、緑、青の値[0, 1, 2, 3, 4, 5]
をRGB色軸の値[0, 95, 135, 175, 215, 255]
にマップしているようです。 (XTerm(297)URxvt(v9.19)、ROXTerm(2.8.1)、gnome-terminal(3.6.2)、xfce4-terminal(0.6.3)でテストしました)
特定のインデックスのRGB値は、次のアルゴリズムで計算できます。
# example in Python: 'a = b if c else d' is 'a = (c) ? b : d` in C, Perl, etc.
index_R = ((number - 16) // 36)
rgb_R = 55 + index_R * 40 if index_R > 0 else 0
index_G = (((number - 16) % 36) // 6)
rgb_G = 55 + index_G * 40 if index_G > 0 else 0
index_B = ((number - 16) % 6)
rgb_B = 55 + index_B * 40 if index_B > 0 else 0
グレースケールは、次の単純な式に従っているようです。
rgb_R = rgb_G = rgb_B = (number - 232) * 10 + 8
XTermソース(バージョン313) のルートにある256colres.pl
は、同様のアルゴリズムを使用して256colres.h
を生成します。これには、256色モードの色定義が含まれています。
$line1="COLOR_RES(\"%d\",";
$line2="\tscreen.Acolors[%d],";
$line3="\tDFT_COLOR(\"rgb:%2.2x/%2.2x/%2.2x\")),\n";
# colors 16-231 are a 6x6x6 color cube
for ($red = 0; $red < 6; $red++) {
for ($green = 0; $green < 6; $green++) {
for ($blue = 0; $blue < 6; $blue++) {
$code = 16 + ($red * 36) + ($green * 6) + $blue;
printf($line1, $code);
printf($line2, $code);
printf($line3,
($red ? ($red * 40 + 55) : 0),
($green ? ($green * 40 + 55) : 0),
($blue ? ($blue * 40 + 55) : 0));
}
}
}
# colors 232-255 are a grayscale ramp, intentionally leaving out
# black and white
$code=232;
for ($gray = 0; $gray < 24; $gray++) {
$level = ($gray * 10) + 8;
$code = 232 + $gray;
printf($line1, $code);
printf($line2, $code);
printf($line3,
$level, $level, $level);
}
256色の端末にすべての色を出力するzsh関数を次に示します(TERM
が256色の値に設定されている場合)。
function termcolors ()
{
print TERM
print -P "Foreground: >█<"
print -P "Background: >%S█%s<\n"
print " 0 1 2 3 4 5 6 7"
for b (0 1)
do
printf "%d %2d " $b $(( 8 * b ))
for r (0 1 2 3 4 5 6 7)
do
c=$(( 8 * b + r ))
print -nP "%K{$c} %k"
done
printf " %2d\n" $(( 8 * b + 7 ))
done
print
print RGB
for r (0 1 2 3 4 5)
do
print "$r $(( 16 + 36 * r )) - $(( 16 + 36 * r + 35 ))\n 0 1 2 3 4 5"
for g (0 1 2 3 4 5)
do
printf "%d %3d " $g $(( 16 + 36 * r + 6 * g ))
for b (0 1 2 3 4 5)
do
c=$(( 16 + 36 * r + 6 * g + b ))
print -nP "%K{$c} %k"
done
printf " %3d\n" $(( 16 + 36 * r + 6 * g + 5))
done
print
done
print
print GRAY
for g in $(seq 0 23)
do
c=$(( 232 + g ))
printf "%2d %3d " $g $c
print -P "%K{$c} %k"
done
}
一部の端末(少なくともxterm
、gnome-terminal
、termite
、およびurxvt
)では、次のいずれかを送信することにより、実行時にこれらすべての色を変更できます XTerm制御シーケンス :
OSC 4; c ; spec BEL
OSC 4; c ; spec ST
どこ:
OSC
はエスケープ文字(\e
または\033
)の後に]
が続きますc
は色番号(0〜255)ですspec
は色の仕様です(例:red
、#ff0000
、rgb:ff/00/00
、rgbi:1/0/0
-実際に機能するものは端末によって異なる場合があります)BEL
はベル文字です(\a
または\007
)ST
は、文字列ターミネータ\e\\
または\033\\
です。これらの制御シーケンスは、echo
で出力するだけで送信できます。
echo -en "\e]4;COLOR;SPEC\a"
echo -en "\e]4;COLOR;SPEC\a"
たとえば、色番号5(通常はマゼンタの色合い)を赤に設定するには、次のいずれかが機能する必要があります。
echo -en "\e]4;5;red\a"
echo -en "\e]4;5;#ff0000\e\\"
echo -en "\033]4;5;rgb:ff/00/00\007"
これらの色は、制御シーケンスの1つを使用して、(構成された)デフォルトにリセットできます。
OSC 104 ; c BEL
OSC 104 ; c ST
したがって、次のループは、0から255までのすべての色を構成済みまたはデフォルト値にリセットします。
for c in {0..255}; do
echo -en "\e]104;$c\a"
done
デフォルトの前景色と背景色の場合、制御シーケンスはそれぞれOSC 10 ; spec BEL
とOSC 11 ; spec BEL
です。例えば:
echo -en "\e]10;red\a"
echo -en "\e]11;green\a"
これらはそれぞれOSC 110 BEL
とOSC 111 BEL
でリセットできます。
echo -en "\e]110\a"
echo -en "\e]111\a"
これが私のカラーユーティリティです。最も便利なのは、おそらくHex-> True、またはRGB-> 256コンバーターです。この多くは、y'alls help <3のおかげでまとめました
rgbtohex () {
# usage) `rgbtohex 17 0 26` ==> 1001A
# usage) `rgbtohex -h 17 0 26` ==> #1001A
addleadingzero () { awk '{if(length($0)<2){printf "0";} print $0;}';}
if [[ ${1} == "-h" ]]; then
r=${2}; g=${3}; b=${4};h='#';
else
r=${1}; g=${2}; b=${3};h='';
fi
r=`echo "obase=16; ${r}" | bc | addleadingzero`
g=`echo "obase=16; ${g}" | bc | addleadingzero`
b=`echo "obase=16; ${b}" | bc | addleadingzero`
echo "${h}${r}${g}${b}"
}
rgbto256 () {
# usage: `rgbto256 0 95, 135` ==> 22
echo "define trunc(x){auto os;os=scale;scale=0;x/=1;scale=os;return x;};" \
"16 + 36 * trunc(${1}/51) + 6 * trunc(${2}/51) +" \
" trunc(${3}/51)" | bc
# XTerm Color Number = 16 + 36 * R + 6 * G + B | 0 <= R,G,B <= 5
}
hextorgb () {
# usage) `hexttorgb "11001A" ==> 17 0 26
# usage) `hexttorgb "#11001A" ==> 17 0 26
hexinput=`echo ${1} | tr '[:lower:]' '[:upper:]'` # uppercase-ing
hexinput=`echo ${hexinput} | tr -d '#'` # remove Hash if needed
a=`echo ${hexinput} | cut -c-2`
b=`echo ${hexinput} | cut -c3-4`
c=`echo ${hexinput} | cut -c5-6`
r=`echo "ibase=16; ${a}" | bc`
g=`echo "ibase=16; ${b}" | bc`
b=`echo "ibase=16; ${c}" | bc`
echo ${r} ${g} ${b}
}
trueHexPrint () {
# Generates Truecolor Escape Sequences from Hex Strings. (remove '\\' to use)
# -fg Prints as a foreground color. (default)
# -bg Prints as a background color.
# usage) `trueHexPrint -fg "11001A" ==> '\e[38;2;17;0;26m'
# usage) `trueHexPrint -bg "11001A" ==> '\e[48;2;17;0;26m'
if [[ ${1} =~ "-fg" || ${1} =~ "-f" ]]; then
fgbg=38; hexinput=${2};
Elif [[ ${1} =~ "-bg" || ${1} =~ "-b" ]]; then
fgbg=48; hexinput=${2};
else
fgbg=38; hexinput=${1}
fi
hexinput=`echo ${hexinput} | tr '[:lower:]' '[:upper:]'` # uppercase-ing
hexinput=`echo ${hexinput} | tr -d '#'` # remove Hash if needed
a=`echo ${hexinput} | cut -c-2`
b=`echo ${hexinput} | cut -c3-4`
c=`echo ${hexinput} | cut -c5-6`
r=`echo "ibase=16; ${a}" | bc`
g=`echo "ibase=16; ${b}" | bc`
b=`echo "ibase=16; ${c}" | bc`
printf "\\\\e[${fgbg};2;${r};${g};${b}m" # Remove one set of '\\' to utilize
}
XColorTable () {
i=16
for ((r = 0; r <= 255; r+=40)); do # Do Tricolor
for ((g = 0; g <= 255; g+=40)); do
for ((b = 0; b <= 255; b+=40)); do
echo "Color$((i++)) = (${r}, ${g}, ${b})"
if ((b == 0)); then b=55; fi
done
if ((b == 0)); then g=55; fi
done
if ((r == 0)); then r=55; fi
done
for ((m = 8; m <= 238; m+=10)); do # Do Monochrome
echo "Color$((i++)) = (${m}, ${m}, ${m})"
done
}
#vim: ft=sh