Debian 시스템에서 END
키를 누르면 다음이 생성됩니다 ^[[F
:
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[F 27 0033 0x1b
91 0133 0x5b
70 0106 0x46
그런데 왜 이 키와 코드가 없나요?용어 정보?
$ infocmp -1 | grep end
kend=\EOF,
그럼에도 불구하고,저주. 로 올바르게 식별하도록 관리하는 것은 어떻습니까 KEY_END
?
TERM
예xterm-256color
kend
그런데 end
just 대신 and 를 갖는 동기는 무엇입니까 end
? ( khome
및 와 동일 home
)
편집하다
Johan Myréen이 자신의 의견에서 말했듯 khome
이 문자열은 Home 키를 눌러 생성되는 시퀀스입니다. 하지만 데비안에서 홈 버튼을 누르면 home
.
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[H 27 0033 0x1b
91 0133 0x5b
72 0110 0x48
$ infocmp -1 | grep home
home=\E[H,
khome=\EOH,
답변1
Johan Myréen의 답변은 비슷하지만 문제는 아닙니다. 사용할 대부분의 터미널 에뮬레이터에는정상그리고애플리케이션특수 키 모드입니다. 터미널 설명은 다음과 같습니다.하나전체 화면 응용 프로그램에서 사용되는 모드에 해당하는 모드입니다. 기타 애플리케이션(예: 대화형껍데기) 일반적으로 사용할 화면을 초기화하지 않습니다.애플리케이션모델. 배쉬가 그 예이다.
존재하다정상모드, xterm 및 유사한 터미널 전송 escape[
(CSI)애플리케이션모드에서는 키보드가 전송됩니다 escapeO
(SS3). terminfo 구문에서,탈출하다예 \E
. 그래서 infocmp
애플리케이션 패턴을 사용하여 설명을 보여드리겠습니다. 이것home
전송된 기능도착하다터미널, 커서를 이동하는 방법을 알려주세요.집위치(왼쪽 위 모서리) 및khome
(보내다~에서키보드를 사용하는 터미널).
전체 화면 애플리케이션(예: ncurses를 사용하는 애플리케이션)가능한키보드를 초기화하는 데 사용되는 터미널 기능 문자열을 보냅니다. 일부 터미널 설명은 터미널을 애플리케이션 모드로 전환하지만 일부는 그렇지 않습니다.
어떤 것의 목적을 가리킨다.kend
비교적end
명명 규칙은 다음과 같습니다. terminfo에서는 규칙에 따라 다음으로 시작하는 모든 이름을 지정합니다.케이특수 키(기능 키, 커서 키, 키패드 키)를 참조하여 해당 키가 응용 프로그램에서 읽을 문자열임을 명확히 합니다. 예를 들어,kcub1
(커서를 뒤로열쇠) 와는 다르다cub1
(커서를 한 열 뒤로 이동합니다).
ncurses는 키를 다음과 같이 식별합니다.KEY_END
당신이 사용하는 응용 프로그램이 호출하기 때문에keypad
smkx
이 함수는 ("키보드 전송 모드 시작"을 의미하는 니모닉)을 사용하여 터미널을 초기화합니다. 실제로 응용 프로그램 모드가 열릴 수도 있고 열리지 않을 수도 있습니다. Linux 콘솔에 대한 터미널 설명은 없지만 xterm에 대한 설명은 있습니다.
원칙적으로 다음을 사용할 수 있습니다.tput
모드 전환(및 다른 결과 얻기 showkey
):
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[H 27 0033 0x1b
91 0133 0x5b
72 0110 0x48
^C 3 0003 0x03
^D 4 0004 0x04
$ tput smkx
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[OH 27 0033 0x1b
79 0117 0x4f
72 0110 0x48
문제는curses는 문자열에 대해 하나의 이름만 인식한다는 것입니다. xterm과 같은 일부 터미널은 편집 키보드에서 다른 이름의 키를 사용하여 이전 하드웨어 터미널을 에뮬레이션합니다. 아래 나열된 xterm FAQ에서 "Home" 키의 이름을 "Insert"로 지정할 수 있습니다...
추가 자료:
- 터미널에서 화살표 키를 사용할 수 있도록 Unix를 수정하는 방법은 무엇입니까?
- 홈/엔드 키가 작동하지 않습니다(ncurses FAQ)
- 키보드가 작동하지 않는 이유는 무엇입니까?(xterm FAQ)
- 키보드 및 기능 키(용어정보 매뉴얼)
- 사용자 정의 함수(terminfo 매뉴얼, "k"의 다른 용도에 대한 설명)
- 키보드 모드(
getch
매뉴얼 페이지)
답변2
홈 키의 문제점은 물리적 터미널과 나중에 이를 에뮬레이션하는 터미널 에뮬레이터에 일반 모드와 응용 프로그램 모드의 두 가지 모드가 있고 이스케이프 시퀀스는 터미널이 어떤 모드에 있는지에 따라 다르다는 것입니다. Terminfo는 이를 잘 처리하지 못합니다. 일반 모드("커서 모드"라고도 함)에서 End 키 이스케이프 시퀀스는 ESC [ F
응용 프로그램 모드에서 입니다 ESC O F
. 문제를 인터넷 검색하면 전체 혼란이 드러납니다.
편집하다terminfo 소스에서:
VT100 시리즈 터미널에는 커서 모드와 응용 프로그램 모드라는 두 가지 모드에서 작동할 수 있는 커서("화살표") 키가 있습니다. 커서 모드는 리셋 상태로 정상으로 간주됩니다. 응용 프로그램 모드는 "설정"입니다. 커서 모드에서 커서 키는 ANSI 표준을 준수하는 "Esc [{코드}" 시퀀스를 전송합니다. 응용 프로그램 모드에서 커서 키는 "Esc O" 시퀀스를 전송합니다. 응용 프로그램 모드는 주로 이식을 돕기 위한 것입니다. VT52 애플리케이션은 커서 키가 일반적으로 커서 모드에 있다고 가정하고 vi와 같은 애플리케이션이 항상 문자열을 전송할 것으로 기대하므로 커서 키는 터미널이 문자열을 전송한 후 전송되는 내용과 일치하도록 정의됩니다. 문자열이 비어 있거나 정의되지 않은 경우 커서 키는 "커서 모드"에 있는 것으로 간주되며 커서 키 정의는 이 가정과 일치해야 합니다. 그렇지 않으면 응용 프로그램이 실패할 수 있습니다. 종료하기 전에 문자열을 터미널로 전송하십시오. "