在 gnome-terminal 和 konsole 中,我的光标颜色会根据 vim 中选择的前景色而变化(如果我在红色文本上,我的光标是红色的)。在 xterm 中,我的光标始终是白色的。如何将 xterm 设置为与 gnome-terminal 或 konsole 相同的行为?
非常感谢。
实际上,xterm 的手册并没有那么简单,也没有适合这个特性的教程。引用手册:
cursorColor(类CursorColor)
指定用于文本光标的颜色。默认值为“XtDefaultForeground”。默认情况下,xterm 尝试保持此颜色与背景颜色不同,因为它通过填充文本单元格的背景来绘制光标。相同的限制适用于可能改变此颜色的控制序列。
设置此资源会覆盖 xterm 对光标颜色的大部分调整。它仍然会使用反向视频来禁止某些情况,例如黑色背景上的黑色光标。
此外,可以特殊处理突出显示(引用命令行选项的描述);
-hm
告诉 xterm 使用 highlightTextColor 和 highlightColor 覆盖选择中反转的前景色/背景色。它将 highlightColorMode 资源设置为“true”。
这暗示了几个案例:
现在... xterm 基本上通过选择反转前景与背景的颜色使光标可见(除非被覆盖)。Gnome-terminal 做了类似的事情,但不是真的:它从调色板中选择相反的项目,这可以(现在阅读一个例子)使光标不那么明显,因为它使用的调色板不那么发光。(特别是,我注意到黄色文本的“反面”变成了暗橙色)。Konsole 的调色板通常提供更差的可见性(尽管黄色像 xterm 一样反转,红色文本在黑色背景下不明显)。
XTerm:
侏儒终端:
康索莱
简而言之:听起来好像 OP 的 xterm 配置为将光标颜色设置为特定值,而解决方法是消除该设置。但是文本上光标的外观会有所不同,除非对配置颜色(对于所有三个终端)给予一些注意。
为确保光标颜色始终为前景颜色,请.Xresources
为您自己或/etc/X11/app-defaults/XTerm
整台机器添加此颜色。第二个位置可能因操作系统而异。
xterm*cursorColor: *XtDefaultForeground
根据Xterm Control Sequences,您可以使用Control Sequence Introducer
and Operating System Command
, CSI
/OSC
简称。
有趣OSC
:
OSC Ps ; Pt BEL
...
Ps = 1 2 ⇒ Change text cursor color to Pt.
使用它OSC
,我们可以将文本光标更改为任何所需的颜色,它接受颜色名称,例如red
等green
或类似的东西:rgb:RR/GG/BB
请参阅XParseColor
有趣CSI
:
CSI Ps SP q
Set cursor style (DECSCUSR), VT520.
Ps = 0 ⇒ blinking block.
Ps = 1 ⇒ blinking block (default).
Ps = 2 ⇒ steady block.
Ps = 3 ⇒ blinking underline.
Ps = 4 ⇒ steady underline.
Ps = 5 ⇒ blinking bar, xterm.
Ps = 6 ⇒ steady bar, xterm.
现在使用 vimt_SI
和t_EI
这些CSI
/OSC
我们可以做这样的事情:
let &t_SI="\<Esc>[5 q\<Esc>]12;" . rgb_or_name_color . "\x7"
let &t_EI="\<Esc>[5 q\<Esc>]12;" . rgb_or_name_color_for_not_insert_mode . "\x7"
这是一个函数,它解析当前配色方案Cursor
和Type
hi组的guifg
(有用的set termguicolors
)/ctermfg
颜色,然后根据这些颜色设置t_SI
和:t_EI
fun! UpdateTermCursor()
if &term =~ "xterm\\|rxvt"
fun! s:cologet(gr)
let cc = execute('hi ' . a:gr)
let color = matchstr(cc, 'guifg=\zs[^ ]*')
if color == 'bg'
let color = matchstr(cc, 'guibg=\zs[^ ]*')
endif
if color == ''
let color = matchstr(cc, 'ctermfg=\zs[^ ]*')
endif
if color[0] == '#'
let color = 'rgb:' . substitute(color[1:-1], '..', '\0\/', 'g')[0:-2]
endif
return color
endfun
let cur = s:cologet('Cursor')
" You can change group, for example CursorLineNr, Special, NonText etc.
let curb = s:cologet('Type')
let &t_SI="\<Esc>[5 q\<Esc>]12;" . curb . "\x7"
let &t_EI="\<Esc>[1 q\<Esc>]12;" . cur . "\x7"
" Redraw
:call feedkeys("i\<C-O>:stopinsert\<CR>")
" silent! exe ':redraw!'
" :call feedkeys("i\<Esc>l")
" Restore cursor to I when leaving vim
augroup TermCursorLeave
autocmd!
autocmd VimLeave * silent !echo -ne "\e[5 q"
augroup END
endif
endfun
使用更改颜色方案后:colorscheme
,执行:call UpdateTermCursor()
,这里是示例:
根据 Xterm 的手册,它会自动高亮文本光标。Gnome-terminal 继承了 Xterm 的这一特性,这就是 vim 中光标颜色变化的原因。
在我的例子中,xterm 在光标高亮方面与 gnome-terminal 的工作方式相同。
您使用的是真正的 xterm,所以只是将 $TERM 设置为“xterm”的其他术语?