6

これは 2 つのスクリプトの物語であり、前の質問に関連しています。

2 つのスクリプトはhttp://gist.github.com/50692にあります。ansi.rb スクリプトは、256 色すべての背景色に 256 色すべてを表示します。ncurses.rb スクリプトは 256 の前景色をすべて表示しますが、背景は基本の 16 色を表示し、点滅や反転表示などのさまざまな属性を循環しているように見えます。

それで、何が得られますか?これは、色のペアに符号付き整数を使用する ncurses のバグですか? (つまり、「tput colors」は 256 ですが、「tput ペア」は 65536 ではなく 32767 と表示されます) その場合、色のペアの前半は適切に表示されますが、後半は繰り返されるか、int として属性に入ります。ラップします。

4

2 に答える 2

7

その理由は、Debian や Amazon AMI を含むほとんどのディストリビューションが使用する現在のバージョンを含む ABI 6 より前の ncurses が、COLOR_PAIR(n)256 を超える定義済みのペアを参照できないためです。これは、 への引数COLOR_PAIR(n)が 型であるためcchar_tです。OR下位 8 ビットは色のペアを選択し、残りは特定の端末属性のビットフラグとして扱われます。これが、サンプル コードでペア番号 255 を超えようとすると、点滅、反転、下線などが表示される理由です。

これは非常に残念なことです。プログラムでキューを使用してその場で色を定義init_pair()し、妥協点として最も最近使用されていないペアを上書きする予定です。私は、ncurses のメンテナーである Thomas Dickey に、一時的に ncurses の外に出て生の端末コードを書き、その後 ncurses に戻る方法があるかどうかを尋ねました。これは彼の返事でした:

基本的に、画面の最適化については忘れて、terminfo(3) にリストされている関数 (tigetstr、mvcur、tputs など) を使用して独自の描画を行う必要があります。

ncurses を一時的に終了できますが、その後画面を再描画する必要があります。そうしないと、ncurses は画面上に何があり、カーソルがどこにあるかについて混乱します。

この解決策には落とし穴が多すぎるように思われますが、ncurses プログラムで 256 を超える同時ペアが絶対に必要な場合 (inverse 属性で偽装できるペアは数えません)、これを行う必要があります。

于 2012-12-13T19:40:56.790 に答える
2

私は Ruby をまったく知らないので、実際の例を提供することはできませんが、ncurses.rb スクリプトは、ansi.rb スクリプトよりもはるかに短いという点で何かを教えてくれるはずです。

色を設定していないので、デフォルトの 16 色パレットを、点滅の下線、太字などの属性によって提供されるバリエーションでループしているだけです。

を使用して RGB 値 (0 ~ 1000) でカラー インデックスを初期化し、を呼び出す前int init_color(short color, short r, short g, short b)に表示に使用するカラー ペアを設定する必要があります。int init_pair(short pair, short f, short b)COLOR_PAIR(n)

移植性のために、チェックbool has_colors(void)してくださいbool can_change_color(void)

私のシステムでは、ncurses の man ページは非常に貴重です。

于 2009-10-18T23:03:18.047 に答える