初歩のシェルスクリプトで遊ぶ[端末の256色カラーセレクタ(6)]

256色版カラーセレクタ簡易説明書

だいたいこのへんで動作する、端末用のカラーセレクタです。
無保証を承認してくれる人なら誰でもどうぞ。

何を目的としたスクリプトなのか

  • 端末でエスケープシーケンスを使って文字に色をつけるとき、色選びをする。
  • 色選び関係のエスケープシーケンスが端末で使えるかどうかを試す。

当然ですが、端末上でエスケープシーケンスで色を指定して動かしてます。具体的に何を指定しているのかは、スクリプトを読めばはっきりするし、そこまでしなくても表示してます。
たとえば、「文字色10番、背景色230番、太字、斜体、リセット、……」などと、複数の指定を試すことができます。斜体や太字の指定は順番も指定できるので、「太字を指定してからリセット」と「リセットしてから太字」は違う、ということもわかります。
端末の設定が変わったら、当然、色も変わることがあります。
スクリプト側から、端末へ色を指定する機能もありますが、基本的に端末の既存の設定に従います。自動で色をリセットしたりはしません。

動作推奨環境とか

  • 端末画面は最低40行、80文字分の大きさは必要です。横幅の文字数が100文字~を推奨。
  • xfce4-terminal以外の端末でもそこそこ動きます。が、だいたい動いても細かく動かないところもあります。
  • というか、このスクリプト自体が、端末によって動いたり、動かなかったりを確かめるためのものでもあります。
  • シェルはdashを推奨しますが、シェバングに書いてあるものなら軽くテストはしてあります。もうksh対応したくねぇ。printfが無いのはつらい。
  • bashの独自機能などは使っていません。シェルスクリプトが分かる人なら誰でも読めます。AWKSEDスクリプトも混じってますが、簡単なものしかありません。

スクリーンショットと説明も一緒に


基本操作は、端末画面に表示されているキーを押せば分かります。
(ノートPC用のキー設定を忘れてて、)タブではフォーカスを動かせません。「PageUp/Down」が面倒なら、代わりに数字の「9」「3」も使えますので、そっちでどうぞ。






標準で5種類の並びを入れてます。並びが違うだけで、色と番号はどれでも同じです。


  • 文字色・背景色をインデックス番号で指定する

数字を入れて色を選びます。カーソルが入力した番号の場所に移動します。

  • サンプルテキストを書き換える

「free sample text」の行を、任意の文字に入れ替えます。
スクリプトのユーザ設定のところで「main sub sample」を書き換えても構いませんが、これだと再起動が必要で色がリセットされます。
ここで指定すると、色指定がそのままで、テキストだけ書き換えられます。

  • カラーパレットの幅を画面に合わせる

端末画面が狭くて折り返し状態になったときに実行すると、端末幅に合わせて縮めます。広くすると、伸びます。

  • カラーパレットを標準色にセットする
  • カラーレベル情報を端末から読み出す

このスクリプトで表示しているRGBの値は、端末に表示されてる色そのものではありません。簡単な計算で出してます。
「標準色にセット」は、この色の計算結果をもとにして、端末に対して「○○番のパレットの色を???にせよ」と指定します。計算方法は一つだけなんですが、掛け算の数字だけ変えられるようにしてありまして、数字を滅茶苦茶に入れると、端末の色も滅茶苦茶になります。「xfce4-terminal」など、対応している端末ならば。

「端末から読み出す」はその逆です。端末に対して「パレット○○番の色の明るさを教えてくれ」と問い合わせます。対応している端末なら、数字で返答があります。計算で出せない0~15番も、これだと数字を得られます。


「+」「a」で、色情報の詳細を表示します。
RGBやら何やら書いてますが、これは表示している色の情報、そのものではありません。
起動したままの状態なら、計算して出した結果。端末から情報を得られた後なら、端末から得た情報を表示しています。本当の色は別途カラーピッカーで確認してください。
「0-255」は色番号で指定してますから、カラーパレットの内容を書き換えていたならば、当然、色も変わります。隣の24ビット指定のほうはRGBの値で指定してますので、24ビット指定ができる端末なら、指定した数字の色が出てるはずです。

また、文字色の情報なのに背景色指定の「\033[48;5;NNm」になってますが、これは「今現在、この指定で表示してますよ」という意味です。
いわゆる「コピペ」するための文字色と背景色の指定例は、見出しっぽく色反転しているところに表示してます。