32

端末がカラー対応かどうかを自動的に検出するようにプログラムを変更したいので、カラー対応でない端末(たとえば(X)EmacsのMxシェル)内からプログラムを実行すると、カラーが自動的にオフになります。

TERM = {emacs、dumb}を検出するようにプログラムをハードコーディングしたくありません。

termcap / terminfoがこれを助けることができるはずだと思っていますが、これまでのところ、この(n)cursesをまとめることができました-コードのスニペットを使用して、ターミナルが見つからない場合はひどく失敗します:

#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);
}

つまり、私はこれを取得します:

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

これは...次善です。

4

3 に答える 3

23

友人が私にtput(1)を教えてくれたので、私はこの解決策を作り上げました。

#!/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 "$@"

それは私のために働きます。しかし、それをackに統合する方法があれば素晴らしいと思います。

于 2010-03-17T20:28:52.813 に答える
10

setuptermの代わりに低レベルのcurses関数を使用する必要があることを除いて、ほとんどそれがありましたinitscrsetuptermterminfoデータを読み取るのに十分な初期化を実行するだけで、エラー結果値(最後の引数)へのポインターを渡すと、エラーメッセージを出力して終了する代わりにエラー値が返されます(のデフォルトの動作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;
}

使用に関する追加情報setuptermは、curs_terminfo(3X)のマニュアルページ(x-man-page://3x/curs_terminfo)およびNCURSESを使用したプログラムの作成にあります。

于 2011-09-15T05:38:12.067 に答える
3

端末タイプのterminfo(5)エントリを検索し、Co(max_colors)エントリを確認します。これが、端末がサポートする色の数です。

于 2010-03-17T23:12:13.000 に答える