在 emacs 中启用 24 位颜色有 3 种方法:(
代码来自 emacs 的term.c
)
(注意:测试颜色是否有效的一种简单方法是检查M-x list-colors-display
)
正确的方法是设置TERM
一个支持直接颜色的值(通过RGB
terminfo 功能),如果您的终端可用(或者只是尝试 xterm-direct)。
这些通常命名为“(terminalName)-direct”(xterm-direct
,vte-direct
等)
ex: TERM=xterm-direct emacs
,或通过配置终端正确设置 TERM。
编辑:
xterm-direct(及相关)的实现存在缺陷。某些蓝色阴影被视为索引颜色(因为它对 rgb 和索引颜色使用相同的序列),并且不会正确渲染。我推荐使用第二种方法。
/* Standard support for 24-bit colors. */
else if (tigetflag ("RGB") > 0)
{
/* ... */
tty->TN_max_colors = 16777216;
}
另一种选择是使用具有非标准 terminfo 功能的 terminfo 文件setf24
和setb24
(参见答案https://stackoverflow.com/a/50577683/6232794)。与其他两个版本相比,旧版本的 emacs 可能支持此方法
const char *fg = tigetstr ("setf24");
const char *bg = tigetstr ("setb24");
/* Non-standard support for 24-bit colors. */
if (fg && bg
&& fg != (char *) (intptr_t) -1
&& bg != (char *) (intptr_t) -1)
{
tty->TS_set_foreground = fg;
tty->TS_set_background = bg;
tty->TN_max_colors = 16777216;
}
作为最后的手段,您可以将环境变量设置COLORTERM
为“真彩色”,这可能适用于您的终端。
/* Fall back to xterm+direct (semicolon version) if requested
by the COLORTERM environment variable. */
else if ((bg = getenv("COLORTERM")) != NULL
&& strcasecmp(bg, "truecolor") == 0)
{
tty->TS_set_foreground = "\033[%?%p1%{8}%<%t3%p1%d%e38;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%d%;m";
tty->TS_set_background = "\033[%?%p1%{8}%<%t4%p1%d%e48;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%d%;m";
tty->TN_max_colors = 16777216;
}