Não é possível aplicar brilho à cor de fundo do terminal

Não é possível aplicar brilho à cor de fundo do terminal

Tenho um problema com cores no meu emulador de terminal. Estou usando LXTerminalcomo emulador de terminal e LXDEcomo ambiente de área de trabalho.

O seguinte comando deve imprimir texto vermelho em fundo cinza:

printf "\n\033[1;31;40m"hello"\033[00m\n\n"

mas isso não funciona. O fundo cinza está faltando (o texto em vermelho está OK). Na minha máquina mais antiga ( Gnome/Gnome Terminal) tudo funciona bem

Tentei instalar vários outros emuladores de terminal, mas o problema persiste. Nem tenho certeza se esse problema está relacionado ao emulador de terminal ou a outra coisa. No Console (CTRL+ALT+F1) a cor cinza de fundo não funciona em nenhuma das máquinas)

Este problema está limitado apenas ao fundo cinza. Todas as outras cores funcionam bem, por exemplo, o seguinte imprime texto vermelho sobre fundo verde.

printf "\n\033[1;31;42m"hello"\033[00m\n\n"

Eu apreciaria qualquer ajuda. Eu nem sei por onde começar a solução de problemas.

Responder1

Existem oito cores ANSI padrão, suportadas por todos os emuladores de terminal. A maioria dos emuladores de terminal também possui oito variantes brilhantes das cores ANSI padrão.

No entanto, os valores reais das cores mapeados pelos códigos de escape não são padronizados e, na verdade, geralmente variam ligeiramente entre os emuladores de terminal. Portanto, se você printf "\e[31;47mTest\n"imprimir texto vermelho em um fundo branco, os tons reais de vermelho e branco obtidos poderão ser diferentes dependendo do emulador de terminal usado.

Isso explica parcialmente o problema: os valores das cores não são padrão e LXTerminalpodem ter padrões diferentes para sua paleta de cores com os quais você não está acostumado. Se você olhar em volta nas configurações, normalmente poderá configurar o esquema de cores como quiser.

O outro problema que você enfrenta é que o que o atributo negrito realmente faz também não é padronizado. Existem três possibilidades: pode tornar a fonte em negrito, pode tornar a cor do primeiro plano mais brilhante ou pode tornar a cor do primeiro plano mais brilhante e tornar a fonte em negrito.

Novamente, o comportamento padrão aqui varia entre os emuladores de terminal e geralmente você pode alterá-lo se encontrar a configuração correta. Grep para algo que mencione 'negrito' ou 'brilhante'.

Se quiser usar uma cor brilhante, você pode usar os chamados códigos de escape de cores aixterm em vez de negrito. Eles não são padrão, mas são suportados em todos os emuladores de terminal modernos que conheço. Ao contrário do negrito, eles sempre usam cores brilhantes, além de poderem ser usados ​​para exibir cores de fundo brilhantes.

Por exemplo, se você quisesse imprimir um texto vermelho brilhante sobre um fundo branco brilhante, faria o seguinte: printf "\e[91;107mTest\n".

Para referência, aqui está uma tabela com todos os códigos de escape de cores:

|    ANSI |    ANSI |    ANSI    |                | Aixterm | Aixterm 
|   Color | FG Code | BG Code    | Bright Color   | FG Code | BG Code 
+---------+---------+--------    +----------------+---------+-------- 
|   Black |      30 |      40    |   Bright Black |      90 |     100 
|     Red |      31 |      41    |     Bright Red |      91 |     101 
|   Green |      32 |      42    |   Bright Green |      92 |     102 
|  Yellow |      33 |      43    |  Bright Yellow |      93 |     103 
|    Blue |      34 |      44    |    Bright Blue |      94 |     104 
| Magenta |      35 |      45    | Bright Magenta |      95 |     105 
|    Cyan |      36 |      46    |    Bright Cyan |      96 |     106 
|   White |      37 |      47    |   Bright White |      97 |     107 

