端末での色の設定、バックアップ、復元

端末での色の設定、バックアップ、復元

私は使うこのアプリ端末で利用可能なすべての色を表示します。私が得るものは次のとおりです。

ここに画像の説明を入力してください。

  1. プログラムは100未満の色を表示しません。なぜ?表示する方法はありますか?
  2. いくつかの#rrggbb値のn番目の色を変更する方法はありますか?それともこの色は事前定義されていますか?
  3. 色を変更できる場合(質問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色まで拡張します。

一部の端末はrxvt8つの色しかサポートしていませんが、必要に応じてより明るい色を使用しています。勇敢なまた開いています(フロントエンド用)。または点滅する(背景として)。\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-terminalRGB値を変更する必要はありません。最近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

~/.XresourcesRGB値は次のように変更できます。

xterm*color4: CornflowerBlue
URxvt*color1  : #ff0000
URxvt*color8  : #888888

ただし、すべての端末エミュレータがこの値を尊重するわけではありません。URXVTはいまたはgnome-terminalいいえ

答え4

数字を3文字でスペースで埋めるので、プログラムに欠陥があります。たとえば、「[[48;5; 42m(空白を含む)印刷は機能しませんが^[[48;5;42m(空白なし)印刷は機能します。

関連情報