Vérification du nombre de couleurs prises en charge par mon émulateur de terminal

21

Existe-t-il un moyen fiable de vérifier le nombre de couleurs prises en charge par mon émulateur de terminal?

Si echo $TERMimprime xterm, est-ce que cela me dit sans équivoque combien de couleurs mon émulateur de terminal prend en charge? Comment puis-je vérifier ces informations de manière fiable?

Amelio Vazquez-Reina
la source

Réponses:

20

La valeur de $TERMne donne pas beaucoup d'informations sur le nombre de couleurs prises en charge. De nombreux terminaux se présentent comme xtermet peuvent prendre en charge n'importe quel nombre de couleurs (2, 8, 16, 88 et 256 sont des valeurs communes).

Vous pouvez interroger la valeur de chaque couleur avec la OSC 4 ; c ; ? BEL séquence de contrôle . Si le numéro de couleur cest pris en charge et si le terminal comprend cette séquence de contrôle, le terminal répondra avec la valeur de la couleur. Si le numéro de couleur n'est pas pris en charge ou si le terminal ne comprend pas cette séquence de contrôle, le terminal ne répond rien. Voici un extrait bash / zsh pour demander si la couleur 42 est prise en charge (rediriger vers / depuis le terminal si nécessaire):

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

Parmi les terminaux populaires, xterm et les terminaux basés sur la bibliothèque VTE (Gnome-terminal, Terminator, Xfce4-terminal,…) prennent en charge cette séquence de contrôle; rxvt, konsole, screen et tmux ne le font pas.

Je ne connais pas de voie plus directe.

Gilles 'SO- arrête d'être méchant'
la source
Merci @Gilles. Ça a l'air génial. Puis-je demander ce que read -d $'\a' -s -t 1fait?
Amelio Vazquez-Reina
1
@intrpc Lire l'entrée jusqu'au premier \a(caractère de cloche), sans écho d'entrée, avec un délai d'attente de 1 seconde.
Gilles 'SO- arrête d'être méchant'
5
@ l0b0 tput colorsinterroge la base de données terminfo. Vous avez des chances TERM=xterm. Xterm peut prendre en charge au moins 2, 8, 16, 88 ou 256 couleurs selon la version et les options de compilation et d'exécution, mais la base de données terminfo ne peut stocker qu'une seule valeur. Vous pouvez définir par exemple TERM=xterm+256color, mais vous serez ennuyé lorsque vous vous connecterez à une machine qui n'a pas cette entrée dans sa base de données termcap / terminfo.
Gilles 'SO- arrête d'être méchant'
2
@ l0b0 Votre pipe n'a évidemment rien à voir avec le terminal. Vous devez imprimer sur le terminal ( printf … >/dev/tty) puis lire sur le terminal ( read … </dev/tty). Xterm répond à la OSC 4; …; ? BELséquence en injectant des touches.
Gilles 'SO- arrête d'être méchant'
9

Vous pouvez utiliser

$ tput colors

Sur mon installation debian, tput fait partie du ncurses-binpaquet qui est installé par défaut.

Victor Klos
la source
6
Cela n'informera que du nombre de couleurs que votre terminal signale à l'environnement via TERM, et non du nombre de couleurs qu'il peut réellement prendre en charge si cela est appropriéTERM
MestreLion