Quelle est la différence entre 'setf' et 'setaf' de tput?

17

La commande tputa deux options différentes pour définir la couleur, setfet setafpourtant, les deux semblent fonctionner très bien sur mon ordinateur:

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

Il semble y avoir une dualité similaire avec setbet setab.

Quelle est la différence entre les deux options?

IQAndreas
la source
1
Consultez la terminfo(5)page de manuel fournie avec ncursespour plus de détails.
Stéphane Chazelas

Réponses:

15

setfest limité à seulement 8 couleurs. setafpeut définir jusqu'à 256 couleurs.

(toutes les informations suivantes seront spécifiques à urxvt, car il s'agit de mon terminal, mais les informations seront similaires, sinon identiques, aux autres terminaux)

Les deux setfet setaffournir un code d'échappement différent. Vous pouvez le voir de la manière suivante:

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

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

Depuis ma urxvt(7)page de manuel:

   "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)

Ainsi, à partir de la xxdsortie ci-dessus , nous pouvons voir que tput setf 2utilise le Pm = 32, qui mettra la couleur au vert. tput setaf 2d'autre part utilise le Pm = 38;5, qui représente le code couleur défini dans ISO 8613-6 (également vert).
Dans ISO 8613-6, les couleurs 0x00-0x07 sont les mêmes que les couleurs standard, et 0x08 - 0x0f sont les couleurs "gras" standard. Une fois arrivé à 0x10-0xff, vous obtenez de nouvelles couleurs.

Volé sur 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
la source
tputne semble pas utiliser réellement les plages de séquences de couleurs ANSI disponibles, cependant. Pour tout n > 7, tput setaf nn'a aucun effet sur le texte de mon terminal.
Kyle Strand
En fait, cela pourrait être juste une bizarrerie de mon environnement; pour moi les sorties de tput setf 2et tput setaf 2sont les deux .[32m .
Kyle Strand
5

Du manuel: man 5 terminfo

Pour modifier la couleur de premier plan ou d'arrière-plan actuelle sur un terminal de type Tektronix, utilisez setaf (définir le premier plan ANSI) et setab (définir le fond ANSI) ou setf (définir le premier plan) et setb (définir l'arrière-plan). Ceux-ci prennent un paramètre, le numéro de couleur. La documentation SVr4 ne décrit que setaf / setab ; le projet XPG4 dit que "Si le terminal prend en charge les séquences d'échappement ANSI pour définir l'arrière-plan et le premier plan, elles doivent être codées respectivement comme setaf et setab . Si le terminal prend en charge d'autres séquences d'échappement pour définir l'arrière-plan et le premier plan, elles doivent être codées comme setf et setb, respectivement. La fonction vidputs () et les fonctions d'actualisation utilisent setaf et setab si elles sont définies. "

Donc, la réponse est: setaf signifie Set ANSI foreground , c'est-à-dire utiliser des séquences d'échappement ANSI, et setf signifie Set Foreground (en utilisant des séquences d'échappement autres que ANSI).

Will Sheppard
la source
3

Les deux ensembles de capacités utilisent un ordre différent pour le rouge / bleu dans la liste des couleurs ANSI.

Comme indiqué, il est expliqué dans la page de manuel ncurses terminfo . Un peu d'histoire:

  • Dès le début (milieu des années 90), la plupart des descriptions de terminaux «couleur» disponibles ont été utilisées setf/setb.
  • Il y avait une certaine confusion avec les utilisateurs de termcap qui utilisaient les Sf/Sbcodes correspondants plutôt que setaf/setab(et AF/ABpour termcap) - mais en utilisant les séquences d'échappement ANSI (qui fonctionnent avec termcap) plutôt que d'utiliser les capacités correctes avec les capacités ANSI.
  • Pour cette raison, vous trouverez des entrées de terminal avec les deux équivalentes, par exemple, mgterm , interix , beterm (ainsi que plusieurs entrées dans le fichier termcap de FreeBSD, encore une fois en raison de cette confusion initiale combinée à la réticence des autres à modifier leurs programmes).

Les ANSI setaf/setabont été ajoutés assez tard dans l'histoire de terminfo, comme vous pouvez le déduire de leur position dans la liste des chaînes de capacités . Gardez à l'esprit que ceux-ci ont été ajoutés par étapes sur quelques années et que certains systèmes différaient (ncurses a quelques exemples Caps.hpuxpour permettre de le compiler pour correspondre à ces systèmes). Cela explique le petit nombre de descriptions de terminaux utiles qui peuvent être utilisées comme référence.

Avec tout cela, le fait que les setf/setbchaînes existantes ne correspondent pas à l'ordre ANSI n'a pas été immédiatement remarqué, ce qui a conduit à quelques correctifs en 1998 , et à la FAQ Pourquoi les rouges / bleus sont-ils interchangés? .

S'il était possible d'étendre la séquence ANSI 8 couleurs à 16 couleurs (en supposant que les couleurs 8-15 étaient des versions plus lumineuses de 0-7), il n'y avait aucune bonne raison pour inventer un schéma pour s'étendre au- setf/setbdelà des 16 premières couleurs.

Thomas Dickey
la source