Comment puis-je déterminer si un terminal est capable de gérer la couleur?
Question
Je souhaite modifier un programme pour détecter automatiquement si un terminal est couleur capable ou non, de sorte que quand je cours dudit programme à partir d'un terminal capable non-couleur (par exemple Mx shell dans (X) Emacs), la couleur est automatiquement désactivé.
Je ne veux pas coder en dur le programme pour détecter terme = {emacs, muet}.
Je pense que termcap / terminfo devrait être en mesure d'aider, mais jusqu'à présent je n'ai réussi à concocter ce (n) curses en utilisant bout de code qui échoue mal quand il ne trouve pas le terminal:
#include <stdlib.h>
#include <curses.h>
int main(void) {
int colors=0;
initscr();
start_color();
colors=has_colors() ? 1 : 0;
endwin();
printf(colors ? "YES\n" : "NO\n");
exit(0);
}
i.e.. Je reçois ceci:
$ gcc -Wall -lncurses -o hep hep.c
$ echo $TERM
xterm
$ ./hep
YES
$ export TERM=dumb
$ ./hep
NO
$ export TERM=emacs
$ ./hep
Error opening terminal: emacs.
$
... qui est sous-optimale.
La solution
Un ami m'a pointé vers tput (1), et je cuit cette solution:
#!/bin/sh
# ack-wrapper - use tput to try and detect whether the terminal is
# color-capable, and call ack-grep accordingly.
OPTION='--nocolor'
COLORS=$(tput colors 2> /dev/null)
if [ $? = 0 ] && [ $COLORS -gt 2 ]; then
OPTION=''
fi
exec ack-grep $OPTION "$@"
qui fonctionne pour moi. Ce serait génial si j'avais un moyen de l'intégrer dans ack , cependant.
Autres conseils
Vous aviez presque, sauf que vous devez utiliser le niveau inférieur malédictions fonction setupterm
au lieu de initscr
. setupterm
effectue juste assez à lire à terminfo données, et si vous passez un pointeur à une valeur de résultat d'erreur (le dernier argument), il renvoie une valeur d'erreur au lieu d'émettre des messages d'erreur et de sortie (le comportement par défaut pour initscr
).
#include <stdlib.h>
#include <curses.h>
int main(void) {
char *term = getenv("TERM");
int erret = 0;
if (setupterm(NULL, 1, &erret) == ERR) {
char *errmsg = "unknown error";
switch (erret) {
case 1: errmsg = "terminal is hardcopy, cannot be used for curses applications"; break;
case 0: errmsg = "terminal could not be found, or not enough information for curses applications"; break;
case -1: errmsg = "terminfo entry could not be found"; break;
}
printf("Color support for terminal \"%s\" unknown (error %d: %s).\n", term, erret, errmsg);
exit(1);
}
bool colors = has_colors();
printf("Terminal \"%s\" %s colors.\n", term, colors ? "has" : "does not have");
return 0;
}
Des informations supplémentaires sur l'utilisation setupterm
est disponible dans le curs_terminfo (3X) page de manuel (x-man pages: // 3x / curs_terminfo) et Programmes d'écriture avec ncurses.
Recherchez l'entrée terminfo (5) pour le type de terminal et vérifier l'entrée Co (max_colors). C'est combien de couleurs le terminal prend en charge.