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

18

O comando tput tem duas opções diferentes para definir cor, setf e setaf , mas as duas parecem funcionar bem no meu computador:

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

Parece haver uma dualidade semelhante com setb e setab .

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

    
por IQAndreas 24.06.2014 / 23:27

3 respostas

16

setf está limitado a apenas 8 cores. setaf pode configurar até 256 cores.

(todas as informações a seguir serão específicas para o urxvt, já que este é o meu terminal, mas as informações serão semelhantes, se não as mesmas, a outros terminais)

Tanto setf como setaf fornecem 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

Da minha página de urxvt(7) man:

   "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, da saída xxd acima, podemos ver que tput setf 2 usa o Pm = 32 , que definirá a cor como verde. tput setaf 2 por outro lado usa Pm = 38;5 , que gets 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. Quando chegar em 0x10-0xff, você obtém novas cores.

Roubado de 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
    
por 24.06.2014 / 23:50
3

Do manual: man 5 terminfo

To change the current foreground or background color on a Tektronix-type terminal, use setaf (set ANSI foreground) and setab (set ANSI background) or setf (set foreground) and setb (set background). These take one parameter, the color number. The SVr4 documentation describes only setaf/setab; the XPG4 draft says that "If the terminal supports ANSI escape sequences to set background and foreground, they should be coded as setaf and setab, respectively. If the terminal supports other escape sequences to set background and foreground, they should be coded as setf and setb, respectively. The vidputs() function and the refresh functions use setaf and setab if they are defined."

Portanto, a resposta é: setaf significa Definir primeiro plano ANSI , ou seja, usar sequências de escape ANSI e setf significa Definir primeiro plano (usando algumas seqüências de escape diferentes de ANSI).

    
por 30.09.2014 / 14:36
3

Os dois conjuntos de recursos usam ordenação diferente para vermelho / azul na lista de cores ANSI.

Como mencionado, isso é explicado na página de manual terminfo . Alguma história:

  • Logo no início (meados dos anos 90), a maioria das descrições de terminais "coloridas" usadas setf/setb .
  • Houve alguma confusão com usuários termcap que usaram os códigos Sf/Sb correspondentes em vez de setaf/setab (e AF/AB para termcap) - mas usando as seqüências de escape ANSI (que funcionam com termcap) em vez de usar o corrigir as capacidades com as capacidades ANSI.
  • Por causa disso, você encontrará entradas de terminal com as duas equações, por exemplo, mgterm , interix , beterm (bem como várias entradas no arquivo termcap do FreeBSD, mais uma vez devido a essa confusão inicial combinada com a relutância de outros em alterar seus programas).

O ANSI setaf/setab foi adicionado razoavelmente tarde na história do terminfo, como você pode inferir da posição deles no lista de seqüências de recursos . Tenha em mente que esses foram adicionados em etapas ao longo de alguns anos, e alguns sistemas diferiram (ncurses tem alguns exemplos, como Caps.hpux para permitir que seja compilado para corresponder a esses sistemas). Isso explicava o pequeno número de descrições úteis de terminais que poderiam ser usadas como referência.

Com tudo isso, o fato de que as strings setf/setb existentes não coincidiam com a ordem ANSI não foi imediatamente notado, o que levou a alguns correções em 1998 , e o faq Por que o vermelho / azul é trocado? .

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

    
por 23.03.2016 / 01:53

Tags