ruby 256色,前景和背景

vm0i2vca  于 2023-10-17  发布在  Ruby
关注(0)|答案(2)|浏览(91)

这是一个关于两个脚本的故事,与previous question有关。
这两个脚本位于http://gist.github.com/50692。rb脚本在所有256种背景色上显示所有256种颜色。ncurses.rb脚本显示所有256种前景色,但背景显示基本的16种,然后似乎循环显示各种属性,如 Flink 和反转视频。
那又是怎么回事?这是ncurses中的错误吗?它使用一个有符号的整数作为颜色对?(即'tput colors'表示256,但'tput pairs'表示32767,而不是65536)看起来如果是这种情况,前半部分的颜色对将正确显示,但后半部分将重复或进入int Package 的属性。

3htmauhk

3htmauhk1#

原因是因为ncurses pre ABI 6(包括Debian和Amazon AMI等大多数发行版使用的当前版本),COLOR_PAIR(n)不能引用任何超过256的已定义对。这是因为COLOR_PAIR(n)的参数是chtype类型。较低的8位选择颜色对,其余的被视为特定终端属性的位标志OR。这就是为什么你会看到 Flink 、反转、下划线等。当你试图超越你的示例代码中的第255对时。
这是非常不幸的,我计划在我的程序中使用一个队列来使用init_pair()动态定义颜色,并作为妥协覆盖最近最少使用的颜色对。我写信给ncurses维护者托马斯迪基,询问是否有一种方法可以暂时跳出ncurses编写原始终端代码,然后返回到ncurses。这是他的回答:
基本上你必须忘记屏幕优化,只需要使用terminfo(3)中列出的函数进行自己的绘图,例如tigetstr,mvcur,tputs。
您可以暂时退出ncurses,但随后必须重新绘制屏幕。否则ncurses会搞不清屏幕上有什么和光标在哪里。
这个解决方案似乎存在太多的陷阱,但是如果你在一个ncurses程序中绝对需要超过256个并发对(不包括你可以用inverse属性伪造的对),那么这就是你必须做的。

czfnxgou

czfnxgou2#

我根本不了解Ruby,所以不能提供一个工作示例,但ncurses.rb脚本应该告诉您一些事情,因为它比ansi.rb脚本短得多。
你没有设置颜色,所以它只是循环默认的16色调色板与属性提供的变化,如 Flink 下划线,粗体等。
您需要使用int init_color(short color, short r, short g, short b)初始化RGB值(0 - 1000)的颜色索引,然后在调用COLOR_PAIR(n)之前使用int init_pair(short pair, short f, short b)设置用于显示的颜色对。
对于可移植性,您应该检查bool has_colors(void)bool can_change_color(void)
在我的系统中,ncurses的手册页是非常宝贵的。

相关问题