Jaka jest różnica między „setf” i „setaf” tput?

17

Polecenie tputma dwie różne opcje ustawiania koloru, setfa setafjednak oba wydają się działać dobrze na moim komputerze:

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

Wydaje się, że istnieje podobna dualność setb i setab.

Jaka jest różnica między dwiema opcjami?

IQAndreas
źródło
1
Szczegółowe informacje można znaleźć na terminfo(5)stronie podręcznika użytkownika ncurses.
Stéphane Chazelas

Odpowiedzi:

15

setfjest ograniczony tylko do 8 kolorów. setafmożna ustawić do 256 kolorów.

(wszystkie poniższe informacje będą specyficzne dla urxvt, ponieważ to jest mój terminal, ale informacje będą podobne, jeśli nie takie same, jak inne terminale)

Oba setfi setafzapewniają inny kod ucieczki. Możesz to zobaczyć w następujący sposób:

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

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

Z mojej urxvt(7)strony 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)

Zatem z powyższego xxdwyjścia możemy zobaczyć, że tput setf 2używa Pm = 32, który ustawi kolor na zielony. tput setaf 2z drugiej strony używa Pm = 38;5, który dostaje reprezentuje kod koloru zdefiniowany w ISO 8613-6 (także zielony).
W ISO 8613-6 kolory 0x00-0x07 są takie same jak kolory standardowe, a 0x08 - 0x0f to standardowe kolory „pogrubione”. Gdy dojdziesz do 0x10-0xff, otrzymasz nowe kolory.

Skradzione z wikipedii :

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
źródło
tputwydaje się jednak nie używać dostępnych zakresów sekwencji kolorów ANSI. Dla każdego n > 7, tput setaf nnie ma wpływu na tekst w moim terminalu.
Kyle Strand,
To może być dziwactwo mojego środowiska; dla mnie wyniki są tput setf 2i tput setaf 2oba .[32m .
Kyle Strand,
5

Z instrukcji: man 5 terminfo

Aby zmienić bieżący kolor pierwszego planu lub tła na terminalu typu Tektronix, użyj setaf (ustaw pierwszy plan ANSI) i setab (ustaw tło ANSI) lub setf (ustaw pierwszy plan) i setb (ustaw tło). Biorą one jeden parametr, numer koloru. Dokumentacja SVr4 opisuje tylko setaf / setab ; w szkicu XPG4 napisano: „Jeśli terminal obsługuje sekwencje specjalne ANSI do ustawiania tła i pierwszego planu, należy je odpowiednio zakodować jako setaf i setab . Jeśli terminal obsługuje inne sekwencje specjalne do ustawienia tła i pierwszego planu, należy je zakodować jako setf i setbodpowiednio. Funkcje vidputs () i funkcje odświeżania używają setaf i setab, jeśli są zdefiniowane. "

Zatem odpowiedź brzmi: setaf oznacza Ustaw pierwszy plan ANSI , tj. Użyj sekwencji ucieczki ANSI, a setf oznacza Ustaw pierwszy plan (używając niektórych sekwencji specjalnych innych niż ANSI).

Will Sheppard
źródło
3

Dwa zestawy możliwości wykorzystują różne kolejność kolorów czerwony / niebieski na liście kolorów ANSI.

Jak wspomniano, wyjaśniono to na stronie podręcznika terminfo ncurses . Trochę historii:

  • Na początku (połowa lat 90.) zastosowano najczęściej dostępne „kolorowe” opisy terminali setf/setb.
  • Nastąpiło pewne zamieszanie z użytkownikami termcap, którzy używali odpowiednich Sf/Sbkodów zamiast setaf/setab(i AF/ABtermcap) - ale używając sekwencji ucieczkowych ANSI (które działają z termcap) zamiast używać poprawnych możliwości z możliwościami ANSI.
  • Z tego powodu znajdziesz wpisy końcowe z dwoma zrównanymi, np. Mgterm , interix , beterm (a także kilka wpisów w pliku termcap FreeBSD, ponownie z powodu tego początkowego pomieszania w połączeniu z niechęcią innych do zmiany swoich programów).

ANSI setaf/setabdodano dość późno w historii terminfo, ponieważ można wywnioskować z ich pozycji na liście ciągów zdolności . Należy pamiętać, że były one dodawane etapami przez kilka lat, a niektóre systemy różniły się (ncurses ma kilka przykładów, na przykład Caps.hpuxpozwalających na kompilację w celu dopasowania do tych systemów). Stanowiło to niewielką liczbę przydatnych opisów terminali, które można by wykorzystać w celach informacyjnych.

Mimo setf/setbto nie zauważono od razu faktu, że istniejące ciągi nie pasowały do ​​kolejności ANSI, co doprowadziło do pewnych poprawek w 1998 r. , A często zadawane pytania Dlaczego wymieniono czerwony / niebieski?.

Chociaż można było rozszerzyć 8-kolorową sekwencję ANSI do 16 kolorów (zakładając, że kolory 8-15 były jaśniejszymi wersjami 0-7), nie było żadnego powodu, aby wymyślać schemat setf/setbprzekraczania pierwszych 16 kolorów.

Thomas Dickey
źródło