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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top