ruby – 256色,前景和背景

这是两个脚本的故事,与 previous question相关.

这两个脚本位于http://gist.github.com/50692.ansi.rb脚本显示所有256种背景颜色的所有256种颜色. ncurses.rb脚本显示所有256种前景色,但背景显示基本色16,然后似乎循环浏览各种属性,如闪烁和反向视频.

什么给出了什么?这是ncurses中的错误,它使用有符号整数来表示颜色对吗? (即’tput colors’表示256但’tput对’表示32767而不是65536)似乎是这样的情况下,前半部分颜色对会正确显示,但后半部分会重复或进入属性作为int包装.

解决方法

原因是因为ncurses在ABI 6之前,其中包括大多数发行版包括Debian和Amazon AMI使用的当前版本,COLOR_PAIR(n)不能引用256以上任何已定义的对.这是因为COLOR_PAIR(n)的参数是cchar_t类型.低8位选择颜色对,其余的被视为对特定终端属性进行OR运算.这就是当您尝试超出示例代码中的第255对时,您会看到闪烁,反转,下划线等的原因.

这非常不幸,我计划在我的程序中使用队列来使用init_pair()动态定义颜色,并且只是覆盖最近最少使用的对作为折衷.我写了ncurses维护者Thomas Dickey,询问是否有办法暂时走出ncurses,编写原始终端代码,然后返回ncurses.这是他的回答:

Essentially you’d have to forget about screen-optimization and just do
your own drawing using the functions listed in terminfo(3),e.g.,
tigetstr,mvcur,tputs.

You can exit temporarily from ncurses,but then have to repaint the
screen. Otherwise ncurses will be confused about what is on the screen
and where the cursor is.

这个解决方案似乎存在太多陷阱,但是如果你在ncurses程序中绝对需要超过256个并发对(不计算你可以使用inverse属性伪造的对),那么这就是你必须要做的.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...