私は使うこのアプリ端末で利用可能なすべての色を表示します。私が得るものは次のとおりです。
- プログラムは100未満の色を表示しません。なぜ?表示する方法はありますか?
- いくつかの#rrggbb値のn番目の色を変更する方法はありますか?それともこの色は事前定義されていますか?
- 色を変更できる場合(質問2を参照)、この値をエクスポートしてインポートする方法はありますか?
答え1
サポートされる色の数と、前景色と背景色がどのように変更されるかは、端末によって異なります。
データベースはterminfo
通常、正しい順序を見つけるのに役立ちます。
ほとんどのカラー端末は、前景と背景を変更するためのANSIカラーエスケープシーケンスをサポートしています。色0〜7。
それは:
- 前景色の設定$n:
printf "\33[3${n}m"
- 背景色の設定$n:
printf "\33[4${n}m"
一部の(まれな)端末(例emu
:)は、これらのANSI色に異なるシーケンスを使用します。
一部の(まれな)端末(QNXコンソールなど)には、異なるエスケープシーケンスと色があります。
一部は(まれに)色のペアを使用します。背景と前景の色のペアを定義し、エスケープシーケンスを使用して使用する色のペアを選択します。
今日、xtermとほとんどの最新のフリーソフトウェアターミナルエミュレータは、基本的な8つのANSI色を最大16色(8〜15はANSI色0〜7のより明るいバージョン)まで拡張し、一部は88〜256色まで拡張します。
一部の端末はrxvt
8つの色しかサポートしていませんが、必要に応じてより明るい色を使用しています。勇敢なまた開いています(フロントエンド用)。または点滅する(背景として)。\033[34;1m
より明るい青色を生成します\033[34m
。
色を使用する最も移植可能な方法は、terminfoデータベースを使用することです。
これはtput
コマンドで達成できます。tcsh
そしてzsh
内蔵されたものもありますechoti
。
terminfoデータベースが正確で、値が$TERM
使用されている端末を正しく反映しているとします。
tput colors
端末でサポートされている色の数を通知します。
現在、上記のまれな例外を除いて、端末がANSI色をサポートしていると想定できます。 ANSI背景色と前景色のterminfo関数setab
はとですsetaf
。端末が8つ以上の色をサポートしている場合でも、この機能を使用してその色を照会できます。
tput setaf 233
端末が256色をサポートしている場合は、色233の正しいエスケープシーケンスを出力する必要があります。
の場合、xterm
出力setaf
色\033[30m..\033[37m
は0~7、\033[90m..\033[97m
色は8~15、\033[38;5;16m..\033[38;5;255m
色は16~255です。
\033[38;5;0m..\033[38;5;15m
また、動作しますが、色0〜15に対して移植性に優れているよりも4バイト長いです。
したがって、端末でサポートされているすべての色をテストしてください。 ANSIカラーがサポートされている場合:
i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
tput setaf "$i"; printf %04d "$i"
i=$((i + 1))
done
他の色がサポートされている場合:
i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
tput setf "$i"; printf %04d "$i"
i=$((i + 1))
done
カラーペアで動作する場合(例:hpterm-color):
i=0; n=$(tput pairs); while [ "$i" -lt "$n" ]; do
tput scp "$i"; printf %04d "$i"
i=$((i + 1))
done
これで、色や色のペアを上書きするには、端末によって異なります。
initc
これを実行できる端末の指定された色をオーバーライドできるterminfo関数があります。そしてinitp
ペアをオーバーライドします。
たとえば、色1を明るい白にオーバーライドします。
tput initc 1 1000 1000 1000
使用xterm
、転送順序: \033]4;1;rgb:FF/FF/FF\033\
。
色のペアを使用して、端末の黒の背景に白で色のペア1を上書きします。
tput initp 1 1000 1000 1000 0 0 0
答え2
使用しているため、gnome-terminal
RGB値を変更する必要はありません。最近gnome-terminal
(v. 3.12から)True 24ビットカラー(1,600万)をサポートしています。で設定できます\e[38;2;R;G;B
。例えば
printf '\e[38;2;100;200;200mTest\e[0m\n'
青いテキストが表示されると、端末は24ビットカラーをサポートしています。
ただし、256の色に固執するには、次のスクリプトを使用してすべての可能性を表示することをお勧めします。このスクリプトは、目的の色を簡単に選択できるようにブロックとして表示します(RGBコンポーネントが少ないか多い)。
#!/bin/bash
trap 'echo "Bye"; exit 1' INT
echo "PALETTE OF 8 COLORS"
for i in {30..37}; do printf "\e[1;${i}mTest%-3u \e[0m" "$i"; done; echo
for i in {90..97}; do printf "\e[${i}mTest%-3u \e[0m" "$i"; done; echo
for i in {30..37}; do printf "\e[${i}mTest%-3u \e[0m" "$i"; done; echo
for i in {30..37}; do printf "\e[2;${i}mTest%-3u \e[0m" "$i"; done; echo -e "\n"
echo "PALETTE OF 256 COLORS"
j=8
for i in {0..255}; do
[[ $i = 16 ]] && j=6
[[ $i = 232 ]] && j=24
printf "\e[38;5;${i}mTest%-3u \e[0m" "$i"
[[ $(( $(( $i - 15 )) % $j )) = 0 ]] && echo
[[ $(( $(( $i - 15 )) % $(( $j * 6 )) )) = 0 ]] && echo
done
exit 0
答え3
私が見つけたように、私は次の方法ですべての色を得ることができます。
for i in {0..255} ; do printf "\x1b[38;5;${i}mcolour${i}\n"; done
~/.Xresources
RGB値は次のように変更できます。
xterm*color4: CornflowerBlue
URxvt*color1 : #ff0000
URxvt*color8 : #888888
ただし、すべての端末エミュレータがこの値を尊重するわけではありません。URXVT
はいまたはgnome-terminal
いいえ
答え4
数字を3文字でスペースで埋めるので、プログラムに欠陥があります。たとえば、「[[48;5; 42m
(空白を含む)印刷は機能しませんが^[[48;5;42m
(空白なし)印刷は機能します。