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

7

Eu tenho um problema com cores no meu emulador de terminal. Estou usando LXTerminal como meu emulador de terminal e LXDE como meu ambiente de área de trabalho.

O seguinte comando deve imprimir texto vermelho em fundo cinza:

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

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

Eu tentei instalar vários outros emuladores de terminal, mas o problema persiste. Eu nem tenho certeza se esse problema está relacionado ao emulador de terminal ou a alguma 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 em fundo verde.

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

Eu gostaria de receber ajuda. Nem sei por onde começar a solução de problemas.

    
por Martin Vegter 06.10.2013 / 17:45

2 respostas

8

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 padrão ANSI.

No entanto, os valores de cor reais que os códigos de escape mapeiam não são padronizados e, na verdade, eles variam um pouco entre os emuladores de terminal. Portanto, se você usar printf "\e[31;47mTest\n" para imprimir texto vermelho em um fundo branco, os tons reais de vermelho e branco que você obtém podem ser diferentes dependendo do emulador de terminal usado.

Isso explica parcialmente o problema: valores de cores não são padrão e LXTerminal pode ter padrões diferentes para sua paleta de cores que você não está acostumado. Se você olhar em volta nas configurações, geralmente você pode configurar o esquema de cores para ser o que quiser.

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

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

Se você quiser usar uma cor brilhante, poderá usar os chamados códigos de escape de cor aixterm em vez de negrito. Estes não são padrão, mas são suportados em todos os emuladores de terminal modernos que eu conheço. Ao contrário de 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 em vermelho vivo em um fundo branco brilhante, você faria isso: 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 
    
por 07.10.2013 / 02:00
5

O atributo 1 no início de 1;31;40 ativa o modo "negrito" (também conhecido como "brilhante"), mas alguns terminais só aplicam isso à cor de primeiro plano. Não sei por que razão (e mudar a variável $ TERM não faz diferença), pois eles suportam 16 cores no primeiro plano. 1 0 (de 40 : 4 = background, 0 = a cor) é na verdade preta, mas "preto brilhante" é cinza. Aqui estão duas soluções:

  • A cor 7 (branca) provavelmente ficará cinza, não branca (para 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 do gnome no LXDE, se quiser. Basta instalá-lo e começar com gnome-terminal (acredito que seja o nome do comando). Então você terá que configurar qualquer lançador para usar isso em vez do terminal lx.

1 Aqui está o meu palpite: Observe que a configuração negrito aplica brilho à cor de primeiro plano e adiciona uma ênfase em negrito. Portanto, você não pode usar uma cor de primeiro plano brilhante sem aplicar negrito. Presumivelmente, quando os terminais monocromáticos eram comuns, simplesmente configurando negrito para ênfase, por exemplo: \033[1mBlah blah\033[0m era comum - e, na verdade, isso ainda funcionará, mas também tornará a sua cor de primeiro plano mais clara. Se considerássemos indesejável que isso também clareasse o plano de fundo (porque é suposto que seja em negrito), então nos certificaríamos de que a implementação não fizesse isso. Oh bem.

    
por 06.10.2013 / 18:21