Como posso alterar as cores do meu xterm usando seqüências de escape do Ansi?

22

Eu gostaria de mudar as cores (fundo, fonte, primeiro plano) do meu xterm da linha de comando. Ouvi dizer que isso pode ser feito usando seqüências de escape ANSI.

Se isso for possível:

  • Como isso é feito?
  • Posso usar nomes de cores ou devo usar seus códigos RGB?
por Nathan Fellman 13.04.2011 / 08:49

6 respostas

22

As seqüências de escape ANSI consistem em uma sequência de caracteres que começam com o caractere Escape, caractere 27. O caractere seguinte é frequentemente (embora nem sempre) um colchete aberto: [

O comando echo pode enviar caracteres de escape se você especificar -e e usar \e para escape.

O padrão ANSI define 8 cores, além de um modo brilhante, dando um total de 16 possibilidades. A sequência é:

\e[<number>m

Em que <number> é um dos seguintes:

Primeiro plano:

  • 30 preto
  • 31 vermelho
  • 32 Verde
  • 33 amarelo
  • 34 azul
  • 35 magenta
  • 36 Ciano
  • 37 branco

Antecedentes:

  • 40 preto
  • 41 vermelho
  • 42 Verde
  • 43 Amarelo
  • 44 azul
  • 45 magenta
  • 46 Ciano
  • 47 Branco

  • 0 Redefinir todos

  • 1 negrito

Para deixar o primeiro plano vermelho e o fundo amarelo:

$ echo -e "\e[31m\e[43m"

E para ativar o negrito:

$ echo -e "\e[1m"

Claro, você pode combiná-los todos juntos:

$ echo -e "\e[31m\e[43m\e[1m"

Existem muitos outros códigos de escape para fazer outras coisas.

Por exemplo, limpe a tela e mova o cursor para o canto superior esquerdo:

$ echo -e "\e[2J\e[1;1H"

O que é útil ao alterar a cor:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

O que mudará as cores, limpará a tela e colocará o cursor no canto superior esquerdo. Bem, quase no canto superior esquerdo. Echo coloca um retorno de carro, então ele se move para baixo de uma linha. Você pode adicionar -n ao eco para evitar isso se você for muito exigente.

Se você estragar tudo e não conseguir ver o que está digitando, pode redefinir as cores do terminal para normal pressionando:

Ctrl + v [ 0 m Retornar

No que você espera é o prompt de comando. Ele vai girar em torno de um comando desconhecido, mas você poderá ver o que está fazendo novamente.

    
por 13.04.2011 / 10:45
26

Note que o Xterms moderno suporta cores de 32 bits!

Exemplo simples. Para definir um bom fundo roxo escuro (ei, cada um com seu próprio valor), faça:

echo -ne "3]11;#53186f
echo -ne "3]11;#53186f%pre%7"
7"

Observe que isso muda instantaneamente a cor de toda a janela, não apenas do texto subseqüente. Isto é especialmente bom para fazer uma janela obviamente diferente depois de ssh'ing para um servidor (por exemplo). Coloque o 'eco' acima em seu .bashrc e seu terminal automaticamente muda de cor quando você acessa aquele servidor (mas não muda de volta quando você clica em Ctrl-D)

Você pode passar HORAS na rede procurando por isso - a maioria dos documentos só fala sobre as 16 cores ANSI originais.

Fontes: link e link (veja em "Controles do sistema operacional")

Por favor, note: a seqüência de escape acima é válida para XTerms, e pode não funcionar para outras implementações de emuladores de terminal em janelas "XTerm-like" que podem "parecer" um XTerm. Por exemplo, "gnome-terminal" ou "konsole" tem diferentes seqüências de escape, ou pode não implementar mudança de cor.

    
por 11.12.2011 / 11:36
3

Sim. Terminais ANSI suportam Códigos de escape ANSI . Cada código Control Sequence Introducer ( CSI ) no seguinte formato:

ESC[<<<CODE>>>

O caractere Ascii 27 (o caractere ESC ) ou 1b em hexadecimal, seguido por um colchete esquerdo e, em seguida, uma letra indicando a ação a ser usada.

Observe que uma lista de parâmetros separados por ; pode ser fornecida diretamente antes do parâmetro <<<CODE>>> .

Agora, as cores usam um subconjunto de códigos CSI , os códigos Select Graphic Rendition . Estas estão no formulário:

ESC[<<<SGR>>>m

O código SGR é passado como um parâmetro, o CSI . Relevante para sua pergunta são os códigos SGR 30-49. Os códigos 30 a 39 definem a cor do primeiro plano. Os códigos 40 a 49 definem a cor de fundo.

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

Os códigos 38 e 48 são códigos especiais. Estes são os que permitem usar valores RGB. O formato para estes é:

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

Nota: os usos alternativos incluem \x1b[<3 or 4>8;5;<web safe color index>m . Com esse uso, há uma codificação de cores completamente diferente. Veja o link no topo desta resposta para mais informações.

Os códigos 39 e 49 definem as cores de primeiro plano e plano de fundo para seus padrões, que são definidos por terminal-a-terminal.

Na prática, as cores 30-37 40-47 são ligeiramente diferentes do que seus rótulos dizem que são.

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

Para obter cores claras, use o SGI para negrito, 1 . Ousado é um nome enganador. Não torna a fonte em negrito. Na verdade, aumenta o brilho do texto. Com negrito aplicado, as cores tornam-se:

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

Aviso: os últimos dois blocos de números de cores são relevantes tanto para a frente quanto para o plano de fundo ( <index> + (30 or 40) ).

Para remover todos os estilos (de volta ao modo padrão / normal) use SGR 0.

CSI códigos não são todos gráficos. Por exemplo, ESC[2J limpará seu terminal. ESC[<y>;<x>H define a posição do cursor (1 indexado). Veja o artigo da wikipedia para mais informações.

Observação: para testá-los, use echo -e ou printf .

    
por 10.07.2015 / 03:06
2

NOTA: O "^ [" é o caractere de escape, e é inserido com um CTRL-V, CTRL- [e ^ G é um caractere de campainha, inserido com CTRL-V, CTRL-G

O bloco a seguir está em meu .bash_profile e garante que meus xterms neste sistema sejam SEMPRE branco sobre preto, mesmo depois de fazer login em outro sistema que possa ter alterado minhas cores.

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '
    
por 09.05.2012 / 02:34
0

verifique também um projeto ScriptEchoColor
é completamente feito em scripts bash
tem pacotes para o ubuntu aqui
mas esses scripts podem ser instalados em qualquer distro se você souber como (o último pode ser baixado do seu git também).

você pode usar nomes de cor curtos ou estendidos como:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

uma amostra:

Alémdisso,certifique-sededarumaolhadano xtermcontrol , para um controle mais extensivo sobre o xterm em si (não apenas o caracteres).

    
por 14.10.2014 / 18:14
0

Entre os muitos códigos CSI do ANSI, um é chamado SGR, ou Selecione Rendição Gráfica. Isso é ESC, [ , parâmetros, m , onde os parâmetros são um ou mais inteiros no formato ASCII, separados por ponto e vírgula. Os vários parâmetros SGR diferentes estão listados na página da Wikipedia acima (embora não entrem em detalhes completos para todos eles).

Alguns parâmetros, como 1 (negrito ou intensidade aumentada) e 31 (texto vermelho) são independentes e podem ser usados individualmente ou combinados, como em ESC[31m ou ESC[1;31m para fornecer um padrão texto vermelho e negrito em primeiro plano, respectivamente.

Outros usam parâmetros, que são simplesmente fornecidos após o código como mais números separados por ponto-e-vírgula. Portanto, por exemplo, ESC[38;5;219m exibiria o texto em primeiro plano no número de cor estendido 219 e ESC[38;2;150;100;50m o exibiria na cor com valor RGB 150, 100, 50. Nesse caso, 38 é o "conjunto estendido de primeiro plano color "comando, que é sempre seguido por um subcomando. O subcomando 2 usa três parâmetros, os valores dos componentes vermelho, verde e azul. Diferentemente, o subcomando 5 recebe apenas mais um valor, um número de 0 a 255, especificando uma cor de uma tabela na qual o terminal está configurado.

A seguinte função shell pode ser útil para usar estes códigos:

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

Você pode usá-lo assim:

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

Observe que, se você não fornecer nenhum parâmetro para sgr() , o padrão será o código SGR 0, o que significa desativar todos os atributos, redefinindo o texto para qualquer que seja o padrão para esse terminal.

    
por 31.08.2016 / 06:50