Sei que, se um terminal colorido estiver disponível, é possível colorir a saída usando caracteres de escape .
Mas existe a possibilidade de descobrir de que cor a saída está sendo exibida atualmente? Ou melhor, qual a cor do texto, se eu o exibisse agora?
Estou pedindo para não quebrar nenhuma configuração de cor anterior ao usar esses caracteres de escape. O caractere de escape 'cor de primeiro plano padrão' está obtendo informações do esquema de cores, em vez da cor do texto antes de eu a alterar.
colors
console
escape-characters
Minix
fonte
fonte
echotc Co
ouechoti colors
, mas simplesmente não existe uma variável que armazene a definição atual do código de cores.Respostas:
Em geral, é impossível obter as cores atuais. O processamento da sequência de controle de um terminal acontece "dentro" do terminal, onde quer que esteja. Com um emulador de terminal como
xterm
aquele ou construído em um kernel do sistema operacional que fornece os terminais virtuais do kernel, o estado interno do emulador, incluindo sua noção da "representação gráfica" atual (cor e atributos), está na máquina em si e é teoricamente acessível. Porém, para um terminal real, essas informações estão em algum local de RAM em uma máquina fisicamente separada conectada por um link serial.Dito isto, alguns terminais incluem um mecanismo para ler essas informações como parte de seu protocolo de terminal, que é enviado através desse link serial. Eles fornecem sequências de controle que um programa pode enviar para o terminal, que faz com que ele retorne informações sobre seu estado interno, como entrada do terminal.
mikeserv
mostrou as seqüências de controle às quais oxterm
emulador de terminal responde. Mas estes são específicos paraxterm
. Os emuladores de terminal integrados no kernel Linux e os vários kernels BSD são diferentes tipos de terminal, por exemplo, e não implementam nenhuma dessas seqüências de controle. O mesmo vale para famílias inteiras de terminais reais.Os terminais DEC VT525 implementam um mecanismo de leitura, mas possuem um conjunto de seqüências de controle que não têm relação com as utilizadas por
xterm
. Um envia a sequência DECRQSS (Solicitar seleção ou configuração) para solicitar a representação gráfica atual e o terminal responde enviando o DECRPSS (Seleção ou configuração de relatório). Especificamente:$
q
m
ST (DECRQSS com a parte da função de controle do SGR como a configuração)0
$
r
0
;
3
3
;
4
4
m
ST (DECRPSS com os parâmetros e a função de controle parte de uma sequência de controle SGR que define as cores atuais do primeiro plano e do segundo plano)Obviamente, uma leitura cuidadosa da sua pergunta revela que você está sacudindo uma banana com cobertura de chocolate nos sistemas monetários europeus novamente. O que você está realmente tentando fazer, para o qual você selecionou uma solução e depois perguntou como fazer parte dessa solução, é preservar o estado anterior enquanto você escreve alguma saída colorida. Não apenas existe uma sequência de controle DEC VT para fazer isso, mas também uma sequência de terminal do console SCO que é reconhecida por
xterm
vários emuladores de terminal integrados ao kernel e uma entrada termcap / terminfo que informa o que eles são para o seu terminal.As entradas do termcap são
sc
erc
. As entradas terminfo sãosave_cursor
erestore_cursor
. Os nomes são um tanto enganadores quanto ao efeito (embora eles atuem como um aviso de que você está confiando em algo que é de fato, e não de jure ). As seqüências de controle DECSC, DECRC, SCOSC e SCORC atuais também salvam e restauram a representação gráfica atual.Dado que o artigo que você apontou tem como objetivo gerar seqüências de controle a partir de shell scripts, o comando que você está procurando agora é
tput
.Leitura adicional
fonte
sc
erc
, você também pode querer procurar no buffer alternativo se o seu terminal suportar. E sim, esta é uma ótima resposta. Minix, talvez também veja isto: como usar / dev / fb0 como um console no espaço do usuário . Anosh
suíte que ele recomenda é a dele.DECRQSS
(atraso de aproximadamente 7 anos ...).Em um
xterm
é possível obter os códigos de cores RGB atuais relatados alterando um escape de alteração de cor para uma consulta. Use oESC ] Ps m
- mas adicione um?
ponto de interrogação. Dos documentos :"?"
for fornecido em vez de um nome ou especificação RGB,xterm
responde com uma sequência de controle do mesmo formulário que pode ser usada para definir a cor dinâmica correspondente. Como mais de um par de número de cores e especificação pode ser fornecido em uma sequência de controle, éxterm
possível fazer mais de uma resposta.Tenho sérias dúvidas se isso provavelmente funcionará em outro emulador de terminal, mas em um
xterm
se você executar ......
xterm
empurrará de volta para o buffer de entrada do terminal uma sequência como a seguinte ...... em segundo plano ou em primeiro plano:
fonte
printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007
, todo o texto no terminal que antes era "normal" ficava em azul claro. Posteriormente, a execuçãoprintf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'
retorna todo o texto azul claro para "normal". Como uso esse valor para alterar apenas a cor do texto no futuro?clear
primeiro?printf '\033]10;?\007'
consulta xterm para ver a cor atual do primeiro plano do terminal. Se o seu terminal foi iniciado com "normal" (por exemplo, 7 como a cor do primeiro plano), mas você executatput setaf 3
antes de executar oprintf
comando, oprintf
comando acima ainda retorna "normal" - e está certo, porque essa é a cor atual do primeiro plano do seu terminal. O que eu esperava era uma maneira de recuperar a cor atual da posição atual do cursor para que eu pudesse salvá-la para "restaurá-la" mais tarde - conforme o OP.xterm
o mantenedor e é um membro ativo aqui. (o link é para o seu website -xterm
's docs de fuga são extensos - e, basicamente, a referência padrão para qualquer outro programador querendo escrever um terminal)