7

attron選択した色で実行できることはわかっていattroffますが、ncurses 内の ANSI カラーエスケープコードで実行できるかどうかを知りたいです。

#include <stdio.h>
#include <ncurses.h>

int main()
{
   initscr();
   char *s2 = NULL;
   const char *s1 = "World";
   int n = 10; 

   // What would be a good way to colour %d?
   // seems it is not safe to us the ANSI color escape in here...
   s2 = malloc (snprintf (NULL, 0, "Hello %s \033[22;31m%d", s1, n) + 2); 
   sprintf (s2, "Hello %s \033[22;31m%d", s1, n); 
   printw("%s", s2);
   refresh();
   getch();
   endwin();

   return 0;
}

とのリンク-lncurses

printf("\033[22;31mHello, World!\n");ncurses 以外のプログラムの通常の動作。

4

4 に答える 4

3

危険な領域に迷い込んでいる可能性が高いと思います。Curses は、ほぼ確実に出力文字に基づいて文字位置を追跡します。また、curses は独自の色処理を提供するため、おそらく ANSI エスケープ シーケンスも検出しません。

文字列で ANSI エスケープ シーケンスを許可する方法を探している場合、1 つの方法 (それは大雑把ですが) は、文字列をインターセプトして変更することです。myPrintW()(疑似コード) のような文字列を取り、それを分解するようなヘルパー関数を用意します。

def myPrintW(s as copy):
    while s not empty:
        p = position of first ansi-sequence in s
        if p == NULL exit while
        printw first p characters of s
        remove the first p characters from s

        decode ansi-sequence at start of s
        issue relevant attron/off for that ansi-sequence
        remove ansi-sequence from start of s

    endwhile
    output s though it may be empty
enddef

これは基本的に、文字列を通常の文字シーケンスとアンチシーケンスに分解し、それぞれを個別に処理します。

attron/offシーケンスを目的の呼び出しに変換するには、ルックアップ テーブル (または、ANSI シーケンスを任意のパラメーターで処理する必要がある場合は smarts) が必要です。

于 2010-12-07T05:34:48.737 に答える
1

これについて議論している 2008 年のメーリング リスト スレッド: https://lists.gnu.org/archive/html/bug-ncurses/2008-11/msg00026.html

提起された可能性は次のとおりです。

于 2015-10-19T08:56:36.863 に答える
1

はい。それはすべて、プログラムの出力をリッスンしているソフトウェアまたはファームウェアの種類によって異なります。V3.3 MSDOS の場合は、いいえ、デバイス ドライバー ansi.sys が読み込まれていないと動作しません。

最新の端末ウィンドウはANSI x3.64セマンティクスを持つ傾向があるため、これらのエスケープ シーケンスは多くの場合機能します。ただし、あまり期待しないでください。幅が広く、高さが非常に高い文字は、サポートが不十分なことで有名です。

于 2010-12-07T05:37:27.073 に答える
1

ANSI on を統合するのはあまり安全ではありませんncurses。呼び出しを使用し、おそらく文字列をandattron/offに分割します。2 つ以上のコンバージョンの場合は、独自の実装が必要です%s%dprintw

于 2010-12-07T16:16:11.903 に答える