O suporte de terminal para cores é especificado por vários padrões, por exemplo, ECMA-48 ou padrões posteriores que adicionaram mais cores. Nos dias de hoje, os terminais são em sua maioria janelas virtuais e não dispositivos de hardware dedicados e o terminal emulado geralmente pode ser alterado, definindo a TERM
variável de ambiente - pode-se emular um terminal que não suporta cores , por exemplo.
Para terminais modernos, se você deseja cores, o conselho usual é ativar o suporte a 256 cores, geralmente via TERM=xterm-256color
, já que os padrões antigos só especificam muito menos cores. Vários documentos detalham os códigos exatos usados para gerar cores, e isso pode ser feito manualmente
% print "3[31;5mDANGER DANGER WILL ROBINSON3[0m"
...
embora para portabilidade, geralmente é melhor usar uma biblioteca como ncurses
ou na sua sintaxe ZSH específica para os vários códigos de cores
% print -P '%F{red}DANGER%f'
...
% print -P '%F{red}DANGER%f' | hexdump -C
00000000 1b 5b 33 31 6d 44 41 4e 47 45 52 1b 5b 33 39 6d |.[31mDANGER.[39m|
00000010 0a |.|
00000011
% print "3[31;5mxxx3[0m" | hexdump -C
00000000 1b 5b 33 31 3b 35 6d 78 78 78 1b 5b 30 6d 0a |.[31;5mxxx.[0m.|
0000000f
O que o oh-my-zsh está fazendo é agrupar bits aleatórios de código similares aos acima (eventualmente) gerar algo como os códigos 3[31m
mostrados acima que são consumidos pelo terminal e exibidos (ou não). Como o terminal manipula esses códigos é até o terminal, 3[31m
("cor de primeiro plano") pode ser exibido como verde (ou ignorado); conjuntos de tais configurações de cores no terminal podem ser chamados de temas pelo software do terminal; isso é completamente diferente dos temas do oh-my-zsh, apesar de usar o mesmo nome.