使用terminfo的终端颜色?

Terminal color using terminfo?

我正在编写 C++ class 允许在终端中使用颜色。我希望它适用于每个终端:

我曾使用 termcap 编写过一次 C 函数,我想在这种情况下使用它。但是,手册页说:

The termcap database is an obsolete facility for describing the capabilities of character-cell terminals and printers. It is retained only for capability with old programs; new ones should use the terminfo database and associated libraries.

所以我尝试使用 terminfo,但找不到如何执行此操作。我的系统中没有 terminfo.h(我在 Debian 上 运行)。

我的问题是:

如何使用最新的工具(即不是 termcap,根据联机帮助页)在 C/C++ 中获得当前终端的颜色可能性?

简短的回答是,在 ncurses 6.1 于 2018 年 1 月发布之前,您无法从 terminfo 获取信息。

较长的答案:

  • 要有效地使用 TrueColor,您需要一个接口来处理 3 个参数(对于 redgreenblue). Termcap 不能这样做。 Terminfo 可以处理多个参数,但是...
  • 没有标准终端 capability(功能的名称,可以是布尔值、数字或字符串)处理 TrueColor。
  • 您可以调整现有功能,但它们有局限性

查看 terminfo(5) 手册,您可能会看到这些(字符串):

   initialize_color          initc  Ic   initialize color #1
                                         to (#2,#3,#4)
   initialize_pair           initp  Ip   Initialize color
                                         pair #1 to
                                         fg=(#2,#3,#4),
                                         bg=(#5,#6,#7)

与这些(数字)相关的:

   max_colors                colors Co   maximum number of
                                         colors on screen
   max_pairs                 pairs  pa   maximum number of
                                         color-pairs on the
                                         screen

ANSI 颜色和与之兼容的方案(例如 16 色、88 色和 256 色)假设您正在 中为前景和背景着色。原因是很久以前,硬件终端就是这样工作的。 initialize_color 功能适用于不同的方案 (Tektronix),这似乎很有用。

但是,terminfo 是编译的,生成的二进制文件仅存储带符号的 16 位整数。您无法使用终端描述为 24 位颜色存储合适的 max_pairs max_colors。 (termcap 将所有内容存储为字符串,但如前所述不适用于此应用程序)。

在首次编写此问答几年后,terminfo 已更新为使用一种新的文件格式,该格式使用带符号的 32 位整数,足以用 24 位 RGB 颜色表示颜色数.

可以在 ncurses 6.1 and in the updated term(5) manual page 的发布公告中找到更多详细信息,后者指出某些直接访问 terminfo 数据的应用程序使用的旧 API 仍然存在限制。

进一步阅读: