bash / zshスクリプトで端末がアンダーカルを表示できるかどうかを確認する方法は?
最近のプロジェクトでは、アンダーカルエスケープシーケンスを使用してzshスクリプトの出力を印刷しました。最新の端末ではうまく機能しますが、Appleの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,
ここで、パラメータはp1
拡張されたnderineの種類で、0はアンダースコアなし、1は通常アンダーライン、2はダブルアンダーライン、3は丸アンダーライン、4はポイントアンダーライン、5はポイントアンダーラインを意味します。u
l
下線の色を設定するためのエスケープシーケンスはsetal
拡張機能にありますが、ncursesの最新の開発バージョンを見ると、infocmp
kittyとminttyエスケープシーケンスの間にかなりの違いがあることがわかりました(minttyが正しいと思いますsetal=\E[5%p1%dm
)。
terminfoSmulx
機能は現在の端末($TERM
1に示すように)で使用できます。これは保証されていませんが、端末がアンダーカルをサポートしているという強力なマークです。
それにもかかわらず、これはかなり新しいものであり、まだ完全に安定していないようです。したがって、変更がすべてのシステムの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つの数字が保存されています。たとえば、tmux
84を返します$type
が、他の2では0を返すことがわかりました。screen
には83を返し、対応する$type
エンコードバージョンを返します$version
。 kitty(4000)またはvteベースの端末(65)と同じです。
Undercurlサポートは0.51.2からvteに追加されたため、65で$type
> $version
5102の場合はアンダーカルをサポートする必要があることを示します(他の端末エミュレータが識別子として65を選択しないと仮定)。
また、少なくともDebianでは、アプリケーションが実行できるすべての追加タスク/タスクについて通知するのではなく、どのように設定できるかを確認gnome-terminal
し$TERM
てください(違いを参照)。xterm-256color
vte-256color
gnome-terminal
vte
infocmp -x vte-256color xterm-256color