2016-12-13 1 views
1

학생 프로젝트 용으로 Irssi interface을 복제 중입니다. 텍스트 인터페이스에 NCurses을 사용하고 메시지를 쓰는 동안 더 나은 텍스트 편집 기능을 제공하기 위해 readline을 사용하고 싶습니다.Readline & NCurses, 특수 키와 키 조합 처리

question, answerproject은 좋은 출발점을 제공했습니다.

내 문제는 내가이 같은 입력/이벤트 루프를하고 싶은 것입니다 :

int ch; 
while (exit_condition) { 
    ch = wgetch(window); 
    switch (ch) { 
    case ERR: continue; 
    case KEY_F(1): /* do something */ break; 
    case KEY_UP: /* do something else */ break; 
    default: forward_to_readline(ch); break; 
    } 
} 

하지만 입력을 수정합니다 keypad(window, TRUE)을 활성화하고 그것을 할 필요가 KEY_F(n) 또는 KEY_UP 일치하기 위해 readline에서는 사용할 수 없습니다. 수동에서

은 :

키패드가 TRUE이고, 기능 키를 누르면

, 그 기능 키에 대한 토큰 대신 원시 문자 반환됩니다.

curses는 기능 키의 시작이 될 수있는 문자를 (현대 단말기에서 이스케이프 문자를 의미 함)로 수신하면 타이머를 설정합니다. 시퀀스의 나머지가 지정된 시간 내에 에 오지 않으면 문자가 전달됩니다. 그렇지 않으면 함수 키 값이 반환됩니다. 이러한 이유로 많은 터미널에서 사용자가 이스케이프 키를 누른 시간 사이에 지연이 발생하고 이스케이프가 프로그램에 반환됩니다.

여기에 내 생각은 다음과 같습니다

  • keypad의 효과를 반전하는 기능이 있습니까?
  • keypad의 동작을 직접 구현해야합니까? Shift + Up과 같은 이벤트를 잡으려면이 작업을 수행해야한다고 생각합니다. 나는 이것의 예를 가지고 기뻐할 것이다.
  • NCurses 형식을 얻을 수없는 경우 readline에서 키 조합을 제공 할 수 있습니까? 어쩌면 열쇠 바인딩 콜백 (relevant ?)을 가지고 있을까요?

감사합니다.

답변

2

여러 질문이 있습니다. 간단히 :

  • keypad 기능의 역이 호출하다 FALSE 설정 파라미터로 지정된 창.
  • 일부 응용 프로그램은 자신의 버전 인 keypad/wgetch을 구현하지만 (ncurses 'ESCDELAY으로 시간 제한을 제어 할 수 있다고 가정 할 때) Solaris curses와 같이 이식성을 높이고 싶지 않은 경우에는 이득이별로 없습니다.
  • 당신은
  • readline에 터미널 데이터베이스의 기능까지 목록 Shift +에 보이지 않는 (즉, 터미널 의존 이스케이프 시퀀스이다) 예를 들어, Shift + 최대 어떤 개선을 얻을 수 없겠죠 (그것이 알고있는 termcap의 하위 세트에는 없습니다). 당신이 할 수있는 일은 문자열을 readline 함수와 연관시키는 것입니다.
+0

감사합니다. 나는 내 질문에 답할 수있는 더 좋은 사람이 없을 것이라고 생각한다. readline 함수를 사용하겠습니다. 역순으로'keypad '를 의미하는 것은 기능 키를위한 토큰이 주어 졌기 때문에 나는 토큰의 원점에서 이스케이프 코드의 시퀀스를 찾을 수 있었다. –