Qual é a diferença entre 'setf' e 'setaf' do tput?

17

O comando tputpossui duas opções diferentes para definir a cor setfe setaf, no entanto, ambas parecem funcionar bem no meu computador:

$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'

Parece haver uma dualidade semelhante com setbe setab.

Qual é a diferença entre as duas opções?

IQAndreas
fonte
1
Veja a terminfo(5)página de manual que acompanha ncursespara obter detalhes.
Stéphane Chazelas

Respostas:

15

setfé limitado a apenas 8 cores. setafpode configurar até 256 cores.

(todas as informações a seguir serão específicas para o urxvt, como esse é o meu terminal, mas as informações serão semelhantes, se não iguais, aos outros terminais)

Ambos setfe setaffornecem um código de escape diferente. Você pode ver isso da seguinte maneira:

# tput setf 2 | xxd  
0000000: 1b5b 3332 6d                             .[32m

# tput setaf 2 | xxd 
0000000: 1b5b 3338 3b35 3b32 6d                   .[38;5;2m

Na minha urxvt(7)página de manual:

   "ESC [ Pm m"
       Character Attributes (SGR)
       ...
       Pm = 30 / 40       fg/bg Black
       Pm = 31 / 41       fg/bg Red
       Pm = 32 / 42       fg/bg Green
       Pm = 33 / 43       fg/bg Yellow
       Pm = 34 / 44       fg/bg Blue
       Pm = 35 / 45       fg/bg Magenta
       Pm = 36 / 46       fg/bg Cyan
       Pm = 37 / 47       fg/bg White
       Pm = 38;5 / 48;5   set fg/bg to colour #m (ISO 8613-6)

Assim, a partir da xxdsaída acima , podemos ver que tput setf 2usa o Pm = 32, que definirá a cor para verde. tput setaf 2por outro lado, usa o Pm = 38;5, que obtém representa o código de cores definido na ISO 8613-6 (também verde).
Na ISO 8613-6, as cores 0x00-0x07 são iguais às cores padrão e 0x08 - 0x0f são as cores "negrito" padrão. Depois de chegar a 0x10-0xff, você obtém novas cores.

Roubado da wikipedia :

0x00-0x07:  standard colors (as in ESC [ 30..37 m)
0x08-0x0f:  high intensity colors (as in ESC [ 90..97 m)
0x10-0xe7:  6*6*6=216 colors: 16 + 36*r + 6*g + b (0≤r,g,b≤5)
0xe8-0xff:  grayscale from black to white in 24 steps
Patrick
fonte
tputparece não usar realmente os intervalos de sequência de cores ANSI disponíveis. Para qualquer n > 7, tput setaf nnão tem efeito sobre o texto no meu terminal.
Kyle Strand
Na verdade, isso poderia ser apenas uma peculiaridade do meu ambiente; para mim as saídas tput setf 2e tput setaf 2são ambos .[32m .
Kyle Strand
5

Do manual: man 5 terminfo

Para alterar a cor atual do primeiro plano ou do plano de fundo em um terminal do tipo Tektronix, use setaf (definir primeiro plano ANSI) e setab (definir segundo plano ANSI) ou setf (definir primeiro plano) e setf (definir primeiro plano) e setb (definir plano de fundo). Estes levam um parâmetro, o número da cor. A documentação do SVr4 descreve apenas setaf / setab ; o rascunho XPG4 diz que "Se o terminal suportar seqüências de escape ANSI para definir o plano de fundo e o primeiro plano, elas deverão ser codificadas como setaf e setab , respectivamente. Se o terminal suportar outras seqüências de escape para definir o plano de fundo e o primeiro plano, elas deverão ser codificadas como setf e setb, respectivamente. A função vidputs () e as funções de atualização usam setaf e setab se estiverem definidas. "

Portanto, a resposta é: setaf significa Definir primeiro plano ANSI , ou seja, use sequências de escape ANSI, e setf significa Definir primeiro plano (usando algumas seqüências de escape que não sejam ANSI).

Will Sheppard
fonte
3

Os dois conjuntos de recursos usam pedidos diferentes para vermelho / azul na lista de cores ANSI.

Como observado, é explicado na página de manual do ncurses terminfo . Alguma história:

  • No início (meados dos anos 90), a maioria das descrições de terminais "coloridas" disponíveis eram usadas setf/setb.
  • Houve alguma confusão com os usuários do termcap que usaram os Sf/Sbcódigos correspondentes em vez de setaf/setab(e AF/ABpara termcap) - mas usando as seqüências de escape ANSI (que funcionam com termcap) em vez de usar os recursos corretos com os recursos ANSI.
  • Por isso, você encontrará entradas terminais com as duas equações , por exemplo, mgterm , interix , beterm (assim como várias entradas no arquivo termcap do FreeBSD, novamente devido a essa confusão inicial combinada com a relutância de outras pessoas em alterar seus programas).

O ANSI setaf/setabfoi adicionado bastante tarde no histórico do terminfo, como você pode inferir de sua posição na lista de cadeias de recursos . Lembre-se de que eles foram adicionados em etapas ao longo de alguns anos e alguns sistemas diferiram (o ncurses tem alguns exemplos, como Caps.hpuxpermitir que ele seja compilado para corresponder a esses sistemas). Isso foi responsável pelo pequeno número de descrições úteis de terminais que poderiam ser usadas como referência.

Com tudo isso, o fato de as setf/setbseqüências existentes não corresponderem à ordem ANSI não foi percebido imediatamente, o que levou a algumas correções em 1998 , e as perguntas frequentes Por que as trocas de vermelho e azul? .

Embora fosse possível estender a sequência ANSI de 8 cores para 16 cores (supondo que as cores 8 a 15 fossem versões mais brilhantes de 0 a 7), não havia boas razões para inventar um esquema para estender setf/setbas 16 primeiras cores.

Thomas Dickey
fonte