`\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;
}

おすすめ記事