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).

terminfo Smulx기능은 현재 터미널( $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개의 숫자가 저장되어 있습니다. 예를 들어, tmux에 대해 84를 반환 $type하지만 다른 2에 대해서는 0을 반환하는 것으로 나타났습니다. screen에 대해 83을 반환 $type하고 해당 인코딩 버전을 반환합니다 $version. kitty(4000) 또는 vte 기반 터미널(65)과 동일합니다.

Undercurl 지원은 0.51.2에서 vte에 추가되었으므로 $type65이고 $version>= 5102인 경우 언더컬이 지원되어야 함을 나타냅니다(다른 터미널 에뮬레이터가 식별자로 65를 선택하지 않는다고 가정).


또한 적어도 Debian에서는 애플리케이션이 수행할 수 있는 모든 추가 작업 / 작업 에 대해 알리는 대신 어떻게 gnome-terminal설정할 수 $TERM있는지 확인하세요( 차이점 참조).xterm-256colorvte-256colorgnome-terminalvteinfocmp -x vte-256color xterm-256color

관련 정보