在我的程序中,.bashrc
我使用printf -- '\x1b[6 q'
闪烁的条形光标xterm(1)
。当我运行时screen(1)
,它会将光标重置为不闪烁的块,并且似乎忽略了我正在尝试的光标形状控制序列的所有变体。
解决方案要么是禁止screen(1)
重置光标形状,要么是让它解释(传递到底层终端)光标控制序列。这两个选项都可行吗?谢谢。
OT:tmux(1)
是的,顺便说一下,开始时不会改变光标形状......
一种可能的解决方案是将光标形状的设置放在 GNUreadline(3)
配置文件中。
在.inputrc
文件中:
$if mode=emacs
$if term=screen.xterm
set show-mode-in-prompt on
# bar cursor
set emacs-mode-string \1\eP\e[6\ q\e\\\2
$endif
$endif
或者,对于vi(1)
编辑模式使用以下命令:
$if mode=vi
$if term=screen.xterm
set show-mode-in-prompt on
# block cursor in command mode
set vi-cmd-mode-string \1\eP\e[2\ q\e\\\2
# bar cursor in insert mode
set vi-ins-mode-string \1\eP\e[6\ q\e\\\2
$endif
$endif
现在它可以按预期工作,并且不需要强制在 XTerm 中闪烁,只需true
启用它即可。
' $if term=screen.xterm
s 将匹配所有 XTerm 类型(即将screen.xterm-256colors
匹配),因为 GNUreadline(3)
匹配特殊关键字的情况term
。因此,在初始设置如下.bashrc
,XTerm 资源关闭闪烁.Xresources
(或.Xdefaults
)和上述readline(3)
设置后,我们可以实现预期的行为。这不是理想的,但似乎有效。任何改进都值得欢迎。
在里面.bashrc
:
case "$TERM" in
xterm*)
printf -- '\x1b[6 q'
;;
esac
在里面.Xresources
:
XTerm*vt100*cursorBlink: true
它有点笨重,我认为可能有更好的方法来做到这一点。
答案1
你可以配置 xterm 让光标闪烁,并忽略任何转义序列,以便稍后进行更改,请参阅man xterm
。例如,使用以下命令启动 xterm:
xterm -xrm XTerm.vt100.cursorBlink:always
根据您的设置,您可以将资源放入文件中~/.Xdefaults
,或者~/.Xresources
,或者在启动时将其输入到 X11 服务器资源数据库中,例如,
echo 'XTerm.vt100.cursorBlink:always' | xrdb -merge
答案2
可以在问题中的附加信息(下划线)中看到有效的解决方案。虽然它可能不是所有解决方案中最好的,但它确实有效并且很好地解决了原始问题。因此,我将这个问题关闭为已解决,这里仅提供解决方案的简要摘要:(1)在 shell 配置中设置 shell 启动时的光标形状,(2)在 GNU readline 配置中设置模式提示以设置光标形状,以及(3)为 XTerm 设置闪烁光标 X 资源(如果需要)。其余部分非常不言自明,可以从引用的问题部分(下划线)中看到。