【问题标题】:256 colors, foreground and background256种颜色,前景和背景
【发布时间】:2010-10-03 09:01:26
【问题描述】:

这是两个脚本的故事,与 previous question 有关。

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

那是什么?这是 ncurses 中的错误,它使用有符号整数作为颜色对吗? (即 'tput colors' 表示 256,但 'tput pairs' 表示 32767 而不是 65536) 看起来如果是这种情况,颜色对的前半部分会正确显示,但后半部分会重复或作为 int 进入属性换行。

【问题讨论】:

  • 现在链接到 gist 404s。

标签: ruby ncurses terminal 256color


【解决方案1】:

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

这很不幸,我计划在我的程序中使用队列来使用init_pair() 动态定义颜色,并只是覆盖最近最少使用的对作为折衷方案。我写信给 ncurses 维护者 Thomas Dickey 询问是否有办法暂时离开 ncurses 以编写原始终端代码,然后返回到 ncurses。这是他的回复:

基本上你必须忘记屏幕优化,只做 使用 terminfo(3) 中列出的函数您自己的绘图,例如, tigetstr、mvcur、tputs。

您可以暂时退出 ncurses,但必须重新绘制 屏幕。否则 ncurses 会对屏幕上的内容感到困惑 以及光标在哪里。

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

【讨论】:

  • 感谢您回答我将近四年的问题。我希望它很容易修复,但很高兴知道这个到底出了什么问题。我一直怀疑它会归结为“你只需要自己做”。
【解决方案2】:

我根本不懂 Ruby,所以无法提供一个可行的示例,但 ncurses.rb 脚本应该告诉你一些事情,它比 ansi.rb 脚本短得多。

您没有设置颜色,因此它只是循环使用默认的 16 色调色板以及闪烁下划线、粗体等属性提供的变体。

您需要使用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 的手册页非常宝贵。

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多