2009-05-22 7 views
1

안녕하세요 저는 작은 콘솔 응용 프로그램을 개발하기 위해 curses를 사용하고 있습니다.Ruby 키보드 이벤트 처리

사용자 입력을 기다리는 주 루프 섹션이 있는데, getstr 기능을 사용합니다. 물론 사용자가 enter 키를 기다립니다.

위아래로 탭 키 누르기를 캡처하고 싶습니다. 나는 이것이 getstr과 함께 할 수 없다고 생각한다.

누구나 어떻게해야할까요?

편집 : 내가 실행 STDIN.getc 느릅 나무 블록에게 응용 프로그램을 사용 해봤와 getch 나던 화살표 키

편집 # 2 잡기 : 창에이 코드를하려고 메신저. Curses.getch는 리눅스에서 작동하는 것으로 보이지만, Windows에서는 위쪽 화살표로 전송 된 키가 없습니다.

답변

3

키를 즉시 누르도록 tty의 "cbreak"모드를 설정해야합니다. 이렇게하지 않으면, 유닉스 터미널 처리 시스템은 개행 문자가 수신 될 때까지 (즉, 사용자가 ENTER에 도달 할 때까지) 입력을 버퍼링하고 입력은 모두 그 시점에서 프로세스에 넘겨 질 것이다.

이것은 실제로 루비 또는 저주와 관련이 없습니다. 이것은 유닉스 tty를 돌리는 모든 애플리케이션이 작동하는 방식이다.

curses 라이브러리 cbreak() 기능을 사용하여이 모드를 켜보십시오. 종료하기 전에 nocbreak()에 전화해서 잊지 마세요.

단일 문자를 읽는 경우 STDIN.getc은 해당 문자의 ASCII 코드의 Fixnum을 반환합니다. 아마도 다음 문자의 한 문자 문자열을 반환하기 때문에 STDIN.read(1)이 더 편리 할 것입니다.

그러나 화살표 키를 의미하는 "위/아래"키는 실제로 일련의 문자입니다. 요즘 대부분의 ANSI와 유사한 터미널 에뮬레이터 (예 : xterm)에서 위쪽 화살표는 "\e[A"(\e은 이스케이프 문자)입니다. 이런 종류의 일을 처리하기 위해 termcap (터미널 기능) 데이터베이스가 있으며, curses를 통해 액세스 할 수 있지만, 처음에는 직접 해석하여 실험하는 것이 가장 쉽습니다. 당신은 요즘 ANSI 코드 이외의 것을 사용하여 터미널에 뛰어 들지는 않을 것입니다.

+0

답을 찾으려면 지금 메신저를 시도해보십시오. btw는 내게 crmode 기능이 무엇인지 말해 줄 수 있습니까? –

+0

나는 crmode와 nocrmode에 대해 들어 보지 못했지만, http://redmine.ruby-lang.org/issues/show/916에 따르면, 그들은 cbreak와 nocbreak의 별명 일 뿐이며 (이제 버그가 수정 됨). –

+0

그런 다음 crmode 또는 cbrak를 사용하면 같은 일이 발생합니다. –

0

당신은 getstr보다는 getch를 원합니다. 또한 단일 문자가 아닌 화살표 키에 대한 curt sampson의 의견을 참조하십시오.

+0

getch는 화살표를 잡으려고하지 않고 Tab만을 잡습니다 –

+0

화살표를 누를 때 ESC를 잡습니까? 그렇다면 화살표 키를 누를 때 전송되는 세 문자를 모두 읽지 않을 수도 있습니다. 그것은 화살표를 캐치하지 않았던 –

+0

, 값이 리눅스에서, 이것은 나를 위해 일한 입력 –