yosh1

メモ

Bash プロンプトのカスタマイズ 色

プロンプトに色を付けていきます。下の画像は今回使用する CSI (Control Sequence Introducer) sequences という文字出力を制御する設定の一部で文字に色・太さ・下線などの属性を設定する機能です。

色の変更 \e[nm

\e[
文字出力の制御の設定(CSI)を開始しする合図です。
よく検索すると、\033[ や \x1b[ と出てきますが同じ意味です。前者が8進数、後者が16進数で e の文字を表現しています。

n
制御する属性を0~107の数値(SGR)で設定します。
複数の属性を設定する場合は「;」セミコロンで区切ります。数値を入力せずに「;;」と1つ以上続いた場合、値のない箇所は0が入力されたことになります。
\e[m と n は省略することができます。この場合、全ての属性が初期値にリセットされます。(\e[0m と同じです。)

m
文字の色やスタイルを設定する記号です。

属性を設定するとリセットするか上書きするまで、その属性が生き続きます。必要な場所でリセット(\e[0m)をすると良いでしょう。

n(SGR)属性の設定

これで色が変えられますね。 0〜107の内、色に関係してくるのは以下の表通りです。

文字色 背景色 備考
30 ~ 47 40 ~ 47 基本の8色
90 ~ 97 100 ~ 107 明るい8色
38;5;n 48;5;n 256色。 nに0~255の数値を入力
38;2;r;g;b 38;2;r;g;b RGB色。r;g;b にはそれぞれ0~255の数値を入力
39 49 39文字色・49背景色を初期値に戻す
7 文字色と背景色を入れ替える

詳細

Fe Escape sequences
CSI (Control Sequence Introducer) sequences
SGR (Select Graphic Rendition) parameters

色の数

ここまで色を付けてきましたが環境によっては256色、RGB色が使えないということがあります。

  • 使っているターミナルアプリケーションが対応していない
  • エミュレートしている端末タイプが対応していない

等です。確認するには以下のコマンドを実行してください。

echo $TERM
echo $COLORTERM

さらに、Terminal Colors にある次のコマンドでテストしてください。

awk 'BEGIN{
    s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
    for (colnum = 0; colnum<77; colnum++) {
        r = 255-(colnum*255/76);
        g = (colnum*510/76);
        b = (colnum*255/76);
        if (g>255) g = 510-g;
        printf "\033[48;2;%d;%d;%dm", r,g,b;
        printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
        printf "%s\033[0m", substr(s,colnum+1,1);
    }
    printf "\n";
}'

TERM の値が *-256color 、COLORTERM の値が truecolor 、 次にテストしたコマンドでグラデーションに段差が出ていなければ、RGBまで対応しています。
グラデーションに段差が出ている場合、アプリケーションが対応していないのでサイトを覗いて確認してください。

truecolorとは
RGB色、#ffffff のこと。R,G,Bをそれぞれ8bit、計24bitで表現

おわりに

次回は見た目をデザインしていきます。