내부에Zsh 라인 편집기에 대한 문서, 다음과 같은 섹션이 있습니다.
For either in-string or out-string, the following escape sequences are recognised:
\a
bell character
\b
backspace
\e, \E
escape
\f
form feed
\n
linefeed (newline)
\r
carriage return
\t
horizontal tab
\v
vertical tab
\NNN
character code in octal
\xNN
character code in hexadecimal
\uNNNN
unicode character code in hexadecimal
\UNNNNNNNN
unicode character code in hexadecimal
\M[-]X
character with meta bit set
\C[-]X
control character
^X
control character
In all other cases, ‘\’ escapes the following character. Delete is written as ‘^?’. Note that ‘\M^?’ and ‘^\M?’ are not the same...
마지막 두 시퀀스는 어떻게 해석되어야 합니까? 내 추측은 다음과 같습니다
\M^? - delete with the meta bit set?
^\M? - control + question mark with the meta bit set
맞습니까?
답변1
^?
바이트 127 = 0x7f이며 일반적으로 키에 의해 전송됩니다 Backspace(전송으로 설정되고 키가 로 설정되지 않은 ^H
경우 Delete) ^?
.
\M^?
또는 \M-^?
동일하지만 상위 비트가 설정되어 있습니다(예: 255 = 0xff). 최신 시스템에서는 ASCII가 아닌 문자는 다음과 같이 인코딩됩니다.UTF-8. 일부 이전 시스템이나 ASCII 전용 입력용으로 설계된 일부 이전 버전과의 호환성 설정이 있는 최신 시스템에서 키를 누른 채 ASCII 문자를 입력하면 Meta상위 비트가 설정된 해당 바이트가 전송됩니다. 터미널에서 이 작업을 수행하고 ^?
+를 Ctrl보내는 경우 ++를 사용하여 해당 바이트를 입력 ?할 수 있습니다 .MetaCtrl?
% bindkey '^\M?' wibble
% bindkey | grep wibble
"\M-^_" wibble
^\M?
\M?
즉, 메타 ?
설정인 상위 비트(비트 7)를 제어하는 것으로 해석됩니다 ?
. ?
0x3f = 0b00111111 \M?
이고 바이트 0xcf = 0b10111111도 마찬가지입니다. 제어하면 ?
해당 값이 0x7f로 변경되는 를 제외한 모든 문자의 비트 5와 6이 0으로 설정됩니다 . 따라서 ^\M?
결국 0x9f = 0b10011111이 되며 이는 정상적으로 작성된 것입니다 \M^_
(높은 비트 세트 ^_
). 이는 유용한 동작이 아니며 구현 시 극단적인 경우일 뿐입니다.