Defina, faça backup e restaure cores no terminal

1

Eu uso este programa para exibir todas as cores disponíveis no terminal. Que eu recebo:

  1. Este programa não mostra as cores abaixo de 100. Por quê? Existe uma maneira de exibi-los.
  2. Esta é a maneira de mudar a cor n-ésimo para algum valor #rrggbb? Ou esta cores é pré-definida?
  3. Se eu puder mudar as cores (consulte a pergunta 2), há uma maneira de exportar e importar esses valores?
por demas 01.08.2015 / 14:42

4 respostas

4

Quantas cores são suportadas e como alterar a cor de primeiro e segundo plano depende do terminal.

O banco de dados terminfo geralmente está lá para ajudá-lo a encontrar a seqüência correta.

A maioria dos terminais de cores suporta as sequências de escape de cores ANSI para alterar as cores de fundo e de fundo 0 a 7 .

Isso é:

  • definir cor de primeiro plano $ n : printf "[3${n}m"
  • definir a cor de fundo $ n : printf "[4${n}m"

Alguns terminais (raros) (como emu ) usam sequências diferentes para essas cores ANSI.

Alguns terminais (raros) como o console QNX possuem diferentes seqüências de escape e cores diferentes.

Alguns trabalhos (raros) com pares de cores. Você define um par de cores para o fundo e o primeiro plano e, em seguida, tem uma seqüência de escape para selecionar o par que deseja usar.

Agora, xterm e os mais modernos emuladores de terminal de Software Livre estendem as 8 cores ANSI básicas, até 16 (onde 8 a 15 são versões mais brilhantes das cores ANSI 0 a 7), 88 ou 256 cores para alguns. p>

Alguns terminais como rxvt suportam apenas 8 cores, mas usam cores mais brilhantes se negrito também estiver aceso (em primeiro plano) ou piscar (em segundo plano) . 3[34;1m dará um azul mais claro que 3[34m .

A maneira mais portátil de usar cores é usar o banco de dados terminfo.

Pode ser pelo comando tput . tcsh e zsh também têm echoti embutido para isso.

Desde que o banco de dados terminfo esteja correto e o valor de $TERM reflita corretamente o terminal que você está usando:

tput colors

Fornecerá o número de cores compatíveis com seu terminal.

Hoje em dia, exceto pelas raras exceções mencionadas acima, você pode assumir que seu terminal suportará cores ANSI. Os recursos terminfo para as cores de plano de fundo e de primeiro plano do ANSI são setab e setaf . Se o terminal suporta mais de 8 cores, você ainda pode usar essa capacidade para consultá-las.

tput setaf 233

Se o terminal suportar 256 cores, deve-se emitir a sequência de escape correta para essa cor 233.

Para xterm , setaf outputs 3[30m..3[37m para cores 0 a 7, 3[90m..3[97m para cores 8 a 15 e 3[38;5;16m..3[38;5;255m para cores 16 a 255.

3[38;5;0m..3[38;5;15m também funcionará, mas terá 4 bytes a mais que seu equivalente mais portátil para as cores de 0 a 15.

Então, para testar todas as cores suportadas pelo terminal. Se ele suporta cores ansi:

i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
  tput setaf "$i"; printf %04d "$i"
  i=$((i + 1))
done

Se ele suportar outras cores:

i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
  tput setf "$i"; printf %04d "$i"
  i=$((i + 1))
done

Se funciona com pares de cores (como hpterm-color):

i=0; n=$(tput pairs); while [ "$i" -lt "$n" ]; do
  tput scp "$i"; printf %04d "$i"
  i=$((i + 1))
done

Agora, para redefinir uma cor ou um par de cores, isso também varia entre os terminais.

Há um recurso initc terminfo para redefinir uma determinada cor para os terminais que podem fazê-lo. E initp para redefinir um par.

Por exemplo, para redefinir a cor 1 como branco brilhante:

 tput initc 1 1000 1000 1000

Com xterm , que envia a sequência: 3]4;1;rgb:FF/FF/FF3\ .

Para redefinir o par de cores 1 para branco em preto nos terminais que trabalham com pares:

 tput initp 1 1000 1000 1000 0 0 0
    
por 01.08.2015 / 21:53
1

Como você está usando gnome-terminal , não há necessidade de alterar os valores RGB. Recentes gnome-terminal (desde o v. 3.12) suportam cores verdadeiras de 24 bits (16 milhões). Você pode defini-los com \e[38;2;R;G;B . Por exemplo

printf '\e[38;2;100;200;200mTest\e[0m\n'

Se você vir um texto azul, seu terminal suporta cores de 24 bits.

No entanto, se você quer ficar com 256 cores eu recomendo o seguinte script para exibir todas as possibilidades, que as exibe dispostas em blocos para pegar facilmente o desejo (com menos ou mais de algum componente RGB):

#!/bin/bash

trap 'echo "Bye"; exit 1' INT

echo "PALETTE OF 8 COLORS"
for i in {30..37}; do printf "\e[1;${i}mTest%-3u \e[0m" "$i"; done; echo
for i in {90..97}; do printf "\e[${i}mTest%-3u \e[0m" "$i"; done; echo
for i in {30..37}; do printf "\e[${i}mTest%-3u \e[0m" "$i"; done; echo
for i in {30..37}; do printf "\e[2;${i}mTest%-3u \e[0m" "$i"; done; echo -e "\n"

echo "PALETTE OF 256 COLORS"
j=8
for i in {0..255}; do
    [[ $i = 16 ]] && j=6
    [[ $i = 232 ]] && j=24
    printf "\e[38;5;${i}mTest%-3u \e[0m" "$i"
    [[ $(( $(( $i - 15 )) % $j )) = 0 ]] && echo
    [[ $(( $(( $i - 15 )) % $(( $j * 6 )) )) = 0 ]] && echo
done
exit 0
    
por 01.08.2015 / 21:27
0

Como descobri, posso obter todas as cores

for i in {0..255} ; do printf "\x1b[38;5;${i}mcolour${i}\n"; done

É possível alterar os valores RGB em ~/.Xresources da seguinte forma:

xterm*color4: CornflowerBlue
URxvt*color1  : #ff0000
URxvt*color8  : #888888

mas nem todos os emuladores de terminal respeitam esses valores. URXVT , gnome-terminal não faz

    
por 01.08.2015 / 20:47
0

O programa é buggy, pois preenche os números com espaços para 3 caracteres. Por exemplo. imprime " [[48;5; 42m (com espaço) que não funciona em vez de ^[[48;5;42m (sem espaço) que funcionaria.

    
por 16.08.2015 / 13:58