bash / zshスクリプトで端末がアンダーカルを表示できるかどうかを確認する方法は?

bash / zshスクリプトで端末がアンダーカルを表示できるかどうかを確認する方法は?

bash / zshスクリプトで端末がアンダーカルを表示できるかどうかを確認する方法は?

最近のプロジェクトでは、アンダーカルエスケープシーケンスを使用してzshスクリプトの出力を印刷しました。最新の端末ではうまく機能しますが、AppleのTerminal.appでは反対の背景(前景)として表示されます。端末がアンダースコアを表示できるかどうかを検出し、それを使用するか、デフォルトのアンダースコアをデフォルトとして使用できるようにすることをお勧めします。

答え1

Undercurl は mintty や vte などの一部の端末で使用できます。拡張 terminfo 機能Smulx( set mode under line e xtented) によって有効になります。

最新バージョンのデータベースがあるシステムterminfo(または、少なくとも関心のある端末エントリの場合は、エントリが説明する端末エミュレータに付属している場合もあります)定義オプションterminfoでこれを見ることができます。次のコマンドを実行すると:infocmp-x

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

ここで、パラメータはp1拡張されたnderineの種類で、0はアンダースコアなし、1は通常アンダーライン、2はダブルアンダーライン、3は丸アンダーライン、4はポイントアンダーライン、5はポイントアンダーラインを意味します。ul

下線の色を設定するためのエスケープシーケンスはsetal拡張機能にありますが、ncursesの最新の開発バージョンを見ると、infocmpkittyとminttyエスケープシーケンスの間にかなりの違いがあることがわかりました(minttyが正しいと思いますsetal=\E[5%p1%dm)。

terminfoSmulx機能は現在の端末($TERM1に示すように)で使用できます。これは保証されていませんが、端末がアンダーカルをサポートしているという強力なマークです。

それにもかかわらず、これはかなり新しいものであり、まだ完全に安定していないようです。したがって、変更がすべてのシステムの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

端末の識別を支援するために3つの数字が保存されています。たとえば、tmux84を返します$typeが、他の2では0を返すことがわかりました。screenには83を返し、対応する$typeエンコードバージョンを返します$version。 kitty(4000)またはvteベースの端末(65)と同じです。

Undercurlサポートは0.51.2からvteに追加されたため、65で$type> $version5102の場合はアンダーカルをサポートする必要があることを示します(他の端末エミュレータが識別子として65を選択しないと仮定)。


また、少なくともDebianでは、アプリケーションが実行できるすべての追加タスク/タスクについて通知するのではなく、どのように設定できるかを確認gnome-terminal$TERMてください(違いを参照)。xterm-256colorvte-256colorgnome-terminalvteinfocmp -x vte-256color xterm-256color

関連情報