Responder2

O 1atributo no início 1;31;40ativa o modo "negrito" (também conhecido como "brilhante"), mas alguns terminais aplicam isso apenas à cor de primeiro plano. Não tenho ideia do motivo (e alterar a variável $TERM não faz diferença), já que eles suportam 16 cores em primeiro plano. 1 0 (de 40: 4 = fundo, 0 = a cor) é na verdade preto, mas “preto brilhante” é cinza. Aqui estão duas soluções:

  • A cor 7 (branco) provavelmente será cinza, não branca (para o branco verdadeiro, você precisa de "branco brilhante", o que significa que o fundo que você realmente não pode ter é branco).

  • Você deve poder usar o terminal gnome no LXDE, se quiser. Basta instalá-lo e começar com gnome-terminal(acredito que esse seja o nome do comando). Então você terá que configurar quaisquer lançadores para usar isso em vez do terminal lx.

1 Aqui está o meu palpite: observe que definir negrito aplica brilho à cor de primeiro planoeadiciona uma ênfase ousada. Portanto, você não pode usar uma cor de primeiro plano brilhante sem aplicar negrito. Presumivelmente, quando os terminais monocromáticos eram comuns, simplesmente definir negrito para dar ênfase, por exemplo: \\033[1mBlah blah\\033[0mera comum - e na verdade isso ainda funcionará, mas também tornará a cor do primeiro plano mais brilhante. Se considerássemos indesejável que isso também iluminasse o fundo (porque deveria ser ousado), então teríamos certeza de que a implementação não faria isso. Ah bem.

Responder3

Aqui está um truque que você pode usar com alguns emuladores de terminal. Ele fornecerá cores de fundo brilhantes usando o atributo vídeo reverso (7) para selecionar uma cor de primeiro plano brilhante e, em seguida, trocá-la pela cor de fundo.

echo -e "\e[1;32;7mText on a bright green background"

O problema é que embora agora você possa ter 16 cores de fundo, a limitação de 8 cores agora se aplica ao primeiro plano/texto. E para confundir ainda mais as coisas, enquanto o atributo vídeo reverso estiver ativo, você deve definir a cor do texto usando os códigos de atributo para cores de fundo!

Responder4

Em 47=background whitevez de 40=background blackvocê obtém o branco sem negrito como plano de fundo.

]# printf "\033[0;30;47m"hello"\033[00m\n"
hello (black on grey)
]# printf "\033[1;30;47m"hello"\033[00m\n"
hello (darkgrey on grey)
]# printf "\033[1;37;47m"hello"\033[00m\n"
hello (white on grey)
]# printf "\033[0;37;47m"hello"\033[00m\n"
hello (INVISIBLE grey on grey)

O preto em negrito resulta em cinza escuro, por padrão. O branco normal é na verdade cinza, porque o branco em negrito é branco.


Este loop imprime duas colunas com todas as combinações de cor sobre preto e branco sobre cor.

for ((i=30; i<=47; i++))
do
    echo -en  "\e[${i}mHello\e[0m";
    echo -e "\e[1;${i}mHello\e[0m";
done

Começa com preto invisível e cinza escuro sobre preto, mas as outras 17 linhas ficam bonitas e mostram toda a paleta de cores do console.

(38 e 39 devem ser omitidos, mas para simplificar, apenas corro de 30 a 47)


Aceito A. mençõesoitocores e falta de padrões.

As seis cores 31-36 (vermelho a ciano) estão bem definidas. Preto (30) e Branco (37) também, mas suas variantes menos ousadas, principalmente como fundo (40 e 47).


Acabei de notar: no xterm o texto branco normal é visível em fundo cinza, mas no console Linux não. (última linha, com i=47) (até 30 minutos atrás o script parava em 46, porque eu não queria variantes ilegíveis)

Em ambos os lugares, quando selecionado com o mouse, ele se adapta habilmente e permanece legível quando invertido.

informação relacionada