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
).
terminfo Smulx
기능은 현재 터미널( $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에 추가되었으므로 $type
65이고 $version
>= 5102인 경우 언더컬이 지원되어야 함을 나타냅니다(다른 터미널 에뮬레이터가 식별자로 65를 선택하지 않는다고 가정).
또한 적어도 Debian에서는 애플리케이션이 수행할 수 있는 모든 추가 작업 / 작업 에 대해 알리는 대신 어떻게 gnome-terminal
설정할 수 $TERM
있는지 확인하세요( 차이점 참조).xterm-256color
vte-256color
gnome-terminal
vte
infocmp -x vte-256color xterm-256color