在gnome-terminal和konsole中,我的光标颜色根据vim中选定的前景颜色而变化(如果我在红色文本上,我的光标是红色)。 在xterm中,我的光标始终为白色。如何将xterm设置为与gnome-terminal或konsole相同的行为?
非常感谢。
答案 0 :(得分:1)
实际上,xterm的manual并不那么简单,并且没有适合此功能的教程。引自手册:
cursorColor (类 CursorColor )
指定用于文本光标的颜色。默认是 “XtDefaultForeground”。默认情况下,xterm会尝试保留此功能 颜色与背景颜色相同,因为它 通过填充文本单元格的背景来绘制光标。该 相同的限制适用于可能改变的控制序列 这种颜色。
设置此资源会覆盖xterm的大多数调整 光标颜色。它仍将使用反向视频来禁用一些 案例,例如黑色背景上的黑色光标。
此外,可以特别处理突出显示(引用命令行选项的描述);
<强>
-hm
强>告诉xterm使用highlightTextColor和highlightColor 覆盖选择中反转的前景/背景颜色。它将highlightColorMode资源设置为“true”。
这暗示了一些案例:
现在...... xterm基本上通过选择反转前景与背景的颜色使光标可见(除非被覆盖)。 Gnome-terminal做了类似的事情,但并不是真的:它从调色板中选择相反的项目,这可以(现在阅读一个例子)使光标不太明显,因为它使用的调色板不那么明亮。 (特别是,我注意到黄色文本的“反向”变成暗淡的橙色)。 Konsole的调色板通常会提供更差的可见性(虽然黄色像xterm一样反转,红色文字在黑色背景下模糊不清)。
的XTerm:
侏儒末端:
的Konsole
简而言之:听起来好像OP的xterm被配置为将光标颜色设置为特定值,并且修复将消除设置。但是光标在文本上的外观会有所不同,除非注意配置颜色(对于所有三个终端)。
答案 1 :(得分:0)
要确保光标的颜色始终是前景的颜色,请将其自己添加到.Xresources
或整个机器上添加到/etc/X11/app-defaults/XTerm
。秒的位置因操作系统而异。
xterm*cursorColor: *XtDefaultForeground
答案 2 :(得分:0)
根据Xterm Control Sequences,您可以使用Control Sequence Introducer
和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
见 { {3}}
有趣的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.
现在使用 vim 的 t_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
一起使用)/{{ 1}} 种颜色,然后根据这些颜色设置 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
,示例如下:
答案 3 :(得分:-1)
根据Xterm的manual,它会自动突出显示文本光标。 Gnome-terminal从Xterm继承了这个特性,这就是光标颜色在vim中变化的原因。
就我而言,xterm在光标高亮方面与gnome-terminal的工作方式相同。
您使用的是真正的xterm吗?所以只是将其他一些术语设置为'xterm'?