QEMU는내 터미널을 이상한 상태로 두었습니다.tput smam
마침내 문제의 정확한 함수인 vs 까지 디버깅하는 데 시간이 걸렸습니다 tput rmam
.
현재 터미널 상태를 확인하고 모든 기능의 현재 값을 한 번에 표시할 수 있는 방법이 있나요?
이를 통해 작동 중인 터미널과 "깨진" 터미널을 쉽게 구별하여 무엇이 수정되었는지 알아낼 수 있습니다.
smam
그러나 vs. vs. 와 같은 특정 기능의 현재 상태를 알아내는 것도 좋은 시작 rmam
입니다 .
Ubuntu 19.10, Gnome 터미널에서 테스트되었습니다.
답변1
이는 작동할 수 있습니다(VTE는 이 제어의 일부를 구현합니다).
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:
XTerm
및UXTerm
, 표준 Gnome은 아님Terminal
- 윈도우(WSL):아니요이전 콘솔 창이나 Windows 터미널에서는 지원되지 않습니다.
- macOS:
재지원모드 번호:
이것console_codes(4) Linux
man
페이지일부"DEC 특수 모드(DECSET/DECRST) 시퀀스"1, 3, 5..9, 25 및 1000만 언급됩니다.존재하다관행, 위에서 언급한 터미널 에뮬레이션은 다음과 같은 의미 있는 값을 반환합니다.
iTerm2.app
macOS: 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