이 질문은 내 질문에서 비롯되었습니다.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해당 문자( , , )로 전송됩니다 (마지막 문자는 터미널의 문자 인코딩에 따라 1바이트 또는 2바이트임).AÀa
A
à
\e
기능 키와 관련된 키코드에는 해당 문자가 없으므로 이스케이프 시퀀스로 전송됩니다. 이스케이프 문자( Emacs 문자열에서는 문자 ^[
그대로 버퍼에 입력되면 청록색으로 표시됨) 로 시작하는 바이트 시퀀스입니다 . 몇몇 기능 키에는 해당 바이트가 있습니다.제어 문자.
Ctrl+ 키코드 ;에는 표준 이스케이프 시퀀스가 없으므로 대부분의 터미널 에뮬레이터는 문자를 생성합니다 ;
. 이렇게 하면 Ctrl수정자를 눌렀다 는 정보가 손실됩니다 .
Ctrl+ 에 대한 바인딩을 정의하려면 ;다른 이스케이프 시퀀스를 보내도록 터미널 에뮬레이터를 구성해야 합니다. 나는 Gnome 터미널로는 이 작업을 수행할 수 없다고 생각합니다(Gnome은 거의 구성할 수 없습니다). Xterm으로 할 수 있습니다. 보다모든 키 조합을 처리할 수 있는 Linux 터미널이 있습니까?지침을 위해.
터미널에서 실행할 수 있는 셸은 관련되지 않습니다. GUI Emacs는 GUI(X11)가 단순한 문자 시퀀스가 아닌 키와 수정자를 인코딩하는 형식으로 입력 이벤트를 전송하기 때문에 문제가 없습니다.
보다키보드 입력과 텍스트 출력은 어떻게 작동합니까?키보드에서 애플리케이션으로 입력이 전달되는 방식에 대한 자세한 배경 정보를 확인하세요.