如何检查终端是否可以在 bash/zsh 脚本中显示 undercurl?
在最近的一个项目中,我使用 undercurl 转义序列来打印 zsh 脚本的输出。它在现代终端中运行良好,但苹果的 Terminal.app 将其显示为相反的背景-前景。如果能够检测终端是否能够显示下划线,然后才使用下划线或默认使用常规下划线,那就太好了。
答案1
Undercurl 在一些终端上可用,例如 mintty 或 vte,显然最初来自猫咪由扩展 terminfo 功能启用Smulx
(s
et m
ode u
nder l
ine e x
tented)。
在具有最新版本数据库的系统上terminfo
(或者至少对于您感兴趣的终端的条目,有时,条目与它们描述的终端模拟器一起提供),如果您运行以下命令terminfo
,则可以在定义中看到它infocmp
选项-x
:
$ infocmp -1 -x vte | grep Smulx
Smulx=\E[4:%p1%dm,
这里的参数是扩展nderinep1
的类型,0表示无下划线,1表示普通下划线,2表示双下划线,3表示卷曲下划线,4表示点下划线,5表示虚下划线。u
l
设置下划线颜色的转义序列位于setal
扩展功能中,尽管查看infocmp
ncurses 的最新开发版本,我发现 kitty 和 mintty 转义序列之间存在显着差异(我怀疑 mintty 是setal=\E[5%p1%dm
正确的)。
terminfoSmulx
功能可用于当前终端(如$TERM
1 所示),尽管不能保证,但这将强烈表明该终端支持 undercurl。
无论如何,这都是相当新的东西,似乎还没有完全稳定,您可能需要等待几年才能将更改渗透到所有系统的 terminfo 数据库中。
具体来看 iTerm2,ncurses 最新开发版本中的 terminfo 来源声称描述了 iTerm2 3.0.15 支持的内容。Smulx
那个里面没有提到。
iTerm2
来源确实包括terminfo 源文件,但它确实重新定义了 for 的条目,xterm
而不是定义 for iTerm2
(!?)。它确实定义了一个Smulx
能力但定义了一个Setulc
能力而不是setal
下划线颜色。
在 中zsh
,您可以使用以下命令测试当前终端的 terminfo 条目中是否存在功能:
if (( $+terminfo[Smulx] )); then
echoti Smulx 3
print Smulx is available
if (( $+terminfo[setal] )); then
echoti setal 1
print Setting the underline colour is also possible.
fi
echoti Smulx 0
else
print no support according to terminfo
fi
如果您不能依赖 terminfo 数据库,或者不能$TERM
指向其中的正确条目,您可以尝试通过查询来识别终端模拟器。一些终端在发送时会回答一些识别序列\e[>c
。
例如:
{
saved=$(stty -g)
stty -echo -icanon min 1 time 10
printf '\e[>c'
IFS='>;' read -rd c ignore type version rom ignore
stty "$saved"
} <> /dev/tty 1>&0
将存储三个数字来帮助您识别终端。例如,我发现tmux
返回 84 for $type
,但似乎返回 0 对于其他 2.screen
返回 83 for$type
及其版本的编码$version
。与 kitty (4000) 或基于 vte 的终端 (65) 相同。
undercurl 支持已添加到 0.51.2 中的 vte 中,因此如果$type
是 65 并且$version
>= 5102,则表明应该支持 undercurl(假设没有其他终端模拟器选择 65 作为其标识符)。
还请参阅至少在 Debian 上如何gnome-terminal
设置$TERM
为xterm-256color
而不是vte-256color
让应用程序了解所有额外的事情gnome-terminal
/vte
可以做的事情(请参阅infocmp -x vte-256color xterm-256color
差异)