私は使うこのアプリ端末で利用可能なすべての色を表示します。私が得るものは次のとおりです。
- プログラムは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