这是两个脚本的故事,与之前的问题有关.
这两个脚本位于http://gist.github.com/50692.ansi.rb脚本在所有256种背景颜色上显示所有256种颜色.ncurses.rb脚本显示所有256种前景色,但背景显示基本色16,然后似乎循环浏览各种属性,如闪烁和反向视频.
什么给出了什么?这是ncurses中的错误,它使用有符号整数来表示颜色对吗?(即'tput colors'表示256但'tput对'表示32767而不是65536)似乎是这样的情况下,前半部分颜色对会正确显示,但后半部分会重复或进入属性作为int包装.
原因是因为包含Debian和Amazon AMI使用的大多数发行版的当前版本的ABI 6之前的ncurses COLOR_PAIR(n)
不能引用256以上的任何已定义对.这是因为参数COLOR_PAIR(n)
是类型的cchar_t
.低8位选择颜色对,其余的被视为OR
特定终端属性的位标记.这就是当您尝试超出示例代码中的第255对时,您会看到闪烁,反转,下划线等的原因.
这非常不幸,我打算在我的程序中使用队列来动态定义颜色,init_pair()
并且只是覆盖最近最少使用的对作为折衷方案.我写了ncurses维护者Thomas Dickey,询问是否有办法暂时走出ncurses,编写原始终端代码,然后返回ncurses.这是他的回答:
基本上你不得不忘记屏幕优化,只使用terminfo(3)中列出的函数来做自己的绘图,例如tigetstr,mvcur,tputs.
您可以暂时退出ncurses,但必须重新绘制屏幕.否则,ncurses会对屏幕上的内容和光标位置感到困惑.
这个解决方案似乎存在太多陷阱,但是如果你在ncurses程序中绝对需要超过256个并发对(不计算你可以使用inverse属性伪造的对),那么这就是你必须要做的.