왜 `ctrl+[`와 `ESC`가 모두 `^[`를 생성합니까? [복사]

왜 `ctrl+[`와 `ESC`가 모두 `^[`를 생성합니까? [복사]

ctrlBash에서는 +를 눌러 v그대로 삽입을 시작합니다. 축어 모드에서 Esc키를 누르면 bash가 표시됩니다 ^[. 나는 그것을 file 로 리디렉션합니다 esc.

또한 축어 모드에서 ctrl키를 누르면 [bash가 표시됩니다 ^[. 나는 그것을 file 로 리디렉션합니다 ctrl.

다음으로 두 파일을 비교한 결과 동일한 것을 발견했습니다!

$ echo '^[' > esc
$ echo '^[' > ctrl
$ diff esc ctrl
$

Ctrl+ [Esc동일한 콘텐츠를 생성하는 이유는 무엇입니까 ?

^[여기C0 및 C1 제어 코드? 그렇다면 위키 기사에는 ^[Escape라고 나와 있는데 ctrl+ [도 Escape인 이유는 무엇입니까?

근본적인 문제는 키 바인딩을 확인하고 생성하고 싶다는 것입니다.

(zsh)$ bindkey -L 
...
bindkey "^['" quote-line
...

그럼 내가 입력해야 ESC+'합니까 ctrl+[+'?

답변1

^A이는 문자 코드 1이며 ^@NUL 바이트를 나타내는 데 사용되는 Ctrl-A와 동일한 논리를 따르는 것으로 보입니다 . 여기서는 ^Ctrl을 다른 키로 표현하는 일반적인 방법입니다.

즉, 주어진 입력 문자 코드는 다음과 같습니다.Ctrl-foo부자비트 6이 지워지고 문자 코드가 64만큼 감소됩니다. 따라서 A문자 코드 ^A1은 문자 코드 65이고, 0인 @64이며 , 27 인 ESC이기도 합니다. ESC에만 별도의 키가 있지만 제어 문자도 생성하는 Enter 및 Tab 키도 있으므로 그다지 특이한 것은 아닙니다.^@[^[

물론 현대 시스템의 작동 방식은 키맵 및 키 바인딩 설정 방법과 같은 다른 요소에 따라 달라질 수도 있습니다. 또한 예를 들어 문자 코드가 64 미만인 경우 어떻게 작동하는지 묻지 마세요. 터미널에서 시도했는데 NUL 바이트가 나왔습니다.Ctrl-something^1Ctrl-space

답변2

bash와 같은 텍스트 터미널 애플리케이션과 함께 텍스트 터미널을 사용하는 경우 특수 키(예 Esc: Tab, Enter및 ) Backspace와 해당 제어 문자([ IM/JH/? )를 구별할 수 없습니다. 마찬가지로 숫자열의 숫자와 숫자패드의 숫자도 구분할 수 없습니다. 일부 다른 키(화살표, 기능 키, 페이지 위로/아래로 등)는 여러 문자 시퀀스를 생성합니다.

그러나 그래픽 환경(X11, wayland)에서 키 누름은 키 누름과 관련된 이벤트를 생성합니다. 이는 단일 문자 맵인지 다중 문자 맵인지에 관계없이 문자 맵과 독립적이지만 연결되어 있습니다. 그래픽 응용 프로그램은 선택하는 경우 이러한 키의 대부분을 구별할 수 있습니다. (어떤 경우에는 키에 여전히 구별할 수 없는 매핑이 있을 수 있지만 이는 드물며 키가 매핑되는 방식에 따라 다릅니다.)

기본적으로 그래픽 터미널 응용 프로그램은 이러한 키와 키 시퀀스를 구별하지 않기로 선택하고 텍스트 pty를 통해 기본 텍스트 응용 프로그램에 차이점을 전달할 방법이 없습니다.

예를 들어 키는 전통적으로 또는 Backspace에 매핑될 수 있습니다 . 그래픽 터미널에는 매핑할 항목을 선택하는 설정이 있습니다. 따라서 그래픽 터미널 응용 프로그램은 차이점을 감지하고 매핑을 변경할 수 있지만 터미널에서 실행 중인 텍스트 응용 프로그램은 그렇지 않습니다.Ctrl-HCtrl-?

답변3

간단히 말해서:역사.

"이유"는 ASCII가 표준화되기 전 10년 동안 내려진 설계 결정으로 거슬러 올라갑니다.ISO 6461967.

당시 대부분의 단말기는 하드 카피 인쇄 형식이었으며 키보드에는 키가 전혀 없는 경우가 많았습니다 ESC. 누군가 ASCII 코드 27을 보내려면 ESCCtrl-[;을 입력하면 됩니다. 그렇게 하는 데는 거의 의미가 없지만.

이러한 새로운 "유리 텔레타이프" 터미널이 1970년대에 인기를 얻었을 때 코드 27을 더 광범위하게 사용했기 때문에 대부분(전부는 아니지만) ESC 키가 있었습니다.

지금까지 유일한 용도는 ESCASCII 코드 27을 생성하는 것이라는 점을 강조하는 것이 중요합니다. 터미널은 이를 "다음 바이트가 표시 내용이 아닌 명령으로 처리되는 모드로 변경"으로 이해합니다.

또 다른 10년 후에는 다양한 창 시스템이 등장했고 ESC 키는 완전히 새로운 목적을 갖게 되었습니다.현재 작업 취소.

하지만이는 적용되지 않습니다이는 터미널을 사용할 때 창 모드 환경에서도 마찬가지입니다. 대신 1967 ASCII에 지정된 것과 동일한 동작을 계속 수행합니다.

Ctrl 키가 이 작업을 수행하는 이유는 @user10489의 또 다른 답변에서 설명됩니다.

관련 정보