2011-09-23 6 views
2

루비 프로그램에서 Control-Left, Shift-F10 등을 잡으려고합니다. 일반적으로 getch를 사용하면 27,91,50,50,126과 같은 int리스트를 얻을 수 있습니다. 그러나 나는 이것들이 시스템이나 터미널에 의존 할 수도 있다는 것을 두려워한다. 인터넷 검색 후 use_extended_names, tigetstr 등등에 대해 발견했습니다. 런타임시 키 코드를 발견하는 C 프로그램을 발견했습니다 (Thomas Dickey). 나는 그것을 실행하고 확장 된 키를 발견 한 것 같다.하지만 같은 프로그램의 getch는 여전히 C-left와 같은 int의 일반적인 목록을 제공한다. 나는 하나의 반환 값을 얻을 것으로 기대한다.확장 키 트래핑 ncurses

내가 무엇이 누락 되었습니까?

keypress=27 
keypress=91 
keypress=53 
keypress=68 
key=kLFT5, code=540 
key=kEND5, code=525 
key=kHOM5, code=530 
key=kHOM3, code=528 
key=kUP5, code=561 
key=kDN5, code=520 

난 그냥 540를 얻을 안 : 여기

내가 컨트롤 왼쪽을 누르면 출력입니까? TERM = 화면에서 실행되는 경우 https://gist.github.com/1237091 이상하게

는 모든 코드 0을 표시 : 여기

는 keytest.c이다. 위의 내용은 TERM = xterm입니다. (터미널을 사용하는 OSX를 사용 중입니다.)

+0

샘플 프로그램을 실행할 때 3 행이 인쇄됩니다. tigetstr for ... 해당 행이 표시되지 않으면 터미널 설명에 문제점이 있습니다. 어떤 OS와 터미널을 실행하고 있습니까? – Craig

답변

2

Curses는 사람들이 터미널에서 수정자를 만들기 전에 한 번에 설계되었습니다. 이 키 처리 모델은 값의 일괄 열거 형이며 임의의 키 + 수정 자 조합을 쉽게 처리하지 못합니다.

이 문제를 더 잘 해결하기 위해 libtermkey를 썼습니다. 대신이 방법을 사용하면 더 운이 좋습니다. 이 펄과 파이썬 바인딩을 모두 가지고 있지만

http://www.leonerd.org.uk/code/libtermkey/

그것은, C 라이브러리입니다. 나는 누군가가 Ruby 바인딩을 아주 쉽게 만들 수 있어야한다고 생각한다.

+0

그래서 ncurses 자체가 왼쪽과 같은 컨트롤을 처리 할 수 ​​없습니까? –

+0

@AndriusBentkus - 정확함; 그럴 순 없어. – LeoNerd

0

ncurses는 그 자체로 제어 -, 시프트 -, 메타 - 및 alt 수정 자에 대해 알지 못합니다. 이는 단지 문자만을 알고 있기 때문입니다. 모디파이어는 특정 단말기가 알고있는 것입니다. 일부 터미널은 키보드 수정자를 호스트에 보내는 문자로 인코딩 할 수 있습니다. xterm, 예를 들어 이것을 할 수 있습니다.

의 terminfo (및 TERMCAP)의 변형 특수 키 소수 (오른쪽 화살표를 이동 등)을 포함하여 (예컨대 커서 키, 함수 키 등)의 소정의 특수 키리스트를 가지고있다. 미리 정의 된 키를 상기 단말에 대한 설명 이름뿐만 아니라 curses.h 헤더 KEY_XXX 이름 잘 정의했다. ncurses의 특수 키

  • (주어진 입력 문자열의 이름을 정의) 해당 use_extended_names 기능 tic-x 옵션

    의이 목록을 확장하는 두 가지 방법을 제공합니다.
  • define_key 기능 (코드 할당 주어진 입력 문자열 getch 의해 반환 함).

ncurses 터미널 데이터베이스는 커서 키와 편집 키패드에 초점을 맞춘 수정 된 특수 키에 대해 가장 유용한 정의를 제공합니다. 몇 가지 문제가이 함께 있습니다 휴대용 terminfo의 정의는 4096 바이트로 제한되기 때문에

  • 터미널 데이터베이스가 모든 정의를 제공하지 않습니다. 크기에 제한이 없다면 xterm의 키보드 관련 자원 설정의 (문자 그대로) 수천 가지 조합 각각에 대해 완전한 표를 생성 할 수 있습니다.
  • TERM ~ xterm을 설정하는 일부 터미널은 xterm과 동일한 문자열을 보내지 않습니다. (사실, 대부분은 다르지만 일부는 단순히 다르기보다는 부분 집합 임).
  • 예를 들어, terminfo의 문자열은 \E[5D이고 xterm의 문자열 중 하나는 아닙니다. (OP는 이것이 OSX Terminal이라는 것을 나타 냈습니다. 몇 년 전부터 OSX의 각 릴리스에는 Terminal에 대한 변경 사항이 포함되어 있지만 xterm과 정확히 일치하는 OSX Terminal은 출시되지 않았습니다.) 이것이 xterm 인 것처럼 보이지 않는 이유는 수정 자 (5)가 두 번째가 아닌 첫 번째 위치에 나타나는 것입니다. xterm은 2002 년에 그것을 더 이상 사용하지 않았습니다 (patch #167).
  • 기능 키는 특별한 언급없이 질문에 언급되어 있습니다. ncurses에서 사용되는 규칙은 (거의 표준적인) 12 개의 PC 키보드 기능 키에 4 가지 가장 유용한 시프트 및 제어 수정 자 조합을 할당하여 48 개의 기능 키를 얻는 것입니다. terminfo에는 60 개의 사전 정의 된 기능 키가 있습니다. 추가로 잘 알려진 문자열이있는 경우 나머지 수십 개가 한도에 채워집니다.

미리 정의 된 테이블을 terminfo (크기가 다르며 터미널이 다른 것으로 보이는 문제점이 있음)로 만들기에 충분합니다. define_key 함수는 크기에 제한이 없으며 오랫동안 특수한 요구 사항이있는 응용 프로그램에서 사용할 수 있습니다. 예를 들어 가장 일반적인 터미널의 가장 일반적인 변형을 병합하여 테이블을 만들 수 있습니다.

관련 문제