颜色没有以诅咒结束

color not ended in curses

我最近正在使用 curses 库开发一个游戏项目,我使用了与颜色相关的函数,例如 start_color()init_color()init_pair()。该颜色在我的项目中效果很好,但一旦使用,其他 TUI 应用程序(如 vim 中的颜色就会出错。

例如: 当我第一次编辑我的代码的某些部分时,它是这样的:

这是 vim 配色方案 slate,看起来不错。

然而,当我运行我的代码并退出并再次编辑代码时,它变成了这样:

注:我做的时候没有做任何改动,我以为是因为我修改了颜色定义当我 运行 我的代码。另外,如果我使用其他功能,它也会出错,如:

但原来的应该是这样的:

我想知道为什么会这样,我想可能有一些我没有使用的颜色结束函数,就像 initscr()endwin(),应该有另一个 start_color()。谁能告诉我为什么?非常感谢。

对于支持它的终端,init_color() 与 ncurses 中其他与颜色相关的函数具有不同的效果。它改变了任何应用程序使用的调色板颜色:

If a terminal is capable of redefining colors, the programmer can use the routine init_color to change the definition of a color.

调色板存储在终端仿真器中;每个使用颜色的应用程序都将使用同一组颜色,除非它通过转义序列修改调色板。这些转义序列记录在 XTerm Control Sequences.

ncurses 无法确定开始时的调色板是什么;它无法在退出时将调色板恢复到其初始状态(例如,在 endwin 中)。与 color pair(默认为 0)不同,没有所有终端使用的预定义调色板可以产生颜色。要了解这一点,请比较这些变体的 initc 功能:

   initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\,
   initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x,

因为 ncurses 拥有的唯一信息是如何更改颜色,它无法在退出时将调色板设置回其原始状态。

进一步阅读: