暗いまたは明るい端末の背景を設定するためのパブリック環境変数

暗いまたは明るい端末の背景を設定するためのパブリック環境変数

私は書いた数字 ~の デバッガーこれらのすべては、ターミナルセッションに表示されるソースコードテキストの色を指定できます。一部の端末には暗い背景があり、一部の端末には明るい背景があり、もちろん端末の構成によって色が異なることを知っています。

端末がデフォルトの壁紙と合わないときに別の方法で設定する必要が面倒で、この問題を自動的に解決する方法を探したかったです。提案? (すべてオプションをサポートします--highlight={light|dark|plain}

簡単なメカニズムは環境変数をオフにすることです。私のシェルプロファイルにはを使用してきましたが、すでに、、などDARK_BACKGROUND_COLORの基本名がある場合は、その名前を使用したいと思います。PAGEREDITORSHELLHOME

環境名のルールはありますか?他の提案?

編集する:許可された回答と議論に基づいて暗い背景(黒に技術的に白いテキスト)にDARK_BACKGROUND_COLORCOLORFGBG値の使用から明るい背景に(技術的に白いテキスト)に切り替えました。15;00;15

答え1

そのような合意はありません。また、プログラムがこの変数を更新しない他の端末エミュレーターを起動したり、プログラムが複数の端末に接続されている場合は値が最新になる可能性があるため、環境変数は端末に関する情報を報告するのに最適な方法ではありません。

TERM環境変数は普遍的であるため、これらの問題は発生しません。すべての端末エミュレータがこれを設定し、すべてのプログラムがこれを知っています。問題は、変数が部分的にサポートされている場合にのみ発生します。)

情報を取得する正しい方法は、端末に問い合わせることです。 Unixの世界では、端末が「私のクエリに応答するいくつかのデータを再送信する」と解釈するエスケープシーケンスを作成してこれを行います。 〜のようにトーマス・ディッキーは説明するxtermにはこれらの制御シーケンスがありますOSC 11 ; ? BEL(テキストパラメータの設定、パラメータ11 =テキストの背景色、値は?設定ではなくクエリを表します)。\e]11;?\aターミナル(ここで\eエスケープ文字(^[)と\aベル文字())に書き込むと、^Gxtermは同様の文字列\e]11;rgb:0000/0000/0000\a(黒い背景)で応答します。残念ながら、このエスケープシーケンスをサポートする他の端末エミュレータはほとんどありません。 xtermでもこの機能を無効にすることができます。XTerm.VT100.allowColorOpsリソース)これはセキュリティリスクがあるためです。ターミナルに書き込むと、書き込まれるテキストによって出力が部分的に制御される対応するターミナルに出力が発生する可能性があります。

Rxvtは、環境変数を前景色(7は明るい灰色)と背景色(黒色)の文字列COLORFGBGに設定します。 Konsoleもこれをサポートします。7;070

Emacsは、設定のために端末の背景が明るいか暗いかを検出しようとします。background-mode端末パラメータ。 Emacs 24.5以降、バックグラウンドモードを自動的に設定する3つの方法があります。

  • 存在するxterm、EmacsはOSC 11上記のようにエスケープシーケンスを使用します。
  • 存在する価値を得る、EmacsはCOLORFGBG上記のように環境変数を使用します。
  • 存在するオペレーティングシステムそしてWindowsコンソール、Emacsはオペレーティングシステム固有のインターフェイスを使用して端末に関する情報を取得します。これらのインターフェイスはエスケープシーケンスと同じ目的で使用されますOSC 11

これにより多くの端末が除外されますが、少し進歩があります。 vteライブラリは、gnome-terminal、guake、terminator、xfce4-terminalなどの多くの端末エミュレータのサポートを提供し、OSC 11xtermに似たレポートを実装します。バージョン0.35.2から。環境変数を確認してVTEベースの端末を検出できますVTE_VERSION。値は数値なので、3502以上が必要です。

情報がアプリケーションに報告される方法を標準化したい場合、最終的なサポートは重要ではないかもしれません。結局、明るい背景を好むか暗い背景を好むかがわかります。その後、rxvtに固執してを使用することをお勧めしますCOLORFGBG。なぜなら、誰かがすでに使用している唯一のインターフェースであり、端末サポートとは無関係に採用できるからです。インターフェイスはCOLORFGBG制限されています。 16色だけで、すべてが1色に同意する世界のために設計されています。色番号から色へのマッピング(少なくともおおよその正確な色合いはさまざまです)。 Konsoleは16色以上をサポートしていますが、レポートに近似値を使用しますCOLORFGBG。 16の標準色の1つで、前景色と背景色を近似します。明るいものと暗いものにのみ興味があるなら、問題はありません。暗い背景に明るいテキストCOLORFGBGに設定するか、明るい背景に暗いテキストに設定します。15;00;15

答え2

空です。自由に会議を開くことができます。

いくつかのプログラム(例:xterm)は、現在設定されている前景色と背景色をアプリケーションに提供できます(参照:「ダイナミックカラー」)。しかし、次のアプリに加えてxtermcontrol、それを使う人はほとんどいません。 Emacsは現在の背景色を照会して、background-modeカラーテーマの「暗い」または「明るい」バージョンを適用するかどうかを決定する端末パラメータを設定します。一方、Vimはxterm制御シーケンスを使用して、特殊キーを介して送信される色と文字列の数を制御できます(参照:"Termcap/Terminfo 文字列要求"存在するXTerm制御シーケンス)、前景色/背景色の感覚を検出できません。

答え3

思いやりのある答えに基づいてトーマス・ディッキーそしてザイルズそして、この回答のコメントでOSXについて何をすべきかについてまとめました。githubのスクリプト

重要なのは、背景と前景のRGBカラー値に基づいてxterm準拠のカラークエリを使用することです。それでも機能しない場合は、説明してCOLORFGBG失敗し、さまざまな端末に事前設定されたデフォルト値を使用してください。たとえば、xtermのデフォルト値は明るい背景です。

事前設定されたデフォルト値とRGB暗/明補間のコードは、GNU emacsコード(Gillesが提案したように)から派生します。

MS Windows固有のコードを追加していませんが、人々はそのコードに対して作業を実行したり、他の修正を追加したりするために自由にプール要求を送信する必要があります。

関連情報