如何检查终端是否可以在 bash/zsh 脚本中显示 undercurl?

如何检查终端是否可以在 bash/zsh 脚本中显示 undercurl?

如何检查终端是否可以在 bash/zsh 脚本中显示 undercurl?

在最近的一个项目中,我使用 undercurl 转义序列来打印 zsh 脚本的输出。它在现代终端中运行良好,但苹果的 Terminal.app 将其显示为相反的背景-前景。如果能够检测终端是否能够显示下划线,然后才使用下划线或默认使用常规下划线,那就太好了。

答案1

Undercurl 在一些终端上可用,例如 mintty 或 vte,显然最初来自猫咪由扩展 terminfo 功能启用Smulxset mode under line e xtented)。

在具有最新版本数据库的系统上terminfo(或者至少对于您感兴趣的终端的条目,有时,条目与它们描述的终端模拟器一起提供),如果您运行以下命令terminfo,则可以在定义中看到它infocmp选项-x

$ infocmp -1 -x vte | grep Smulx
        Smulx=\E[4:%p1%dm,

这里的参数是扩展nderinep1的类型,0表示无下划线,1表示普通下划线,2表示双下划线,3表示卷曲下划线,4表示点下划线,5表示虚下划线。ul

设置下划线颜色的转义序列位于setal扩展功能中,尽管查看infocmpncurses 的最新开发版本,我发现 kitty 和 mintty 转义序列之间存在显着差异(我怀疑 mintty 是setal=\E[5%p1%dm正确的)。

terminfoSmulx功能可用于当前终端(如$TERM1 所示),尽管不能保证,但这将强烈表明该终端支持 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设置$TERMxterm-256color而不是vte-256color让应用程序了解所有额外的事情gnome-terminal/vte可以做的事情(请参阅infocmp -x vte-256color xterm-256color差异)

相关内容