2010-03-17 6 views
23

Me gustaría cambiar un programa para detectar automáticamente si un terminal tiene o no capacidad de color, por lo que cuando ejecuto dicho programa desde un terminal que no es de color (digamos Mx shell en (X) Emacs), el color es automáticamente apagado.¿Cómo puedo determinar si un terminal es compatible con el color?

No quiero codificar el programa para detectar TERM = {emacs, dumb}.

Estoy pensando que termcap/terminfo debería ser capaz de ayudarme con esto, pero hasta ahora solo he logrado improvisar este (n) fragmento de código de uso de maldiciones, que falla mal cuando no puede encontrar la 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); 
} 

Ie Obtengo esto:

$ 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. 
$ 

que es ... subóptimo.

+2

En el análisis final no se puede, porque no se puede decir con qué tipo de CRT se implementa el terminal. –

+3

Me interesa saber si el terminal (tipo) dice que es compatible con el color o no, no en un análisis del espectro de la luz que emana de un CRT :-) – asjo

Respuesta

18

Un amigo me señaló hacia tput (1), y cocinaron esta solución:

#!/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 "[email protected]" 

que funciona para mí. Sería genial si tuviera una forma de integrarlo en ack, sin embargo.

+1

Tenga en cuenta que 'has_colors()' de ncurses realiza un trabajo más completo prueba que solo examina la cantidad de colores, ya que esa no es la única forma en que el soporte de color se puede expresar en terminfo. –

3

Busque la entrada terminfo (5) para el tipo de terminal y verifique la entrada Co (max_colors). Esa es la cantidad de colores que admite la terminal.

8

Casi lo tenía, excepto que necesita utilizar la función de maldiciones de nivel inferior setupterm en lugar de initscr. setupterm simplemente realiza suficiente inicialización para leer datos terminfo, y si pasa un puntero a un valor de resultado de error (el último argumento) devolverá un valor de error en lugar de emitir mensajes de error y salir (el comportamiento predeterminado para 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; 
} 

Información adicional sobre el uso de setupterm está disponible en la página del manual curs_terminfo (3X) (x-man-página: // 3x/curs_terminfo) y Writing Programs with NCURSES.

+2

En C++ en mi máquina Mac OSX también necesito #include . –

Cuestiones relacionadas