학생 프로젝트 용으로 Irssi interface을 복제 중입니다. 텍스트 인터페이스에 NCurses을 사용하고 메시지를 쓰는 동안 더 나은 텍스트 편집 기능을 제공하기 위해 readline을 사용하고 싶습니다.Readline & NCurses, 특수 키와 키 조합 처리
이 question, answer 및 project은 좋은 출발점을 제공했습니다.
내 문제는 내가이 같은 입력/이벤트 루프를하고 싶은 것입니다 :
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 ?)을 가지고 있을까요?
감사합니다.
감사합니다. 나는 내 질문에 답할 수있는 더 좋은 사람이 없을 것이라고 생각한다. readline 함수를 사용하겠습니다. 역순으로'keypad '를 의미하는 것은 기능 키를위한 토큰이 주어 졌기 때문에 나는 토큰의 원점에서 이스케이프 코드의 시퀀스를 찾을 수 있었다. –