Sprawdzanie, ile kolorów obsługuje mój emulator terminala

21

Czy istnieje niezawodny sposób sprawdzenia, ile kolorów obsługuje mój emulator terminala?

Jeśli echo $TERMdrukuje xterm, czy to jednoznacznie mówi mi, ile kolorów obsługuje mój emulator terminala? Jak mogę niezawodnie sprawdzić te informacje?

Amelio Vazquez-Reina
źródło
4
Zobacz także: unix.stackexchange.com/questions/9957/…
jasonwryan

Odpowiedzi:

20

Wartość $TERMnie podaje zbyt wielu informacji o liczbie obsługiwanych kolorów. Wiele terminali reklamuje się jako xtermi może obsługiwać dowolną liczbę kolorów (2, 8, 16, 88 i 256 to wspólne wartości).

Możesz sprawdzić wartość każdego koloru za OSC 4 ; c ; ? BEL pomocą sekwencji kontrolnej . Jeśli numer koloru cjest obsługiwany i jeśli terminal zrozumie tę sekwencję sterowania, terminal odpowie z wartością koloru. Jeśli numer koloru nie jest obsługiwany lub terminal nie rozumie tej sekwencji kontrolnej, terminal nic nie odpowiada. Oto fragment bash / zsh służący do sprawdzenia, czy kolor 42 jest obsługiwany (w razie potrzeby przekieruj do / z terminala):

printf '\e]4;%d;?\a' 42
if read -d $'\a' -s -t 1; then … # color 42 is supported

Wśród popularnych terminali, xterm i terminale oparte na bibliotece VTE (Gnome-terminal, Terminator, Xfce4-terminal,…) obsługują tę sekwencję kontrolną; rxvt, konsola, screen i tmux nie.

Nie znam bardziej bezpośredniego sposobu.

Gilles „SO- przestań być zły”
źródło
Dzięki @Gilles. To wygląda świetnie. Czy mogę zapytać, co read -d $'\a' -s -t 1robi?
Amelio Vazquez-Reina,
1
@intrpc Czytaj wejście do pierwszego \a(znak dzwonka), bez wprowadzania echa, z limitem czasu 1 sekundy.
Gilles 'SO - przestań być zły'
5
@ l0b0 tput colorsodpytuje bazę danych terminfo. Są szanse, że masz TERM=xterm. Xterm może obsługiwać co najmniej 2, 8, 16, 88 lub 256 kolorów w zależności od wersji oraz opcji kompilacji i wykonania, ale baza danych terminfo może przechowywać tylko jedną wartość. Możesz ustawić np. TERM=xterm+256color, Ale wtedy będziesz zirytowany, gdy zalogujesz się na maszynie, która nie ma tego wpisu w swojej bazie danych termcap / terminfo.
Gilles 'SO - przestań być zły'
2
@ l0b0 Twoja rura oczywiście nie ma nic wspólnego z terminalem. Musisz wydrukować na terminalu ( printf … >/dev/tty), a następnie odczytać z terminalu ( read … </dev/tty). Xterm reaguje na OSC 4; …; ? BELsekwencję, wprowadzając naciśnięcia klawiszy.
Gilles „SO- przestań być zły”
9

Możesz użyć

$ tput colors

Na mojej instalacji Debiana tput jest częścią ncurses-binpakietu instalowanego domyślnie.

Victor Klos
źródło
6
Dzięki temu dowiesz się tylko, ile kolorów Twój terminal zgłasza do środowiska TERM, a nie ile kolorów może w rzeczywistości obsłużyć, biorąc pod uwagę odpowiedniTERM
MestreLion