Ruby 256色,前景和背景

Ruby 256色,前景和背景,ruby,ncurses,terminal,256color,Ruby,Ncurses,Terminal,256color,这是一个关于两个剧本的故事,与一个故事有关 这两个脚本位于。ansi.rb脚本在所有256种背景色上显示所有256种颜色。rb脚本显示所有256种前景颜色,但背景显示基本16色,然后似乎在各种属性中循环,如闪烁和反转视频 那么是什么原因呢?这就是ncurses中使用带符号整数作为颜色对的错误吗?(即“tput colors”表示256,但“tput pairs”表示32767,而不是65536)如果是这种情况,则前半部分颜色对将正确显示,但后半部分将重复显示或随着int包装进入属性。我根本不了解

这是一个关于两个剧本的故事,与一个故事有关

这两个脚本位于。ansi.rb脚本在所有256种背景色上显示所有256种颜色。rb脚本显示所有256种前景颜色,但背景显示基本16色,然后似乎在各种属性中循环,如闪烁和反转视频


那么是什么原因呢?这就是ncurses中使用带符号整数作为颜色对的错误吗?(即“tput colors”表示256,但“tput pairs”表示32767,而不是65536)如果是这种情况,则前半部分颜色对将正确显示,但后半部分将重复显示或随着int包装进入属性。

我根本不了解Ruby,因此无法提供一个工作示例,但是ncurses.rb脚本应该告诉您,它比ansi.rb脚本短得多

您没有设置颜色,所以它只是循环使用默认的16色调色板和属性(如闪烁下划线、粗体等)提供的变化

您需要使用
int init\u color(short color,short r,short g,short b)
以RGB值(0-1000)初始化颜色索引,然后在调用
int init\u pair(short pair,short f,short b)
之前设置颜色对以用于显示
int init\u pair(short pair,short f,short b)

为了便于携带,您应该检查
bool有颜色(无效)
bool可以改变颜色(无效)


在我的系统中,ncurses的手册页是非常宝贵的。

原因是,ncurses在ABI 6之前,包括大多数发行版(包括Debian和Amazon AMI)使用的当前版本,
COLOR\u PAIR(n)
无法引用256以上的任何定义对。这是因为
COLOR\u PAIR(n)
的参数类型为
cchar\u t
。较低的8位选择颜色对,其余的被视为特定终端属性中的位标志
ed。这就是为什么当您试图超出示例代码中的对编号255时,会看到闪烁、反转、下划线等

这是非常不幸的,我计划在我的程序中使用一个队列,使用
init_pair()
动态定义颜色,并作为折衷方案覆盖最近使用最少的颜色对。我写信给ncurses维护人员托马斯·迪基,询问是否有办法暂时跳出ncurses编写原始终端代码,然后返回ncurses。他的回答是:

基本上,你必须忘记屏幕优化,只需这样做 使用terminfo(3)中列出的功能绘制自己的图形,例如。, TIGETSR、mvcur、tputs

您可以暂时退出ncurses,但随后必须重新绘制 屏幕。否则,ncurses将对屏幕上的内容感到困惑 以及光标所在的位置


此解决方案似乎存在太多的陷阱,但如果您在一个ncurses程序中绝对需要超过256个同时对(不计算可以使用反向属性伪造的对),那么这就是您必须要做的。

感谢您回答我将近四年的问题。我希望它能很容易地修复,但知道这一个到底出了什么问题肯定很好。我一直怀疑这会归结为“你只需要自己做就行了”。现在链接到gist 404。