2

在 gnome-terminal 和 konsole 中,我的光标颜色会根据 vim 中选择的前景色而变化(如果我在红色文本上,我的光标是红色的)。在 xterm 中,我的光标始终是白色的。如何将 xterm 设置为与 gnome-terminal 或 konsole 相同的行为?

非常感谢。

4

4 回答 4

1

实际上,xterm 的手册并没有那么简单,也没有适合这个特性的教程。引用手册:

cursorColor(类CursorColor

指定用于文本光标的颜色。默认值为“XtDefaultForeground”。默认情况下,xterm 尝试保持此颜色与背景颜色不同,因为它通过填充文本单元格的背景来绘制光标。相同的限制适用于可能改变此颜色的控制序列。

设置此资源会覆​​盖 xterm 对光标颜色的大部分调整。它仍然会使用反向视频来禁止某些情况,例如黑色背景上的黑色光标。

此外,可以特殊处理突出显示(引用命令行选项的描述);

-hm

告诉 xterm 使用 highlightTextColor 和 highlightColor 覆盖选择中反转的前景色/背景色。它将 highlightColorMode 资源设置为“true”。

这暗示了几个案例:

  • 可以使用命令行选项或资源设置光标颜色。如果以这种方式设置(除非被动态颜色转义序列覆盖以更改颜色),xterm 使用此颜色。
  • 如果它不受约束,xterm 会尝试通过使用由“ANSI”控制序列为颜色 0-7 设置的前景色和背景色的相反颜色以及用于颜色 8-255 的非 ANSI 控件来保持光标可见。
  • 有时,应用程序会将前景色和背景色设置为相同的值(xterm 也会尝试为这种情况选择合适的光标颜色)。
  • 颜色可以单独设置以突出显示。

现在... xterm 基本上通过选择反转前景与背景的颜色使光标可见(除非被覆盖)。Gnome-terminal 做了类似的事情,但不是真的:它从调色板中选择相反的项目,这可以(现在阅读一个例子)使光标不那么明显,因为它使用的调色板不那么发光。(特别是,我注意到黄色文本的“反面”变成了暗橙色)。Konsole 的调色板通常提供更差的可见性(尽管黄色像 xterm 一样反转,红色文本在黑色背景下不明显)。

XTerm:

在此处输入图像描述

侏儒终端:

在此处输入图像描述

康索莱

在此处输入图像描述

简而言之:听起来好像 OP 的 xterm 配置为将光标颜色设置为特定值,而解决方法是消除该设置。但是文本上光标的外观有所不同,除非对配置颜色(对于所有三个终端)给予一些注意。

于 2015-09-01T23:53:09.540 回答
0

为确保光标颜色始终为前景颜色,请.Xresources为您自己或/etc/X11/app-defaults/XTerm整台机器添加此颜色。第二个位置可能因操作系统而异。

xterm*cursorColor:      *XtDefaultForeground
于 2019-09-24T20:42:32.147 回答
0

根据Xterm Control Sequences,您可以使用Control Sequence Introducerand Operating System Command, CSI/OSC简称。

有趣OSC

OSC Ps ; Pt BEL
...
Ps = 1 2 ⇒  Change text cursor color to Pt.

使用它OSC,我们可以将文本光标更改为任何所需的颜色,它接受颜色名称,例如redgreen或类似的东西: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_SIt_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"    

这是一个函数,它解析当前配色方案CursorType 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(),这里是示例:

vim 术语光标颜色

于 2021-01-26T02:02:17.417 回答
-1

根据 Xterm 的手册,它会自动高亮文本光标。Gnome-terminal 继承了 Xterm 的这一特性,这就是 vim 中光标颜色变化的原因。

在我的例子中,xterm 在光标高亮方面与 gnome-terminal 的工作方式相同。

您使用的是真正的 xterm,所以只是将 $TERM 设置为“xterm”的其他术语?

于 2013-05-13T08:01:49.260 回答