我正在运行 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 功能,并且已被修改为使用Cs
和Cr
来设置颜色(在旧版本中使用Cc
和完成Cr
)。较新的版本具有内置逻辑,DECSCUSR
无需 terminfo 扩展即可进行识别。
基于 VTE 的终端(例如 XFCE 终端)可能(取决于版本)实现DECSCUSR
,但 Linux 控制台不太可能这样做,因为它仅实现了 VT220 的一个子集,而DECSCUSR
来自VT520
终端(VT220 的超集)。
您将看到与其他应用程序(例如 emacs)的差异,因为它与DECSCUSR
其他光标样式功能(例如闪烁光标功能)重叠,使用terminfo 中的功能cvvis
进行设置或重置:cnorm
xterm
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 还读取终端条目,查看
cnorm
和civis
。 - 另一方面,elinks 是硬编码的,忽略了终端数据库。快速阅读其源代码时,我没有看到任何重置终端或修改光标外观的转义序列。
由于您使用的是tmux
,您可能还必须修改xterm
(以便在其中运行的应用程序tmux
使用该光标样式)。但请先测试一下没有这个:如果您必须,您可能可以将\e[?8c
与现有cnorm
字符串结合起来,因为xterm
忽略了\e[?8c
。