unix - sirve - ¿Cómo puedo determinar si un terminal es capaz de color?
para que sirve el imei del iphone (3)
Me gustaría cambiar un programa para detectar automáticamente si un terminal tiene capacidad de color o no, por lo que cuando ejecuto dicho programa desde un terminal sin capacidad de color (por ejemplo, Mx shell en (X) Emacs), el color se desactiva automáticamente .
No quiero codificar el programa para detectar TERM = {emacs, dumb}.
Estoy pensando que termcap / terminfo debería poder ayudar con esto, pero hasta ahora solo he logrado improvisar este (n) fragmento de código de uso de curses, que falla muy mal cuando no puede encontrar el 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);
}
Es decir, entiendo 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óptima.
Busque la entrada terminfo (5) para el tipo de terminal y verifique la entrada Co (max_colors). Esa es la cantidad de colores que soporta el terminal.
Casi lo tiene, excepto que necesita usar la función de setupterm
de initscr
de nivel setupterm
lugar de initscr
. setupterm
simplemente realiza una inicialización suficiente para leer los datos de 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 de curs_terminfo (3X) (x-man-page: // 3x / curs_terminfo) y en Writing Programs with NCURSES .
Un amigo me señaló hacia tput (1), y cociné 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 "$@"
que funciona para mi Sin embargo, sería genial si tuviera una forma de integrarlo en un ack .