¿Cuál es la diferencia entre 'setf' y 'setaf' de tput?

17

El comando tputtiene dos opciones diferentes para configurar el color setfy setaf, sin embargo, ambas parecen funcionar bien en mi computadora:

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

Parece haber una dualidad similar con setby setab.

¿Cuál es la diferencia entre las dos opciones?

IQAndreas
fuente
1
Vea la terminfo(5)página del manual que viene con ncursespara más detalles.
Stéphane Chazelas

Respuestas:

15

setfestá limitado a solo 8 colores. setafPuede configurar hasta 256 colores.

(toda la siguiente información será específica de urxvt, ya que es mi terminal, pero la información será similar, si no la misma, que otras terminales)

Ambos setfy setafproporcionan un código de escape diferente. Puede ver esto en lo siguiente:

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

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

Desde mi 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)

Por lo tanto, a partir del xxdresultado anterior , podemos ver que tput setf 2usa el Pm = 32, que establecerá el color en verde. tput setaf 2por otro lado usa Pm = 38;5, que representa el código de color definido en ISO 8613-6 (también verde).
En ISO 8613-6, los colores 0x00-0x07 son los mismos que los colores estándar, y 0x08 - 0x0f son los colores estándar "negrita". Una vez que llegue a 0x10-0xff obtendrá nuevos colores.

Robado 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
Patricio
fuente
tputSin embargo, no parece utilizar realmente los rangos de secuencia de colores ANSI disponibles. Para cualquiera n > 7, tput setaf nno tiene ningún efecto en el texto en mi terminal.
Kyle Strand
En realidad, eso podría ser solo una peculiaridad de mi entorno; para mí las salidas de tput setf 2y tput setaf 2son ambas .[32m .
Kyle Strand
5

Del manual: man 5 terminfo

Para cambiar el primer plano actual o el color de fondo en un terminal tipo Tektronix, use setaf (establecer primer plano ANSI) y setab (establecer fondo ANSI) o setf (establecer primer plano) y setb (establecer fondo). Estos toman un parámetro, el número de color. La documentación de SVr4 describe solo setaf / setab ; el borrador XPG4 dice que "si el terminal admite secuencias de escape ANSI para establecer el fondo y el primer plano, deben codificarse como setaf y setab , respectivamente. Si el terminal admite otras secuencias de escape para establecer el fondo y el primer plano, deben codificarse como setf y setb, respectivamente. La función vidputs () y las funciones de actualización usan setaf y setab si están definidas ".

Entonces la respuesta es: setaf significa Establecer primer plano ANSI , es decir, usar secuencias de escape ANSI, y setf significa Establecer primer plano (usando algunas secuencias de escape distintas de ANSI).

Will Sheppard
fuente
3

Los dos conjuntos de capacidades utilizan un orden diferente para el rojo / azul en la lista de colores ANSI.

Como se señaló, se explica en la página del manual de ncurses terminfo . Algo de historia:

  • Al principio (mediados de la década de 1990), se usaron la mayoría de las descripciones de terminales en "color" disponibles setf/setb.
  • Hubo cierta confusión con los usuarios de termcap que usaron los Sf/Sbcódigos correspondientes en lugar de setaf/setab(y AF/ABpara termcap), pero usando las secuencias de escape ANSI (que funcionan con termcap) en lugar de usar las capacidades correctas con las capacidades ANSI.
  • Debido a eso, encontrará entradas de terminal con los dos equivalentes, por ejemplo, mgterm , interix , beterm (así como varias entradas en el archivo termcap de FreeBSD, nuevamente debido a esta confusión inicial combinada con la renuencia de otros a modificar sus programas).

Los ANSI setaf/setabse agregaron bastante tarde en la historia de terminfo, como se puede deducir de su posición en la lista de cadenas de capacidades . Tenga en cuenta que se agregaron por etapas durante algunos años, y algunos sistemas difirieron (ncurses tiene algunos ejemplos como Caps.hpuxpermitir que se compile para que coincida con esos sistemas). Eso explica el pequeño número de descripciones de terminales útiles que podrían usarse como referencia.

Con todo eso, setf/setbno se notó de inmediato el hecho de que las cadenas existentes no coincidían con el orden ANSI, lo que condujo a algunas correcciones en 1998 , y las preguntas frecuentes ¿Por qué se intercambian rojo / azul? .

Si bien fue posible extender la secuencia ANSI de 8 colores a 16 colores (suponiendo que los colores 8-15 fueran versiones más brillantes de 0-7), no había una buena razón para inventar un esquema que se extendiera más setf/setballá de los primeros 16 colores.

Thomas Dickey
fuente