这些字符串“\M^”有什么作用?和 '^\M?',在 zsh/ZLE 中表示?

这些字符串“\M^”有什么作用?和 '^\M?',在 zsh/ZLE 中表示?

在里面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^?or\M-^?相同,但设置了高位,即 255 = 0xff。在现代系统中,非 ASCII 字符被编码为UTF-8。在一些古老的系统上,或者在具有一些专为仅 ASCII 输入而设计的向后兼容性设置的现代系统上,按住时键入 ASCII 字符Meta会发送带有高位设置的相应字节。如果您的终端执行此操作并发送^?+ Ctrl?您应该能够使用Meta+ Ctrl+输入该字节?

% bindkey '^\M?' wibble
% bindkey | grep wibble
"\M-^_" wibble

^\M?被解析为 controlifying \M?,即元化?,即设置 中的高位(位 7)??是 0x3f = 0b00111111,\M?字节 0xcf = 0b10111111 也是如此。 Controlifying 显然将除 之外的每个字符的第 5 位和第 6 位设置为 0 ?,将其值更改为 0x7f。因此^\M?最终为 0x9f = 0b10011111,这是正常写入的\M^_(设置 的高位^_)。这不是有用的行为,它只是实现中的一个边缘情况。

相关内容