`\e]11;?\a` から人間が読み取ることができる(例:RGB)値を取得するにはどうすればよいですか。

`\e]11;?\a` から人間が読み取ることができる(例:RGB)値を取得するにはどうすればよいですか。

この文字列は\e]11;?\a現在端末の背景色を生成できますが、この情報を使用して人間が読み取ることができる(RGBなど)形式の色を取得する方法を見つけることができませんでした。

私は努力した(何もできなかった)

print -P '\e]11;?\a'

しかし、それは何も生産していないか、少なくとも目に見えるものはまったくありませんでした。

ところで、私もそれを知っていますがxtermcontrol --get-bg、私が使用している端末で実行すると次のようなエラーが発生します。

xtermcontrol: --get-bg is unsupported or disallowed by this terminal. \
See also, TROUBLESHOOTING section of xtermcontrol(1) manpage.

TROUBLESHOOTING section回避策は提供されていません。)

ところで、特定の端末でのみ動作するソリューションではなく、一般的なソリューションを探したいので、使用中の端末に関する詳細を意図的に省略しました。

答え1

この問題にはいくつかの基本的な問題があります。

  1. 一般的なソリューションを作成するには、コマンドをサポートする必要があります。ANSI X3.64、基本基準はすべての最新端末しかし、私が知っている限り、これはANSIコマンドではありません。

    標準のコピーがなく、オンラインで見つけることができず、ANSIもないので、わかりません。私に一つ売って。私がオンラインで見つけることができるのは、バカたちの「参考資料」だけでした。私が説明したように他の場所で、X3.64はすべての一般的な近代的なターミナルのルート標準ですが、この観察は犬がオオカミの子孫であることを指摘するのと少し似ています。オオカミを研究して犬について学ぶと、学ぶことができる範囲が厳しく制限されます。

    私が見つけた最高のリソースは次のとおりです。XTerm制御シーケンスxterm現在管理者が維持する参照です。しかし、これは標準的な標準ではなく、単に一般的なプログラムの機能を説明します。多くのプログラムはxtermソースコードから始まりますが、犬やオオカミのように多くのプログラムが大きく異なります。

    追跡してみると、このコマンドが次のように実行されたことがわかります。xtermこれはANSI X3.64の拡張であり、ターゲット端末がその特定のxterm拡張をサポートしていないためxtermcontrol失敗します。

  2. 特定の端末セットがすべてこのコマンドに応答しても表示されません。上記の文書RGB値が得られます。おそらく色の名前を取得します。

    (これは規範的な基準が決定すると期待する詳細ですが、機能説明書ではしばしば見落とされます。)

    また、R;G;Bの回答を受けても、回答が異なる場合があることを参考にしてください。xterm古いANSIを使用して色を設定する場合は、コードのRGB色です。また、一部のターミナルプログラムではこれらの値を動的に変更できるため、カラースキームが異なるため、サードパーティのプログラムによって別々に実行されている2つのプログラムは異なる回答を提供できます。

持つもう一つの答えSEネットワークでは、printあなたのステートメントとほぼ同じことを行いますが、あなたのコマンドと同様に、他の回答のechoコマンドはOS Xの端末から応答を取得しませんxterm-256color。これは、このソリューションがすべてのxtermシリーズ端末で機能するわけではありません。

私はエラーが発生した場合はそれを診断し、エラーが発生しない場合は印刷可能な形式で戻り値を表示するより強力なCプログラムを作成しました。シェルコマンドよりも拡張に適している可能性があります。

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

char reply[40];
size_t nr;

void timeout(int sn)
{
    if (nr > 0) {
        for (size_t i = 0; i < nr; ++i) {
            printf("Got char %d\n", reply[i]);
        }

        if (!sn) puts("WARNING: Buffer filled!");
    }
    else {
        puts("No reply from terminal.");
    }

    exit(0);
}

int main(void)
{
    signal(SIGALRM, timeout);
    alarm(1);
    printf("\e]11;?\a");

    for (nr = 0; nr < sizeof(reply); ++nr) {
        reply[nr] = getchar();
    }

    timeout(0);   /* buffer filled before alarm() timer went off! */
    return 0;
}

答え2

第1に、制御シーケンスに対する応答以外のいくつかの代替アプローチは、OPによって要求された「一般的な解決策」の基礎となる可能性がない。たとえば、探しているプロパティは、ウィンドウプロパティを使用するメソッドには適用されないためです。

以下は、xtermで実装されているが一般的には使用できない制御シーケンスの例です。開発者はxtermcontrolこれに気づきなさい。彼のページでは、次のように説明します。xterm制御シーケンス、意見によると、そのようなシーケンスがたくさんあるそうです(a過度)とOSXの言及ターミナルプログラムサポートする一部中。

OPが報告したエラーメッセージは確かに明確です。 OPが実行しようとしている名前のないプログラムはxtermcontrolこの機能をサポートしていません。おそらく、代わりに使用できる同様の機能をサポートしていません。

実際、ほとんどのxterm制御シーケンスは、開発者が端末記述として「xterm」を使用する方法に関係なく、他の端末では実装されていません。たとえば、xterm FAQを参照してください。数制御を使用したバージョンの比較、そしてncurses FAQなぜ「xterm」に設定されたTERMを使用しないのですか?(「xtermソースから派生した」はさまざまな方法で解釈できます。)

OPは(おそらく)自分が実装する制御シーケンスに関する有用な文書がない端末にもっと興味があるでしょう。したがって、現在持っているソリューションがどれだけ「一般的な」かを知る唯一の方法は、徹底的にテストすることです。これはあまり一般的ではないようです。

これ最高投票を受けたスーパーユーザーの回答使用される方法ですxtermcontrol。 (これ反対表を受け取ったxrdb回答現在の色設定は提供されておらず、xterm初期値のみが提供されます。たぶんその値ではないかもしれません。 )

関連情報