Ubuntu 虚拟终端光标样式重置

Ubuntu 虚拟终端光标样式重置

我正在运行 Ubuntu 14.04 并使用其中一个虚拟终端(TTY[1-6],可通过 Ctrl-Alt-F[1-6] 访问);我想永久更改光标的外观,从明显的默认(闪烁的下划线)更改为闪烁的方框。我可以暂时更改它,但当运行某些应用程序时,它会不断重置。

最初,TTY 会话中的光标样式是闪烁的下划线。我发现可以使用以下命令将其更改为闪烁的框:

printf '\e[?8c'

这会改变终端中的光标,并反映在 emacs 或 elinks 等程序中。所以我将上述命令放入了我的 .bashrc 中。

但是,某些应用程序似乎会将光标样式恢复为闪烁的下划线,即使退出这些应用程序后,这种情况仍然存在。我可以通过重新发出上述命令、获取 .bashrc 或注销并重新登录将光标样式重置为闪烁的框。

例如,考虑以下 3 个应用程序 (tmux、emacs、elinks) 如何影响光标样式:

  • tmux:光标样式立即设置为闪烁的下划线,此样式在 tmux 中运行的所有应用程序中都保持不变,退出 tmux 后更改仍然存在。上述 printf 命令在 tmux 中无效。
  • emacs:光标样式是我运行它时处于活动状态的样式,然后在退出 emacs 时样式更改为闪烁的下划线。
  • 链接:光标样式是我运行它时处于活动状态的样式,并且退出 elinks 时光标样式不会改变。

我应该注意到,我有 emacs 设置来将光标样式(在 emacs 内)设置为一个框,并且虽然我在 tmux 中搜索了设置光标样式的设置,但我除了 tmux 手册页中的条目之外找不到任何内容,其中指出:

tmux understands some extensions to terminfo(5):

 [...]

 Cs, Csr
         Change the cursor style.  If set, a sequence such as this may be used to change the cursor to an underline:

               $ printf '\033[4 q'

         If Csr is set, it will be used to reset the cursor style instead of Cs.

不幸的是,我不明白如何“设置 Cs”,并且如上所述,我尝试发出 printf 命令来设置 tmux 内的光标样式,但无济于事。

另一个有趣的现象是,运行 X 终端仿真器(例如 XFCE4 终端)时不会发生光标样式更改的问题。这似乎只发生在 TTY 中。

我似乎找不到任何关于其他人遇到此问题的信息,也找不到上述应用程序中可能导致此问题的设置。是什么导致了此问题,我该如何解决它,以便始终拥有闪烁的块状光标样式?

答案1

终端功能并非在所有终端上都可用,并且可能因 tmux 版本的不同而不同。我看到 Debian 7 上的 tmux 1.6 中引用了描述。Ubuntu 14.04 有点旧,并且有 tmux 1.8(相同描述)。

手册页中给出的示例如下所示,通过以下方式DECSCUSR支持xterm补丁 #2522009 年。请参阅XTerm 控制序列

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).

要使用它们,你需要使用 ncurses 的 tic 修改 terminfo 条目,例如,

infocmp -x >foo
vi foo
tic -x foo

添加此行(与其他功能一样,带有前导制表符):

Cs=\E[%p\sq, Csr=\E[0\sq,

但是,检查 tmux 2.1 的源代码后,它不再读取那些 terminfo 功能,并且已被修改为使用CsCr来设置颜色(在旧版本中使用Cc和完成Cr)。较新的版本具有内置逻辑,DECSCUSR无需 terminfo 扩展即可进行识别。

基于 VTE 的终端(例如 XFCE 终端)可能(取决于版本)实现DECSCUSR,但 Linux 控制台不太可能这样做,因为它仅实现了 VT220 的一个子集,而DECSCUSR来自VT520终端(VT220 的超集)。

您将看到与其他应用程序(例如 emacs)的差异,因为它与DECSCUSR其他光标样式功能(例如闪烁光标功能)重叠,使用terminfo 中的功能cvvis进行设置或重置:cnormxterm

CSI ? Pm h
          DEC Private Mode Set (DECSET).
            Ps = 1 2  -> Start Blinking Cursor (att610).

但是,您似乎想要修改 Linux 控制台(也称为虚拟控制台)中的光标外观。 DECSCUSR在那里没有效果。

让光标变成闪烁的方块全部此时,您必须更改所使用的终端描述中的光标外观功能。这些功能包括civis(使光标不可见)、cnorm(使光标呈现“正常”外观)和cvvis(使光标非常明显):

  • 在“linux”条目中同时设置这两个选项\e[?8c会告诉使用该条目的程序(例如 emacs)使用闪烁框光标。
  • tmux 还读取终端条目,查看cnormcivis
  • 另一方面,elinks 是硬编码的,忽略了终端数据库。快速阅读其源代码时,我没有看到任何重置终端或修改光标外观的转义序列。

由于您使用的是tmux,您可能还必须修改xterm(以便在其中运行的应用程序tmux使用该光标样式)。但请先测试一下没有这个:如果您必须,您可能可以将\e[?8c与现有cnorm字符串结合起来,因为xterm忽略了\e[?8c

相关内容