ncurses의 이상한 동작은 TERM 값에 따라 다릅니다.

ncurses의 이상한 동작은 TERM 값에 따라 다릅니다.

다음 문제를 이해하려고 노력 중입니다. 다음 ncurses 프로그램을 고려해보세요:

#include <curses.h>
int main() {
  initscr(); noecho(); printw("0000000"); getch();
}

다음으로 컴파일:

$ gcc -o t t.c -lncurses

기본 설정을 사용하여 본 내용은 다음과 같습니다(exec 줄은 간단합니다 $ ./t).

0

이상한 것 같습니다. 를 사용하여 이를 확인할 수 있습니다 script. 이것이 내가 얻는 것입니다:

$ teseq typescript
|Script started on 2020-04-02 08:52:58+02:00 [TERM="xterm-256color" TTY="/de|-
-|v/pts/0" COLUMNS="211" LINES="46"]|.
: Esc ]
& OSC: OPERATING SYSTEM COMMAND
|0;malat@remote: /tmp|
. BEL/^G
: Esc [ 1 ; 32 m
& SGR: SELECT GRAPHIC RENDITION
" Set bold text.
" Set foreground color green.
|malat@remote|
: Esc [ 0 m
& SGR: SELECT GRAPHIC RENDITION
" Clear graphic rendition to defaults.
|:|
: Esc [ 1 ; 34 m
& SGR: SELECT GRAPHIC RENDITION
" Set bold text.
" Set foreground color blue.
|/tmp|
: Esc [ 0 m
& SGR: SELECT GRAPHIC RENDITION
" Clear graphic rendition to defaults.
|$ ./t|
. CR/^M LF/^J
: Esc [ ? 1049 h
& SM: SET MODE (private params)
" (Xterm) Save the cursor position and use the alternate screen buffer,
"  clearing it first.
: Esc [ 22 ; 0 ; 0 t
: Esc [ 1 ; 46 r
" (DEC) Set the scrolling region to from line 1 to line 46.
: Esc ( B
& GZD4: G0-DESIGNATE 94-SET
" Designate 94-character set B (US-ASCII) to G0.
: Esc [ m
& SGR: SELECT GRAPHIC RENDITION
" Clear graphic rendition to defaults.
: Esc [ 4 l
& RM: RESET MODE
" INSERTION REPLACEMENT MODE (IRM) -> REPLACE
: Esc [ ? 7 h
& SM: SET MODE (private params)
" (DEC) Text auto-wrap mode.
: Esc [ H
& CUP: CURSOR POSITION
" Move the cursor to line 1, column 1.
: Esc [ 2 J
& ED: ERASE IN PAGE
" Clear the screen.
|0|
: Esc [ 6 b
& REP: REPEAT
: Esc [ 46 ; 1 H
& CUP: CURSOR POSITION
" Move the cursor to line 46, column 1.
: Esc [ ? 1049 l
& RM: RESET MODE (private params)
" (Xterm) Leave the alternate screen buffer and restore the cursor.
: Esc [ 23 ; 0 ; 0 t
. CR/^M
: Esc [ ? 1 l
& RM: RESET MODE (private params)
" (DEC) Cursor key mode off.
: Esc >
& DECKPNM: KEYPAD NORMAL MODE
: Esc ]
& OSC: OPERATING SYSTEM COMMAND
|0;malat@remote: /tmp|
. BEL/^G
: Esc [ 1 ; 32 m
& SGR: SELECT GRAPHIC RENDITION
" Set bold text.
" Set foreground color green.
|malat@remote|
: Esc [ 0 m
& SGR: SELECT GRAPHIC RENDITION
" Clear graphic rendition to defaults.
|:|
: Esc [ 1 ; 34 m
& SGR: SELECT GRAPHIC RENDITION
" Set bold text.
" Set foreground color blue.
|/tmp|
: Esc [ 0 m
& SGR: SELECT GRAPHIC RENDITION
" Clear graphic rendition to defaults.
|$ exit|
. CR/^M LF/^J LF/^J
|Script done on 2020-04-02 08:53:04+02:00 [COMMAND_EXIT_CODE="1"]|.

그러나 지금 이 작업을 수행하면 다음과 같습니다.

$ TERM=xterm-color ./t

예상되는 결과를 볼 수 있습니다.

0000000

내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

이는 REP(이전 문자 반복) 이스케이프 시퀀스의 알려진 문제인 것으로 나타났습니다. 또한보십시오:

이 문제는 데비안에서 해결되었습니다:

관련 정보