質問

これは2つのスクリプトの物語であり、前の質問

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

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

役に立ちましたか?

解決

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

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

  

本質的に、画面の最適化を忘れて、   terminfo(3)にリストされている関数を使用した独自の図面、例:   tigetstr、mvcur、tputs。

     

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

このソリューションは、落とし穴が多すぎるように見えますが、ncursesプログラムで256を超える同時ペアが絶対に必要な場合(逆属性で偽造できるペアをカウントしない場合)、これがあなたがしなければならないことです。

他のヒント

Rubyをまったく知らないので、実用的な例を提供することはできませんが、ncurses.rbスクリプトは、ansi.rbスクリプトよりもはるかに短いという点で何かを伝える必要があります。

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

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

移植性については、bool has_colors(void)およびbool can_change_color(void)を確認する必要があります

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top