追加読書

追加読書

端末で256色のテキストを使用する方法を知っています。

printf "\033[38;5;196mhello\n"

しかし、背景色の場合、基本的な8つの色に制限されているようです。

printf "\033[41mhello\n"

256色を背景色として使用するには?

私の言葉は、端末はすでに色を知っているので可能でなければならないということです。しかし、構文は何ですか?

関連がある場合、これは私がterminatorターミナルエミュレータとzshシェルとして使用することです。

答え1

では、zsh背景色と前景色を設定するための複数の組み込みメソッドがあるため、エスケープシーケンスをハードコーディングする必要はありません。

echoti setafターミナルsetnsiaの背景色を使用しfて背景色をechoti setab設定できます(対応するerm nfo関数の名前になることがあります)。bsetafsetabti

端末が256色をサポートし(gnome-terminatorなどのVTEベースの端末のように)、$TERM正しいエスケープシーケンスでterminfo項目を識別する値に正しく設定されていると仮定すると、うまく機能します。

$ echoti setab 196 | sed -n l
\033[48;5;196m$

print -Pまたは、%パラメータ拡張フラグでプロンプト拡張を使用できます。

$ print -rP '%K{196}' | sed -n l
\033[48;5;196m$

(これはsed -n l送信された対応するエスケープシーケンスを表示するためにここで使用されます$。これは行の終わりのみを表示し、出力の一部ではなく\033GNUsedコマンドlのESC文字表現です(8進数033バイトがあります)。ASCII値)

一部の端末(gnome-terminatorなどのVTEベースの端末を含む)もRGB仕様をサポートしています。この分野でできること

$ print -rP '%K{#ffffff}' | sed -n l
\033[48;2;255;255;255m$

(ここで、明るい白はすべての赤、緑、青のコンポーネントの最大値であるfffffffため表示されます。)ffこの場合、zshxtermスタイルのシーケンスはハードコードされます(参照:そこ背景)対応するterminfo関数がないためです。そうではありませんが、基準、これは現在、最新のFLOSS端末エミュレータの中で最も広くサポートされています。

%K%F前景の背景色を設定します。%k/%f基本色を復元します。

88または256パレットをサポートしていませんが、サポートしている端末の場合は、対応するRGB仕様に最も近い色を取得できるモジュールもzshあります。zsh/nearcolor

$ zmodload zsh/nearcolor
$ echoti colors
256
$ print -rP '%K{#ffffff}' | sed -n l
\033[48;5;231m$

(ここで私の256色ターミナルの色231は明るい白に最も近い、実際には明るい白です。)

X11rgb.txtファイルにアクセスできる場合X11カラー名次のようなもの:

typeset -A X11_bg X11_fg
while read -r r g b c; do
  [[ $r = [0-9]* ]] || continue
  printf -v hex %02x $r $g $b
  X11_fg[$c]=${(%):-%F{#$hex}}
  X11_bg[$c]=${(%):-%K{#$hex}}
done < /etc/X11/rgb.txt
X11_bg[default]=${(%):-%k} X11_fg[default]=${(%):-%f}

(Debianのようなシステムは/etc/X11/rgb.txtパッケージの一部として含まれていますx11-common)。

次のようにしてください。

print -r "$X11_bg[dark olive green]text$X11_bg[default]"

詳細については、次を参照してください。

  • man 5 terminfo
  • info zsh echoti
  • info zsh print
  • info zsh "Prompt Expansion"
  • info zsh "The zsh/nearcolor Module"

(一部のシステムでは、ページを使用するにはzsh-docソフトウェアパッケージまたはそれに対応するパッケージをインストールする必要があります。)info

答え2

printf "\033[48;5;226mhello\e[m\n"

printf "\033[48;2;255;255;0mhello\e[m\n"

もっと標準バリアント以前のバージョンのVTEライブラリは、2番目の(RGB)形式(後で未使用の「色空間識別子」を含む2)をサポートしていません(たとえば、Debian 10のTerminator 1.91はlibvte-2.91を使用します)。

答え3

前景のダイレクトカラーとインデックスカラー ITU T.416制御シーケンスはSGR 38:2およびSGR 38:5です。背景制御シーケンスは、SGR 48:2およびSGR 48:5に類似している。

ITU T.416セクション13.1.8を読んでください。

%TERM = rxvt-256color setterm -7 -Background "137" 16進ダンプ-C |
00000000 1b 5b 34 38 3b 35 3b 31 33 37 6d |.[48;5;137m|
0000000b
%

しかし、インデックスカラー以上を探している場合は、実際にSGR 38:2とSGR 48:2を正しく実装する端末エミュレータがあることに注意してください。現在、一部の人々によって修正された2つの歴史的エラーは、サブパラメータを使用せずに忘れてしまうことです。色空間識別子サブパラメーター。 iTerm2は2013年にこの問題を解決しました:2014年および(無視された)色空間識別子2017年

%TERM = iterm setterm -7 -Background "137" 16進ダンプ-C |
00000000 1b 5b 34 38 3a 32 3a 3a 31 37 35 3a 31 33 35 3a |.[48:2::175:135:|
00000010 39 35 6日| 95分|
00000014
%

追加読書

関連情報