어떻게 해야 하나요? 여러 줄을 포함 shift+up
하거나 선택하는 터미널 메뉴를 원합니다 shift+down
.
ncurses
문제가 있는 것 같습니다.
반드시 높은 수준의 터미널 라이브러리가 필요한 것은 아닙니다. 내 IO가 매우 단순해야 한다는 것 외에는 이 문제를 처리하고 싶습니다.
어떤 제안이 있으십니까?
답변1
질문의 맥락에서 여러 항목을 선택하는 방법을 묻는 질문이므로 및 (예: 및 대신 )를 참조 shift+up
하세요 .shift+down
shift-cursor-up
shift-cursor-down
shift-page-up
shift-page-down
철사.
이것은 실제로 하나 이상의 질문입니다.
- 첫째, ncurses를 인식하는 방법
shift+up
등 - ncurses 메뉴 라이브러리가 이 작업을 수행하는지 여부
- 그렇지 않은 경우 이 작업을 수행하기 위한 메뉴를 어떻게 얻나요?
첫째, ncurses는 이식 가능한(다소/더 적은) 특수 키 세트에 대해 미리 정의된(X/Open Curses별) 정의를 제공합니다. 인용하다용어 정보(5), 다음 사항을 확인할 수 있습니다.
key_sf kind kF scroll-forward key
key_sleft kLFT #4 shifted left-arrow
key
key_sr kri kR scroll-backward key
key_sright kRIT %i shifted right-arrow
key
그러나 "위쪽 화살표 키"라고 표시된 것은 없습니다. 오직 뒤늦은 판단만이 kind
조화 kri
와 조화를 kLFT
연결할 수 있습니다 kRIT
. 1999년에 수정된 특수 키에 대한 지원이 xterm에 추가되기 전에는 기존 기술이 거의 없었습니다.
패치 #94 - 1999/3/27 - XFree86 3.9Pf
Shift, Control 또는 Alt가 설정되었는지 여부를 나타내는 매개변수를 기능 키에 추가합니다. 이러한 코드는 PC 키보드가 있는 DEC VT510에 대한 Jeffrey Altman의 설명을 기반으로 합니다.
나중에 애플리케이션 혼란을 줄이기 위해 구성표가 수정되었습니다. xterm에서 이 기능을 복사한 다른 개발자는 자신의 프로그램을 따르도록 수정하지 않았습니다.
패치 #167 - 2002/8/24 - XFree86 4.2.0
modifyCursorKeys
Shift 및 유사한 수정자를 사용하여 커서 이스케이프 시퀀스를 생성하는 방법을 제어하는 리소스를 추가합니다 . 기본적으로 수정된 이스케이프 시퀀스는 항상 CSI로 시작하고 수정자를 두 번째 인수로 사용하여 첫 번째 인수를 반복 횟수로 해석하는 애플리케이션의 혼동을 방지합니다. 리소스를 0으로 설정하면 원래 동작을 얻을 수 있습니다(Stephen J Turnbull, Jeffrey Altman과의 뉴스그룹 토론).
또한 ncurses에서는 이를 터미널 설명에 통합하는 것이 유용해 보입니다(ncurses는 tmux에서 사용하는 테이블이 아닌 터미널 데이터베이스를 사용하기 때문입니다). 이는 다음에 의해 도입된 사용자 정의 함수의 기능에 의존합니다.ncurses 5.0. 터미널 데이터베이스에서 이 기능은 xterm에 언급되어 있습니다.2004년:
# 2004-07-17
# * add xterm-pc-fkeys -TD
그 중에는 (이르면 제외)2001년)는 xterm 리소스의 다양한 조합과 함께 사용될 수 있는 수정자 인코딩의 변형과 xterm 인코딩 체계와 정도가 다른 유사한 콘텐츠를 처리하려고 시도합니다.
사용자 정의 함수에 대한 규칙은 먼저 xterm 수정자 코드에 해당하는 번호와 함께 kDN
및 kUP
목록(your shift+down
및 )에 추가하는 것입니다. 훨씬 후에, 그것은 동일한 의미를 가질 수 있다는 shift+up
것이 발견되었습니다 . 그러나 결과적으로 터미널 설명을 찾을 수 있습니다 (ncurses 읽기만 가능 - 터미널 데이터베이스를 직접 읽는 다른 응용 프로그램 및 라이브러리는 약 16년 동안 이를 무시했습니다).kind
kri
kDN
kUP
확장된 기능은 다음에 요약되어 있습니다.터미널 데이터베이스.
이제(2부 기준) ncurses는 메뉴 라이브러리를 제공합니다. 이는 SVr4 메뉴 라이브러리를 다시 구현한 것입니다(멀티바이트 문자 지원과 같은 일부 확장 포함). 맨페이지를 참조하세요.menu_driver(3x)
이 목적을 위해 그리고ncurses-예제도서관을 보여줍니다. 간단히 말해서 메뉴 라이브러리는 사용자가 요청하는 동작을 미리 정의하지 않지만 응용 프로그램은 라이브러리를 사용하여 요청된 작업을 수행할 수 있습니다. 먼저 이 세부정보를 사용하는 방법을 살펴보세요.
REQ_TOGGLE_ITEM
항목을 선택/선택 취소합니다.
이 애플리케이션에서 사용자 정의 함수를 사용하면 더 큰 문제가 발생합니다. 양식 라이브러리와 메뉴 라이브러리를 사용하는 대부분의 애플리케이션은 Case 문에 대한 특수 키를 사용하여 미리 정의된 기호에 의존합니다. 왜냐하면 shift+up
and shift+down
당신은 이것을 갖지 못할 것이기 때문입니다( kind
and의 우연이 kri
발견되고 적용되지 않는 한). 사용자 정의 기능의 경우 미리 정의된 키 코드(예: KEY_DOWN
Medium ) 가 없습니다 curses.h
. 대신 런타임에 의해 결정되는 값이 있습니다.key_defined
기능. 따라서 간단한 사례 설명 대신(다음이 있습니다.예KEY_SDOWN
) curses.h
, 일부 간접 참조가 필요합니다.
답변2
터미널은 키가 아닌 문자를 전송합니다. 대부분의 문자는 인쇄 가능하므로 기능 키와 키 코드를 인코딩할 공간이 많지 않습니다. 기능 키는 이스케이프 문자( \e
많은 프로그래밍 언어에서와 같이 작성할 수 있는 바이트 값 27)로 시작하는 바이트 시퀀스인 이스케이프 시퀀스로 인코딩됩니다 . 자세한 내용은 다음을 참조하세요.키보드 입력과 텍스트 출력은 어떻게 작동합니까?
키 또는 키 코드별로 전송되는 이스케이프 시퀀스에 대한 보편적인 표준은 없습니다. curses 라이브러리는 기능 키 디코딩을 위한 추상화 계층을 제공합니다. 그것은 사용한다용어 모자(이전 스타일) 또는용어 정보(현대) 저수준 라이브러리; 커스와 연결하고 싶지 않다면 termcap/terminfo를 직접 사용할 수 있습니다.
Up또는 및 에 대한 공통 제어 시퀀스를 하드코딩할 수 있습니다 Down. 표준은 없지만 거의 모든 터미널이 \eOA
or \e[A
for Up및 another \eOB
또는 \e[B
for 을 보내고 Down터미널이 다른 키에 대해 이러한 시퀀스를 보내는 것을 본 적이 없습니다.
키와 코드 Shift는 또 다른 이야기입니다. 그들이 보내는 이스케이프 시퀀스는 더 다양하며 많은 터미널은 Up예를 들어 Shift+ 를 구별할 수 없습니다 Up. 제한된 구성 세트만 지원하지 않는 한 구성이 다르다고 믿을 수는 없습니다.새로운 표준그러나 널리 사용되는 많은 터미널 에뮬레이터는 여전히 이를 지원하지 않습니다.
터미널은 키 이벤트를 보내지 않습니다. (단, 설명에 따르면 사용 사례에는 필요하지 않습니다.)
특정 터미널 에뮬레이터(예: 최근 xterm)를 감당할 여유가 없다면 사용자가 Shift+ 를 입력할 수 있을 것이라고 기대하지 마세요 Up. "다중 선택 시작" 키 뒤에 일반 Up/ 와 같은 대안을 지원합니다 Down.
답변3
showkey
명령 프롬프트에서 유사한 도구를 사용해 보십시오.
화살표 키를 누른 다음 Shift+화살표를 누릅니다.
예를 들어 ^[[A
화살표 키와 Shift+화살표 키를 동시에 누르면 터미널 에뮬레이터가 Shift 수정자 키를 무시하고 있음을 나타내는 것 같습니다. 방금 인기 있는 터미널 에뮬레이터 3개를 테스트했는데 그 중 2개는 Shift 키를 무시했습니다.
이것이 최선의 답변은 아니지만 Jupp
화살표 선택을 이동할 수 있는 편집기를 사용하는 데 도움이 될 수 있습니다.