如 cmets 中所述,在 终端 中,光标 的前景色/背景色大多不受 vim 的控制。 ctermfg 和 ctermbg 的设置仅适用于 text 前景/背景。请参阅vim documentation 中标题为“2. highlight arguments for color terminal”的部分,其中描述了这些内容。
这些设置对应于 ANSI 转义序列 (ECMA-48)。 光标颜色没有对应的标准:
- 许多终端允许您指定光标颜色(在启动终端之前),
- 一些终端识别用于设置光标颜色的转义序列,
- 某些终端会更改光标颜色以使其在相同颜色的文本上保持可见。
同样,当您用鼠标选择文本时,光标颜色的变化(或不变化)的方式也没有标准:
- 某些终端会为反向视频中的选择着色,
- 有些使用特殊的选择颜色,并且
- 选择颜色可能/可能不会影响光标颜色。
没有提到实际使用的终端;假设默认终端是 gnome-terminal。所有相关功能都在VTE library 中。其中一些会随着时间而变化,但在当前代码中,查看位置位于 vtegtk.cc(尽管阅读 vte.cc 也会有所帮助):
/**
* vte_terminal_set_color_cursor:
* @终端:一个#VteTerminal
* @cursor_background: (allow-none): 用于文本光标的新颜色,或 %NULL
*
* 设置光标下文本的背景颜色。如果 %NULL,文本
* 光标下会用前景色和背景色绘制
* 反转。
*/
/**
* vte_terminal_set_color_cursor_foreground:
* @终端:一个#VteTerminal
* @cursor_foreground: (allow-none): 用于文本光标的新颜色,或 %NULL
*
* 设置光标下文本的前景色。如果 %NULL,文本
* 光标下会用前景色和背景色绘制
* 反转。
*
* 自:0.44
*/
/**
* vte_terminal_set_color_highlight_foreground:
* @终端:一个#VteTerminal
* @highlight_foreground: (allow-none): 用于高亮文本的新颜色,或 %NULL
*
* 为突出显示的文本设置前景色。如果 %NULL,
* 未设置。如果既没有设置高亮背景也没有设置高亮前景,
* 突出显示的文本(通常会突出显示,因为它被选中)将
* 前景色和背景色颠倒绘制。
*/
VTE documentation 是从 cmets 生成的(在这种情况下模仿 JavaDoc)。所以阅读源代码是理解程序做什么的唯一方法。 cmets 同意 OP 提出的附加问题:
选择文本时光标背景颜色如何变化?问题是,bg 颜色会变为光标所在文本的颜色。
VTE 中的各个函数模仿 xterm 的特性,从而提供对颜色管理方式的更多控制。例如,VTE 可以识别让xtermcontrol 从shell 命令更改光标颜色的控制序列。控制序列记录在XTerm Control Sequences:
Ps = 1 2 -> Change text cursor color to Pt.
这样做会覆盖 cmets 中提到的反向视频方案。引用xterm manual 给出了一些可以在 VTE 中实施的替代方案的想法:
highlightColor (class HighlightColor)
Specifies the color to use for the background of selected
(highlighted) text. If not specified (i.e., matching the
default foreground), reverse video is used. The default is
"XtDefaultForeground".
highlightColorMode (class HighlightColorMode)
Specifies whether xterm should use highlightTextColor and high-
lightColor to override the reversed foreground/background col-
ors in a selection. The default is unspecified: at startup,
xterm checks if those resources are set to something other than
the default foreground and background colors. Setting this
resource disables the check.