我最近正在使用 curses
库开发一个游戏项目,并且使用了与颜色相关的函数,例如 start_color()
、init_color()
和init_pair()
。该颜色在我的项目中效果很好,但一旦使用,其他 TUI
应用程序(如 vim
)中的颜色就会出错。
例如: 当我第一次编辑代码的某些部分时,它是这样的:
这是带有 colorcheme slate
的 vim
,看起来不错。
但是,当我运行代码并退出并再次编辑代码时,它会变成这样:
注意:我执行此操作时没有更改任何内容,我认为这是因为我在运行代码时更改了颜色定义。另外,如果我使用其他函数,也会出错,例如:
我想知道为什么会发生这种情况,我认为可能有一些我没有使用的颜色结束函数,就像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
中)。与颜色对(默认为0)不同,所有可以生成颜色的终端都没有使用预定义的调色板。要了解这一点,请比较这些变体的 initc
功能:
- xterm (256 色)
initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
- Linux console (16 种颜色)
initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x,
因为 ncurses 拥有的唯一信息是如何更改颜色,因此它无法在退出时将调色板设置回其原始状态。
进一步阅读:
关于颜色并没有以诅咒结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36051061/