В чем разница между "setf" и "setaf" в tput?

17

У команды tputесть два различных параметра для установки цвета, setfи setafвсе же оба они, кажется, прекрасно работают на моем компьютере:

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

Кажется, есть похожая двойственность с setbи setab.

В чем разница между двумя вариантами?

IQAndreas
источник
1
Смотрите terminfo(5)man-страницу, которая идет с ncursesподробностями.
Стефан Шазелас

Ответы:

15

setfограничено только 8 цветами. setafМожно установить до 256 цветов.

(вся следующая информация будет относиться к urxvt, так как это мой терминал, но информация будет похожа, если не такая же, как другие терминалы)

И то, setfи другое setafпредоставляют другой escape-код. Вы можете просмотреть это в следующем:

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

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

Со urxvt(7)страницы моего руководства:

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

Таким образом, из вышеприведенного xxdвывода видно, что tput setf 2используется тот Pm = 32, который установит цвет на зеленый. tput setaf 2с другой стороны, использует Pm = 38;5, который получает представляет цветовой код, определенный в ISO 8613-6 (также зеленый).
В ISO 8613-6 цвета 0x00-0x07 такие же, как стандартные цвета, а 0x08 - 0x0f - стандартные «жирные» цвета. Как только вы получите 0x10-0xff, вы получите новые цвета.

Украдено из википедии :

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
Патрик
источник
tputоднако, по- видимому, не использует доступные диапазоны цветовой последовательности ANSI. По любому n > 7, tput setaf nникак не влияет на текст в моем терминале.
Кайл Стрэнд
На самом деле, это может быть просто причудой моего окружения; для меня выходов tput setf 2и tput setaf 2являются одновременно .[32m .
Кайл Стрэнд,
5

Из руководства: man 5 terminfo

Чтобы изменить текущий цвет переднего плана или фона на терминале типа Tektronix, используйте setaf (установить передний план ANSI) и setab (установить фон ANSI) или setf (установить передний план) и setb (установить фон). Они принимают один параметр, номер цвета. Документация SVr4 описывает только setaf / setab ; В проекте XPG4 говорится, что «если терминал поддерживает escape-последовательности ANSI для установки фона и переднего плана, они должны быть закодированы как setaf и setab соответственно. Если терминал поддерживает другие escape-последовательности для установки фона и переднего плана, они должны быть закодированы как setf и SETBсоответственно. Функция vidputs () и функции refresh используют setaf и setab, если они определены. "

Таким образом, ответ таков : setaf означает установить приоритет ANSI , т.е. использовать escape-последовательности ANSI, а setf означает установить приоритет (используя некоторые escape-последовательности, отличные от ANSI).

Уилл Шеппард
источник
3

Два набора возможностей используют различный порядок для красного / синего в списке цветов ANSI.

Как уже отмечалось, это объясняется на странице руководства ncurses terminfo . Немного истории:

  • В начале (середина 1990-х) использовались наиболее доступные «цветные» описания терминалов setf/setb.
  • Была некоторая путаница с пользователями termcap, которые использовали соответствующие Sf/Sbкоды вместо setaf/setabAF/ABдля termcap) - но использовали escape-последовательности ANSI (которые работают с termcap) вместо того, чтобы использовать правильные возможности с возможностями ANSI.
  • Из-за этого вы найдете терминальные записи с двумя приравненными, например, mgterm , interix , beterm (а также несколько записей в файле termcap FreeBSD, опять же из-за этой первоначальной путаницы в сочетании с нежеланием других вносить изменения в свои программы).

ANSI setaf/setabбыли добавлены довольно поздно в истории terminfo, так как вы можете вывести их положение в списке строк возможностей . Имейте в виду, что они были добавлены поэтапно в течение нескольких лет, и некоторые системы отличались (у ncurses есть несколько примеров, например, Caps.hpuxчтобы позволить ему быть скомпилированным для соответствия этим системам). Это объясняло небольшое количество полезных описаний терминалов, которые можно было бы использовать для справки.

При этом тот факт, что существующие setf/setbстроки не соответствуют порядку ANSI, не был сразу замечен, что привело к некоторым исправлениям в 1998 году и часто задаваемым вопросам. Почему красный / синий взаимозаменяемы? ,

Хотя было возможно расширить последовательность из 8 цветов ANSI до 16 цветов (предполагая, что цвета 8-15 были более яркими версиями 0-7), не было веской причины для изобретения схемы, которая бы расширяла setf/setbпервые 16 цветов.

Томас Дики
источник