Como obter um valor legível (por exemplo, RGB) de '\ e] 11;? \ a'?

3

A string \e]11;?\a presumivelmente produz a cor de fundo do terminal atual, mas não encontrei uma maneira de usar essa informação para obter a cor em um formato legível por humanos (por exemplo, RGB).

Eu tentei (sem noção)

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

mas não produz nada, ou pelo menos nada visível.

BTW, estou ciente de xtermcontrol --get-bg , mas quando eu o executo no terminal em que estou trabalhando, recebo o erro:

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

(O referido TROUBLESHOOTING section não forneceu qualquer alternativa).

BTW, omiti deliberadamente detalhes sobre o terminal que estou usando porque espero encontrar uma solução geral, em vez de uma que funcione apenas para um terminal específico.

    
por kjo 09.11.2015 / 17:19

2 respostas

3

Existem alguns problemas fundamentais com esta questão:

  1. Para que isso resulte em uma solução geral, o comando deve ser suportado por ANSI X3.64 , padrão básico para todos os terminais modernos , mas Tanto quanto eu posso dizer, isso não é um comando ANSI.

    Eu não tenho certeza porque não tenho uma cópia desse padrão, não consigo encontrar um on-line e o ANSI não sell eu um . Tudo o que posso encontrar on-line são bastardized "referências". Como eu descrevo em outro lugar , enquanto X3. 64 é o padrão de raiz de todos os terminais modernos comuns, essa observação é um pouco como mostrar que os cães descendem dos lobos: estudar lobos para aprender sobre cães impõe severas limitações ao escopo das coisas que você pode aprender.

    O melhor recurso que encontrei é a referência Sequências de Controle XTerm , mantida pela% atualxterm mantenedor. Mas, este não é um padrão normativo, apenas descreve o que um programa comum faz. Muitos programas são derivados do código-fonte xterm , mas, como os cães dos lobos, muitos divergiram significativamente.

    Eu suspeito que você encontraria, se você o perseguisse, que este comando foi introduzido por xterm como uma extensão para ANSI X3.64 e seu terminal de destino não suporta essa extensão xterm específica, e é por isso que xtermcontrol falha.

  2. Mesmo que o seu conjunto particular de terminais dê uma resposta a esse comando, não vejo os acima -referenciado documento que você vai obter um valor RGB. Você pode muito bem ter um nome de cor.

    (Esse é o tipo de detalhe que esperamos que um padrão normativo descubra, que é frequentemente negligenciado em documentos de descrição funcional.)

    Além disso, tenha em atenção que, mesmo que receba uma resposta R; G; B, a resposta pode variar. Se você definir sua cor usando os antigos códigos de cores ANSI X3.64, não há nenhum padrão dizendo a cor RGB para a qual eles mapeiam; de fato, todo programa de terminal familiar xterm que eu já usei, dá um jeito de mudar as cores RGB usadas para os códigos de cores ANSI. Além disso, você pode alterar esses valores rapidamente em alguns programas de terminal, para que duas execuções de programa separadas por uma execução de programa de terceiros possam dar respostas diferentes, porque o esquema de cores agora é diferente.

Existe outra resposta na rede SE que faz aproximadamente a mesma coisa que sua instrução print faz, mas como seu comando, o comando echo da outra resposta não recebe resposta do Terminal do OS X, que afirma ser um xterm-256color terminal. Isso significa que a solução nem funciona para todos os terminais da família xterm.

Eu escrevi um programa C mais robusto que diagnostica o erro se isso acontecer, e se não, mostra os valores de retorno em formato imprimível. Você pode achar que é uma base mais adequada para extensões do que comandos shell:

#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;
}
    
por 09.11.2015 / 19:13
3
Em primeiro lugar, é improvável que algum método alternativo (além de respostas a sequências de controle) possa ser a base de uma "solução geral" conforme solicitado pelo OP, uma vez que a propriedade solicitada não é (por exemplo) passível de métodos as propriedades da janela.

Em seguida, este é um exemplo de sequências de controle que são implementadas no xterm, mas geralmente não estão disponíveis. O desenvolvedor de xtermcontrol está ciente disso. Sua página discute sequências de controle xterm , comentários de que existem muitas delas (uma pletora ) e menciona que O OSX Terminal.app suporta alguns deles.

A mensagem de erro informada pelo OP é certamente clara o suficiente. O programa sem nome no qual o OP tentou executar xtermcontrol não suporta o recurso. Provavelmente, ele não suporta um recurso comparável que poderia ser usado em seu lugar.

Na prática, a maioria das sequências de controle do xterm não são implementadas em outros terminais, independentemente do uso pelo desenvolvedor de "xterm" para a descrição do terminal. Veja por exemplo o FAQ xterm Comparando versões, contando controles , e as ncurses FAQ Por que não usar apenas TERM definido como "xterm"? > (observando que "derivado do xterm source code" pode ser interpretado de mais de uma maneira).

Os terminais de interesse (talvez) para OP não têm documentação útil sobre quais sequências de controle implementam. Portanto, a única maneira de descobrir como "geral" é uma solução é testá-la exaustivamente. Isso não parece muito geral.

A resposta super-votada do Superusuário é o método usado por xtermcontrol . (O downvoted xrdb answer não fornecerá as configurações de cor atuais de xterm , apenas seus valores iniciais - talvez nem isso.)

    
por 10.11.2015 / 01:19