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

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

O comando tputtem duas opções diferentes para definir a cor setfe setaf, ainda assim, ambos 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?

Responder1

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

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

Ambos setfe setaffornecem um código de escape diferente. Você pode ver isso a seguir:

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

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

Da 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 como verde. tput setaf 2por outro lado utiliza o Pm = 38;5, que 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 "negritos" padrão. Quando chegar a 0x10-0xff, você obterá novas cores.

Roubado deWikipédia:

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

Responder2

Do manual:man 5 terminfo

Para alterar a cor atual de primeiro plano ou de fundo em um terminal do tipo Tektronix, useconjunto(definir primeiro plano ANSI) econjunto(definir plano de fundo ANSI) ouconjunto(definir primeiro plano) econjunto(definir plano de fundo). Eles levam um parâmetro, o número da cor. A documentação do SVr4 descreve apenasconjunto/conjunto; o rascunho do XPG4 diz que "Se o terminal suportar sequências de escape ANSI para definir plano de fundo e primeiro plano, elas deverão ser codificadas comoconjuntoeconjunto, respectivamente. Se o terminal suportar outras sequências de escape para definir plano de fundo e primeiro plano, elas deverão ser codificadas comoconjuntoeconjunto, respectivamente. A função vidputs() e as funções de atualização usamconjuntoeconjuntose estiverem definidos."

Então a resposta é:conjuntosignificaDefinir primeiro plano ANSI, ou seja, use sequências de escape ANSI econjuntosignificaDefinir primeiro plano(usando algumas sequências de escape diferentes de ANSI).

Responder3

Os dois conjuntos de recursos usam ordenações diferentes para vermelho/azul na lista de cores ANSI.

Conforme observado, é explicado nas ncursespágina de manual terminfo. Um pouco de história:

  • No início (meados da década de 1990), mais disponível"cor"descrições dos terminais 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 sequências de escape ANSI (que funcionam com termcap) em vez de usar ocorretocapacidades com as capacidades ANSI.
  • Por causa disso, você encontrará entradas de terminal com os dois equiparados, por exemplo,mgtermo,interix,beterm(bem como várias entradas no arquivo termcap do FreeBSD, novamente devido a esta confusão inicial combinada com a relutância de outros em alterar seus programas).

O ANSI setaf/setabfoi adicionado bem tarde na história do terminfo, como você pode deduzir de sua posição nolista de strings de capacidade. Lembre-se de que eles foram adicionados em etapas ao longo de alguns anos e alguns sistemas eram diferentes (o ncurses tem alguns exemplos, comoCaps.hpuxpara permitir que seja compilado para corresponder a esses sistemas). Isso explicava o pequeno número de descrições de terminais úteis que poderiam ser usadas como referência.

Com tudo isso, o fato de as setf/setbstrings existentes não corresponderem à ordem ANSI não foi imediatamente percebido, o que levou a algunscorreções em 1998e as perguntas frequentesPor que vermelho/azul são trocados?.

Embora fosse possível estender a sequência ANSI de 8 cores para 16 cores (supondo que as cores 8 a 15 eram versões mais brilhantes de 0 a 7), não havia nenhuma boa razão para inventar um esquema que se estendesse setf/setbalém das primeiras 16 cores.

informação relacionada