如何不改变其他终端程序的颜色?

How to not change the colors in other terminal programs?

我发现了一个我用 ncurses 写的老游戏。我注意到在关闭游戏和 运行 另一个基于 ncurses 的程序后,该程序的颜色也发生了变化。这完全是我几年前编写游戏时没有意识到的预期行为。

由于ncurses不知道初始调色板,退出游戏后无法将调色板重置为其初始值。考虑到这一点,在 ncurses 中处理颜色的最佳方法是什么?

这是我的考虑:

  1. 只覆盖调色板中较高的颜色。如果您从位置 0 开始更改颜色,您很可能会更改其他程序正在使用的颜色。如果您从 100(例如)开始,您的更改将不太可能干扰另一个程序。我想不改变 16 色 ANSI 调色板是这里的关键。
  2. 手动检查默认调色板并选择适合游戏的默认颜色。除了麻烦而且可能无法让您设置所需的确切颜色之外,无法保证默认调色板在所有系统上都是相同的。可能有一个库可以自动获取相应的 xterm 颜色。好像是https://github.com/vim-scripts/CSApprox is doing something like that. I would assume that most modern systems will run terminals with the same palette, so it might be fine, depending on what systems you are targeting. The default palette of xterm is available here: https://jonasjacek.github.io/colors/
  3. color_content得到原来的颜色。我试过了,没用。 ncurses只能得到init_color设置的颜色的颜色内容。
  4. 将调色板恢复为默认的xterm调色板。我想如果终端支持256色,它很有可能使用默认的[=14] =] 调色板。但是,用户可能已更改它,因此它可能仍会干扰用户配置。
  5. 使用 API 特定于 xterm 或其他终端仿真器来获取颜色。 我不知道是否存在这样的 API ,但这将是一个潜在的解决方案,主要缺点是它只支持特定的终端仿真器。

我可能会同时实现 1 和 2,并让用户通过传递标志来选择行为。我不知道有任何使用丰富颜色的终端程序,所以不确定有多少程序实际面临这个问题,但肯定至少有几个。如果您有其他程序如何处理此问题的任何示例,那将非常有帮助。

来自https://invisible-island.net/ncurses/ncurses.faq.html

If your terminal description does not contain the orig_pair or orig_colors capability, you will be unable to reset colors to the pre-curses state. This happens, for example, with aixterm.

However, if your terminal does support resetting colors to a default state, ncurses will use this when exiting Curses mode. Terminal types that do this include the Linux console, rxvt and the XFree86 xterm.

要了解您的终端是否可以重置颜色,运行:

infocmp -L | grep orig

我的只能重置对,不能重置颜色。我还没有找到一个 API 来从程序本身检查它,但没有真正的理由检查它,除非你已经实现了多种处理颜色的方法。顺便说一句,我有,但我对两者都不满意。

我尝试覆盖调色板中较高位置的颜色,但我仍然设法为其他程序更改颜色。我仍然认为避免使用前 16 种颜色是明智的,但似乎没有可以安全更改的颜色。

我也试过使用https://jonasjacek.github.io/colors/的默认颜色,但我无法获得我想要的效果。我可能可以简化主题并让它看起来不错,但我无法复制我想要的外观。

似乎最好的解决方案是使用默认颜色制作一个漂亮的主题,除非这是不可能的,在这种情况下,您将不得不接受其他程序可能因此看起来不太好。无论如何,打开一个新的终端并不太难,这会让你的颜色重新排序。