Qual è la differenza tra 'setf' e 'setaf' di tput?


17

Il comando tputha due diverse opzioni per l'impostazione del colore, setfe setaf, eppure entrambi sembrano funzionare bene sul mio computer:

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

Sembra esserci una dualità simile con setbe setab.

Qual è la differenza tra le due opzioni?


1
Vedi la terminfo(5)pagina man che viene fornita ncursesper i dettagli.
Stéphane Chazelas,

Risposte:


15

setfè limitato a soli 8 colori. setafpuò impostare fino a 256 colori.

(tutte le seguenti informazioni saranno specifiche di urxvt, poiché quello è il mio terminale, ma le informazioni saranno simili, se non uguali, ad altri terminali)

Entrambi setfe setafforniscono un codice di escape diverso. Puoi visualizzarlo come segue:

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

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

Dalla mia urxvt(7)pagina 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)

Quindi xxd, dall'output sopra , possiamo vedere che tput setf 2usa il Pm = 32, che imposterà il colore su verde. tput setaf 2d'altra parte usa il Pm = 38;5, che ottiene rappresenta il codice colore definito in ISO 8613-6 (anche verde).
In ISO 8613-6, i colori 0x00-0x07 sono gli stessi dei colori standard e 0x08 - 0x0f sono i colori standard "grassetto". Quando arrivi a 0x10-0xff ottieni nuovi colori.

Rubato 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

tputnon sembra tuttavia utilizzare effettivamente gli intervalli di sequenza colori ANSI disponibili. Per nessuno n > 7, tput setaf nnon ha alcun effetto sul testo nel mio terminale.
Kyle Strand,

In realtà, potrebbe essere solo una stranezza del mio ambiente; per me le uscite da tput setf 2e tput setaf 2sono entrambe .[32m .
Kyle Strand,

5

Dal manuale: man 5 terminfo

Per modificare il colore di primo piano o sfondo corrente su un terminale di tipo Tektronix, utilizzare setaf (imposta il primo piano ANSI) e setab (imposta lo sfondo ANSI) o setf (imposta il primo piano) e setb (imposta lo sfondo). Questi richiedono un parametro, il numero di colore. La documentazione SVr4 descrive solo setaf / setab ; la bozza XPG4 afferma che "Se il terminale supporta sequenze di escape ANSI per impostare lo sfondo e il primo piano, dovrebbero essere codificati rispettivamente come setaf e setab . Se il terminale supporta altre sequenze di escape per impostare lo sfondo e il primo piano, dovrebbero essere codificati come setf e SETB, rispettivamente. La funzione vidputs () e le funzioni di aggiornamento utilizzano setaf e setab se definiti. "

Quindi la risposta è: setaf significa Set ANSI in primo piano , ovvero usa sequenze di escape ANSI, e setf significa Set Foreground (usando alcune sequenze di escape diverse da ANSI).


3

I due set di funzionalità utilizzano un ordinamento diverso per il rosso / blu nell'elenco dei colori ANSI.

Come notato, è spiegato nella pagina del manuale di ncurses terminfo . Un po 'di storia:

  • All'inizio (metà degli anni '90), sono state utilizzate le descrizioni dei terminali "a colori" più disponibili setf/setb.
  • C'è stata una certa confusione con gli utenti di termcap che hanno utilizzato i Sf/Sbcodici corrispondenti anziché setaf/setab(e AF/ABper termcap), ma utilizzando le sequenze di escape ANSI (che funzionano con termcap) anziché utilizzare le funzionalità corrette con le funzionalità ANSI.
  • Per questo motivo , troverai voci terminali con i due equivalenti, ad esempio mgterm , interix , beterm (così come diverse voci nel file termcap di FreeBSD, sempre a causa di questa confusione iniziale combinata con la riluttanza degli altri a modificare i loro programmi).

Gli ANSI setaf/setabsono stati aggiunti abbastanza tardi nella storia di terminfo, come si può dedurre dalla loro posizione nell'elenco delle stringhe di capacità . Tieni presente che quelli sono stati aggiunti in più fasi nel corso di alcuni anni e alcuni sistemi differivano (ncurses ha alcuni esempi in modo da Caps.hpuxconsentirne la compilazione per abbinarli a tali sistemi). Ciò ha rappresentato il piccolo numero di utili descrizioni dei terminali che potrebbero essere utilizzate come riferimento.

Con tutto ciò, il fatto che le setf/setbstringhe esistenti non corrispondessero all'ordine ANSI non è stato immediatamente notato, il che ha portato ad alcune correzioni nel 1998 , e le domande frequenti Perché sono scambiati rosso / blu? .

Mentre era possibile estendere la sequenza ANSI a 8 colori a 16 colori (supponendo che i colori 8-15 fossero versioni più luminose di 0-7), non vi era alcuna buona ragione per inventare uno schema per estendere setf/setboltre i primi 16 colori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.