ncurses 이스케이프 시퀀스 해독

ncurses 이스케이프 시퀀스 해독

ncurses라이브러리에서 생성 되고 strace. 터미널과 상호 작용하는 방법을 탐색 중이며 ncurses"핸드셰이크 프로토콜"을 이해하고 싶습니다. 몇 가지 설명을 찾았지만 "커서 키를 커서로 설정"과 같은 설명을 모두 이해하지 못합니다.

echo $TERM인쇄 xterm-256color.

원래

write(1, "\33[?1049h\33[22;0;0t\33[1;39r\33(B\33[m\33[4l\33[?7h\33[H\33[2J", 46) = 46
write(1, "Hello World !!!", 15)   = 15  
write(1, "\33[39;1H\33[?1049l\33[23;0;0t\r\33[?1l\33>", 32) = 32

내 가설

write(1, "
    \33[?1049h       # go to alternate screen
    \33[22;0;0t
    \33[1;39r
    \33(B            # Set United States G0 character set 
    \33[m            # Turn off character attributes
    \33[4l
    \33[?7h          # Set auto-wrap mode
    \33[H            # Move cursor to upper left corner
    \33[2J           # Clear entire screen
", 46) = 46

write(1, "Hello World !!!", 15)   = 15

write(1, "
    \33[39;1H
    \33[?1049l       # Go back to the initial screen
    \33[23;0;0t\r
    \33[?1l          # Set cursor key to cursor 
    \33>
", 32) = 32

테스트 프로그램 소스 코드

int main()
{   
    napms(25000);               /* This pause is needed to catch the process by strace*/
    initscr();                  /* Start curses mode          */
    printw("Hello World !!!");  /* Print Hello World          */
    refresh();                  /* Print it on to the real screen */
    endwin();                   /* End curses mode        */

    return 0;
}

답변1

XTerm 및 이와 호환된다고 주장하는 모든 항목의 경우 다음이 필요합니다.

https://invisible-island.net/xterm/ctlseqs/ctlseqs.html

XTerm에 의해 에뮬레이트되고 확장되는 VT100 터미널에 대한 매뉴얼도 필요합니다.

https://vt100.net/docs/vt100-ug/contents.html

Linux console_codes(4)매뉴얼 페이지에서는 VT100의 상위 집합이기도 한 Linux 콘솔에서 사용하는 제어 코드를 설명하며, 매뉴얼 페이지에는 위에서 언급한 다른 소스보다 더 자세한 설명이 있는 경우도 있습니다.

http://man7.org/linux/man-pages/man4/console_codes.4.html

귀하의 예에서 알 수 없는 코드:

\33[22;0;0t

여기서 첫 번째 부분 \33[(또는 ) 을 or ESC [라고 합니다 .CSI제어 시퀀스 임포터.

이것은 CSI <number> ; <number> ; <number> t일련의 창 작업입니다. 로 끝나는 제어 시퀀스는 t항상 세 개의 숫자 인수를 사용하지만 항상 전부는 아닙니다. 첫 번째 매개변수는 이고 22두 번째 매개변수는 이므로 0이 코드는 나중에 복원할 수 있도록 현재 창과 아이콘 제목을 저장하도록 터미널 에뮬레이터에 지시합니다.

\33[1;39r

이것은 CSI <number> ; <number> r. "스크롤 영역 설정"을 의미합니다. 현재 창의 크기보다 작게 설정하면 TUI 디스플레이 상단의 메뉴 줄, 하단의 상태 표시줄 또는 두 가지 모두와 같은 정적 항목이 스크롤 내에 많은 양의 텍스트를 표시하는 동안 정적으로 유지되는 것을 효과적으로 허용합니다. 영역.

\33[4l

이것은 CSI <one or more numbers> l. "리셋 모드"를 의미합니다. 값 4는 "대체 삽입 모드"를 재설정(비활성화)하거나 단순히 화면에 인쇄된 모든 항목이 이전 내용을 덮어써야 함을 나타냅니다.

\33[39;1H

이것은 CSI <number> ; <number> H. 그러면 커서가 39행, 1열로 이동됩니다.

\33[23;0;0t

이것은 또 다른 창 작업 순서입니다. 이전에 저장한 창과 아이콘 제목이 복원됩니다. 분명히 테스트 프로그램은 헤더를 전혀 변경하지 않지만 이러한 시퀀스는 별도로 수행되는 표준 초기화/종료 프로세스의 일부 입니다 initscr().endwin()

\33[?1l          # Set cursor key to cursor

이는 VT100 키보드의 커서 키를 일반 "커서 키 모드"로 설정합니다. 추가 기능 키 세트와 같은 응용 프로그램별 목적으로 이러한 키를 사용할 수 있도록 설계된 또 다른 모드가 있습니다. VT100 터미널은 모드 설정에 따라 이러한 키에 대해 다른 출력을 생성합니다. 이는 단순히 응용 프로그램이 커서 키를 기본이 아닌 모드로 전환하는 경우 프로그램이 종료되기 전에 기본 모드로 돌아가도록 보장합니다.

\33>

이것은 단지 입니다 ESC >. 이는 이전 코드와 유사하지만 숫자 키패드에 대한 것입니다.

관련 정보