이 문제는 내 것에서 비롯됩니다.emacs 베타에 대한 이전 질문. 간단히 말해서, C-;
터미널에서 Emacs 기능에 바인딩하고 싶지만 Emacs에 도달하기 전에 무언가가 이 키를 캡처하는 것 같습니다. Emacs는 내가 그것을 눌렀다고 생각합니다 ;
.
명백한 용의자는 터미널 에뮬레이터인데, 그 중 많은 것(xterm, gnome-terminal, terminator, terminology)을 확인해 보았지만 어느 것도 작동하지 않았습니다. Emacs의 GUI 버전에서는 이 키가 C-;
제대로 작동하기 때문에 아마도 창 관리자를 제외할 수 있을 것입니다 . 또한 bash와 zsh라는 두 가지 다른 쉘을 시도했지만 다시 성공하지 못했습니다.
또 무엇을 시도할 수 있나요?
답변1
어쩌면 실제 터미널을 사용하지 않기 때문에 혼란을 겪을 수도 있습니다. 진지한 컴퓨터가 몇 대의 직립형 냉장고 크기였을 때,단말기문자 및 문자만을 사용하여 직렬 케이블을 통해 중앙 컴퓨터와 통신합니다. 이러한 문자는 ASCII 또는 EBCDIC와 같은 일부 표준화된 문자 집합의 일부이지만 일반적으로 ASCII입니다. ASCII에는 33개의 제어 문자가 있으며 터미널 운영자는 특수 키(예: DEL)를 누르거나 CTRL 키를 누른 채 다른 키를 눌러 전송합니다. 중앙 컴퓨터는 최종 제어 문자만 볼 수 있으며 해당 문자를 생성하기 위해 어떤 키를 눌렀는지 알 수 없습니다.
xterm과 같은 터미널 에뮬레이션 프로그램은 이 동작을 모방합니다. 터미널 에뮬레이터는 33개의 ASCII 제어 문자를 모두 보내는 방법을 제공하며, 전송되면 Emacs는 이를 수신합니다. 그러나 Emacs는 위에서 설명한 중앙 컴퓨터와 같습니다. 터미널 에뮬레이터에서 실행할 때 실제로 어떤 키가 눌렸는지 알 수 없습니다. 따라서 CTRL과 세미콜론을 누르면 터미널 에뮬레이터가 해당 키를 ASCII 문자에 매핑하지 않는 한 Emacs는 아무 것도 입력되었음을 알 수 없습니다.
터미널 에뮬레이터는 일반적으로 다음 매핑을 사용하여 제어 문자 † 를 생성합니다 .
키 ASCII ------ 탈출 27 127 삭제 백스페이스 키 8 CTRL+스페이스바 0 CTRL+@0 Ctrl+A 1 Ctrl+B 2 Ctrl+C 3 등... CTRL+X 24 CTRL+Y 25 Ctrl+Z 26 CTRL+[ 27 CTRL+\ 28 CTRL+] 29 CTRL+^30 CTRL+_ 31
Ctrl+는 목록에 나타나지 않습니다. 터미널은 일반적으로 다음에 할당된 인쇄 가능한 문자만 보냅니다.열쇠CTRL+인 경우열쇠제어 문자에 매핑되지 않았습니다. 그렇다면 터미널 에뮬레이터는 무엇을 보내야 하는지 알려줍니다. 유일한 문제는 Ctrl+를 누를 때 무엇을 해야 할지 모른다는 것입니다.
이 모든 것은 터미널이나 터미널 에뮬레이션 프로그램을 사용하는 경우에만 적용됩니다. Emacs를 윈도우 시스템에서 기본 응용 프로그램으로 실행하는 경우 Emacs는 문자뿐만 아니라 키 입력 이벤트에 대한 전체 액세스 권한을 갖습니다. 따라서 Emacs는 사용자가 CTRL과 세미콜론을 동시에 눌렀다는 것을 알 수 있으며 해당 키 쌍에 작업을 할당할 수 있습니다.
† 터미널에는 일반적으로 제어 문자가 포함된 문자 시퀀스를 생성하는 기능 키와 화살표 키가 있습니다. 이러한 시퀀스는 일반적으로 ASCII 코드 27(ESCAPE)로 시작됩니다.
답변2
터미널은 키가 아닌 문자(보다 정확하게는 바이트)를 전송합니다. 특정 키나 Ctrl+ 같은 키 코드를 누르면 ;해당 정보가 일련의 바이트로 인코딩되어야 합니다. A또는 Shift+ A또는 와 같은 문자를 나타내는 키 코드는 À다음 문자로 전송됩니다: a
, A
, à
(마지막 문자는 터미널의 문자 인코딩에 따라 1바이트 또는 2바이트입니다.)
기능 키와 관련된 키 입력에는 해당 문자가 없으므로 이스케이프 시퀀스로 전송됩니다. 이스케이프 문자로 시작하는 바이트 시퀀스( \e
Emacs 문자열에서는 ^[
버퍼에 그대로 입력하면 청록색으로 나타납니다). 일부 기능 키에는 해당 바이트가 있습니다.제어 문자.
키와 키 Ctrl+ 에 대한 표준 이스케이프 시퀀스가 없으므로 ;대부분의 터미널 에뮬레이터는 대신 문자를 생성합니다 ;
. 그러면 Ctrl누르고 있는 수정자에 대한 정보가 손실됩니다 .
Ctrl+ 에 대한 바인딩을 정의하려면 ;다른 이스케이프 시퀀스를 보내도록 터미널 에뮬레이터를 구성해야 합니다. Gnome Terminal에서는 이 작업을 수행할 수 없을 것 같습니다(Gnome은 거의 구성할 수 없습니다). Xterm을 사용하여 이 작업을 수행할 수 있습니다. 바라보다모든 키 조합을 처리할 수 있는 Linux 터미널이 있습니까?지침을 위해.
터미널에서 실행 중인 쉘은 포함되지 않습니다. GUI Emacs는 GUI(X11)가 단지 문자 시퀀스가 아닌 인코딩 키와 수정자의 형태로 입력 이벤트를 전송하기 때문에 문제가 없습니다.
바라보다키보드 입력과 텍스트 출력은 어떻게 작동합니까?입력이 키보드에서 애플리케이션으로 전송되는 방법에 대한 자세한 배경 정보입니다.