2013-03-31 3 views
1

<Left Arrow>, <Backspace>, <Delete> 등과 같은 특수 키를 눌러 사용자를 에뮬레이트하려고합니다. curses/terminfo가 터미널에 독립적 인 방법으로 그렇게하는 데 도움이 될 것이라고 들었지만 처음 코드 "text"를 인쇄하고 key_left 시퀀스를 내보내려고하면 (다음 코드 사용) 커서가 나타나지 않습니다 (커서가 '|' 인 경우)) "tex|t"이지만, 오히려 "textD|"입니다. 왜? 어떻게 제대로 할 수 있을까요?terminal-agnostic 방식으로 terminfo와 함께 특수 키 시퀀스를 올바르게 인쇄하는 방법은 무엇입니까?

#include <term.h> 
#include <stdio.h> 

static void putf(const char *name) { 
    putp(name); 
    fflush(stdout); 
} 

int main(int argc, char **argv) { 
    setupterm((char*)0, 1, (int*)0); 

    printf("text"); 
    fflush(stdout); 

    putf(key_left); 

    // hang up until user input 
    fgetc(stdin); 

    return 0; 
} 

curses를 사용해도 괜찮지 만 ncurses는 사용 사례에서 용납되지 않습니다. 또한, 현재 터미널 화면을 공백으로 바꾸는 것과 같은 것을 사용하고 싶지는 않습니다. 바람직한 동작이 아니기 때문에 initscr()과 같은 것을 사용하고 싶지는 않습니다.

+0

키 시퀀스는 커서 이동 명령이 아닙니다. 그것들을 전혀 출력해서는 안되며 단지 입력에서 그것들을 탐지해야합니다. –

+0

일종의 독자적인 readline을 구현하고 있으며 현재 터미널 유형 및 설정에 따라 시퀀스를 이스케이프 처리하기 위해 편집 명령을 렌더링해야합니다. –

+2

커서를 왼쪽으로 이동하려면'key_left'가 아니라'cursor_left'를 사용하십시오. 더 많은 명령은'man terminfo'를보십시오. –

답변

1

커서 이동을 담당하는 이스케이프 시퀀스와 화살표 키와 연결된 이스케이프 시퀀스는 일반적으로 구별되며 서로 대신 사용해서는 안됩니다. terminfo 데이터베이스에서 전자는 cursor이며 접두사는 key입니다.

따라서 커서를 왼쪽으로 이동하려면 putp (key_left)이 아니라 putp (cursor_left)을 사용해야합니다.