tput sam과 같은 이스케이프 시퀀스로 설정된 종료 상태를 쿼리하는 방법은 무엇입니까?

tput sam과 같은 이스케이프 시퀀스로 설정된 종료 상태를 쿼리하는 방법은 무엇입니까?

QEMU는내 터미널을 이상한 상태로 두었습니다.tput smam마침내 문제의 정확한 함수인 vs 까지 디버깅하는 데 시간이 걸렸습니다 tput rmam.

현재 터미널 상태를 확인하고 모든 기능의 현재 값을 한 번에 표시할 수 있는 방법이 있나요?

이를 통해 작동 중인 터미널과 "깨진" 터미널을 쉽게 구별하여 무엇이 수정되었는지 알아낼 수 있습니다.

smam그러나 vs. vs. 와 같은 특정 기능의 현재 상태를 알아내는 것도 좋은 시작 rmam입니다 .

Ubuntu 19.10, Gnome 터미널에서 테스트되었습니다.

답변1

이는 작동할 수 있습니다(VTE는 이 제어의 일부를 구현합니다).

CSI ? 추신 $ p

DEC 비공개 모드(DECRQM)를 요청합니다. VT300 이상의 경우 DECRPM에 대한 응답은 다음과 같습니다.

범죄 현장 조사?추신;오후$y

여기서 Ps는 DECSET/DECSET의 모드 번호이고 Pm은 ANSI DECRQM의 모드 값입니다.

구체적으로,추신7이다:

       Ps = 7  ⇒  Auto-wrap Mode (DECAWM), VT100.

이는 다음에서 사용된 설정에 해당합니다.터미널 설명:

rmam=\E[?7l, smam=\E[?7h,

그럼... 당신은 할 것입니다

printf '\033[?7$p'

그리고 돌아오기를 기대하고 있어요

\033[?7;1$y

또는

\033[?7;2$y

모드가 설정되었는지 아니면 재설정되었는지에 따라 다릅니다.

이는 또한 스크립트/프로그램이 읽고 있다고 가정합니다.단말기(불필요한표준 입력). 몇 개 있어요테스트/데모 스크립트xterm의 리소스에서 유용한 자료를 찾을 수 있습니다(대부분의 리소스는 VTE에 적용되지 않음). 일반적으로 나는 이 기능을 테스트합니다.시험, 사용하는 모든 시스템에 맞게 패키지되어 있습니다.

답변2

도착하다다시 채우다 Thomas Dickie의 유용한 답변, POSIX 표준을 준수하는 데 필요한 모든 주요 정보를 제공합니다.편의기능 tmode, 유용한 명령에서 수정됨모스비다음 의견:

터미널 모드 번호가 주어지면 모드 상태를 반영하기 위해 'SET'or 를 인쇄합니다.'RESET'

# Get status of the DECAWM (autowrap) mode
$ tmode 7
RESET

지침:

누구든지 이에 대해 더 많은 정보를 얻을 수 있다면 댓글을 남겨주세요.

  • 기능다음에만 적용됩니다.확증하다터미널 에뮬레이터, 특히아니요그놈 터미널에서:

    • macOS: iTerm2.app, 하지만 내장되어 있지는 않음Terminal.app
    • Ubuntu: XTermUXTerm, 표준 Gnome은 아님Terminal
    • 윈도우(WSL):아니요이전 콘솔 창이나 Windows 터미널에서는 지원되지 않습니다.
  • 재지원모드 번호:

    • 이것console_codes(4) Linux man페이지일부"DEC 특수 모드(DECSET/DECRST) 시퀀스"1, 3, 5..9, 25 및 1000만 언급됩니다.

    • 존재하다관행, 위에서 언급한 터미널 에뮬레이션은 다음과 같은 의미 있는 값을 반환합니다.

      • iTerm2.appmacOS: 1..3, 5..8, 25, 40..41, 45, 47, 69, 1000
      • [U]XTerm우분투: 1..7, 9, 12, 18..19, 25, 30, 35, 38, 40..42, 44..45, 47, 66..67, 69, 80, 95, 1000
    • 아직 더 남았고,숫자가 아닌모델링크된 페이지 man에서 언급됨 (예: =( DECPAM) 및 >( DECPNM)) - 쿼리하는 방법을 모르겠습니다.

    • 하지만토마스 디키 LinksDEC 개인 모드 이스케이프 시퀀스에 대한 설명에서는 반환 값이 0알 수 없는 모드 및 3/ 4또는 "영구 설정/재설정"을 나타냄을 언급합니다. 실제로 이는 4알 수 없는 모드, 알려진 모드만 보고 1("설정", 즉 켜짐) 또는 2( "재설정", 즉 종료).

쉘 기능tmode:

#! /bin/sh -

tmode() (

  [ "$#" -eq 1 ] || { echo "Usage: tmode <mode-number>" >&2; return 2; }
  modeNum="$1"

  # Redirect stdin and stdout temporarily to the controlling terminal.
  # This is necessary so that invocation such as `result=$(tmode 1)` work.
  {
    stty_settings="$(stty -g)"
    stty -icanon -echo min 0 time 5
    # Query the terminal.
    printf '\33[?%s$p' "$modeNum"
    result=$(dd count=1)
    stty "$stty_settings"
  } <> /dev/tty >&0 2> /dev/null
  
  # Activate this to visiualize the raw result.
  # printf %s "$result" | od -t x1 -t c > /dev/tty

  # Print a friendly result.
  case $result in
    *';1$'*)
     echo SET;;
    *';2$'*)
     echo RESET;; 
    # NOTE: It seems that 4 is only ever used to signal a nonexistent mode.
    # *';3$'*)
    #  echo PERMANENTLY SET;; 
    # *';4$'*)
    #  echo PERMANENTLY RESET;; 
    *)
      echo "Unknown mode: $modeNum" >&2;;
  esac
)

답변3

설정 모드

ESC [ Ⓝ h
ESC [ ?

모드 재설정 //설정 취소

ESC [ Ⓝ l
ESC [ ?

요청 모드//쿼리 상태

ESC [ Ⓝ $p
ESC [ ?

Ⓝ는 십진수(모드)입니다.

쉘에서 테스트

#set
echo -ne '\e[?1049h'

#query = set
echo -ne '\e[?1049$p'; cat
^[[?1049;1$y

#reset
echo -ne '\e[?1049l'

#query = not set
echo -ne '\e[?1049$p'; cat
^[[?1049;2$y

참고자료

xterm 문서: DECRQM DECRQM
https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#:~:text=DECRQM
참고: Chrome 액세스를 사용하면 스크롤하여 웹페이지의 키워드를 강조표시할 수 있습니다.


제어 순서
https://terminalguide.namepad.de/seq/

패턴 목록
https://terminalguide.namepad.de/mode/

설정 모드
https://terminalguide.namepad.de/seq/csi_sh/
https://terminalguide.namepad.de/seq/csi_sh__p/

요청 방법
https://terminalguide.namepad.de/seq/csi_sp_t_dollar/
https://terminalguide.namepad.de/seq/csi_sp__p_t_dollar/


vt100 문서
https://vt100.net/docs/vt510-rm/DECRQM.html
https://vt100.net/docs/vt510-rm/DECRPM.html
https://vt100.net/docs/vt220-rm/chapter4.html#S4.6

관련 정보