^ 字符在像 ^X^I 这样的序列中是什么意思?

shi*_*hin 23 terminal keyboard escape-characters

我正在从 zsh 邮件列表中阅读有关键绑定的消息,我想知道我需要按哪个键:

  1. ^X^I(我认为Ctrl-X Ctrl-I,首都XI
  2. ^[^@(我觉得Ctrl-Esc-@??)
  3. ^X^[q(我觉得Ctrl-X Esc-q??)
  4. ^XQ (我认为Ctrl-X和 Q ??)

来自zsh 上的 Archlinux wiki 页面

  1. ^[[1;3A
  2. ^[[1;3D

bindkey

  1. ^[[1;5C
  2. ^[[A

我知道这^[意味着 Esc,但我不确定如何找到其他人。是否有任何官方参考或网站列出这些?

Gil*_*il' 23

^cCtrl+的常用符号,c其中c是(大写)字母或其中之一@[\]^_。它指定相应的控制字符。对应关系是控制字符的数字代码是可打印字符(字母或标点符号)的数字代码减去64,对应于基数为0的位设置为0。另外,^?通常表示字符127。

一些键发送控制字符:

  • Escape= Ctrl+[
  • Tab= Ctrl+I
  • Return(或Enter?) = Ctrl+M
  • Backspace= Ctrl+?Ctrl+ H(取决于终端配置)

Alt(通常被称为,Meta因为这是历史 Unix 机器上那个位置的键的名称)加上一个可打印的字符发送^[(转义),然后是该字符。

大多数功能键和光标键发送一个转义序列,即字符^[后跟一些可打印字符。详细信息取决于终端及其配置。对于 xterm,默认值记录在手册中。该手册不适合初学者。以下是一些有用的提示:

  • CSI 的意思是^[[,即转义后跟开括号。
  • SS3 的意思是^[O,即转义后跟大写-O。
  • “应用程序模式”是全屏程序通常打开的东西。由于历史原因,某些键在此模式下会发送不同的转义序列。(实际上有多种模式,但我不会详细讨论,因为在实践中,如果重要的话,您可以绑定两种模式的转义序列,因为没有冲突。)
  • 修饰符 ( Shift, Ctrl, Alt/ Meta) 由数字代码表示。在转义序列的最后一个字符之前插入一个分号和该数字。以文档中的示例为例:F5发送^[[15~Shift+F5发送^[[15;2~。对于发送^[[和一个字母X 的光标键,表示修饰符M,转义序列是。^[[1;MX

Xterm 遵循ANSI 标准,该标准本身基于可追溯到物理终端的历史用法。大多数现代终端仿真器都遵循该 ANSI 标准并实现了一些但不是全部的 xterm 扩展。不过,请注意终端之间的细微差异。

因此:

  • ^X^I= Ctrl+ X Ctrl+ I= Ctrl+X Tab
  • ^[^@= Ctrl+ Alt+ @= Escape Ctrl+ @。在大多数终端上,Ctrl+Space也发送^@so ^[^@= Ctrl+ Alt+ Space= Escape Ctrl+ Space
  • ^X^[q= Ctrl+ X Alt+ q= Ctrl+X Escape q
  • ^XQ= Ctrl+ X Shift+q
  • ^[[A = Up
  • ^[[1;3A= Alt+ Up( Up, with表示修饰符M )。请注意,许多终端实际上​​并没有为+发送这些转义序列。1;MAltcursor key
  • ^[[1;3D= Alt+Left
  • ^[[1;5C= Ctrl+Right

没有通用、方便的方法来查找与转义序列对应的键。反过来,在 shell 提示下(或在许多基于终端的编辑器中)按Ctrl+V后跟一个键和弦会按字面意思插入转义序列。

另请参阅键盘输入和文本输出如何工作?键绑定表?

  • 而不是“数字代码 - 64”——“^?”“经常”是一个奇怪且无法解释的异常——“数字代码异或 64”怎么样?因为它在 40 年前就已经在 SysV 源代码中定义了。 (2认同)
  • @MSalters 终端模拟器(或终端驱动程序,如果您不使用 GUI)执行此转换。如果您使用实际的串行终端,则只能在单独的硬件中完成转换,这在 21 世纪非常罕见。请参阅[键盘输入和文本输出如何工作?](https://unix.stackexchange.com/questions/116629/how-do-keyboard-input-and-text-output-work) (2认同)
  • 无论如何,切换一点都不是一个神秘的概念。 (2认同)
  • @ user414777 虽然不是,但许多现代程序员甚至不知道按位运算的作用,更不用说非程序员了。同时,几乎任何人都知道基本算术。但确实,我真的很想在这个答案中看到转换的异或公式,也许在脚注中。 (2认同)
  • `^c` **是 **`Ctrl-C` 的常用符号。现在只有老书呆子使用它...... (2认同)

JoL*_*JoL 5

扩展吉尔斯提到的信件:

对应关系是控制字符的数字代码是可打印字符(字母或标点符号)的数字代码减去64,对应于在base 2中设置一个位为0。

你可以在ascii(7). 查看八进制数:

Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
????????????????????????????????????????????????????????????????????????
000   0     00    NUL '\0' (null character)   100   64    40    @
001   1     01    SOH (start of heading)      101   65    41    A
002   2     02    STX (start of text)         102   66    42    B
003   3     03    ETX (end of text)           103   67    43    C
004   4     04    EOT (end of transmission)   104   68    44    D
005   5     05    ENQ (enquiry)               105   69    45    E
006   6     06    ACK (acknowledge)           106   70    46    F
007   7     07    BEL '\a' (bell)             107   71    47    G
010   8     08    BS  '\b' (backspace)        110   72    48    H
011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
012   10    0A    LF  '\n' (new line)         112   74    4A    J
013   11    0B    VT  '\v' (vertical tab)     113   75    4B    K
014   12    0C    FF  '\f' (form feed)        114   76    4C    L
015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M
016   14    0E    SO  (shift out)             116   78    4E    N
017   15    0F    SI  (shift in)              117   79    4F    O
020   16    10    DLE (data link escape)      120   80    50    P
021   17    11    DC1 (device control 1)      121   81    51    Q
022   18    12    DC2 (device control 2)      122   82    52    R
023   19    13    DC3 (device control 3)      123   83    53    S
024   20    14    DC4 (device control 4)      124   84    54    T
025   21    15    NAK (negative ack.)         125   85    55    U
026   22    16    SYN (synchronous idle)      126   86    56    V
027   23    17    ETB (end of trans. blk)     127   87    57    W
030   24    18    CAN (cancel)                130   88    58    X
031   25    19    EM  (end of medium)         131   89    59    Y
032   26    1A    SUB (substitute)            132   90    5A    Z
033   27    1B    ESC (escape)                133   91    5B    [
034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
035   29    1D    GS  (group separator)       135   93    5D    ]
036   30    1E    RS  (record separator)      136   94    5E    ^
037   31    1F    US  (unit separator)        137   95    5F    _
...
077   63    3F    ?                           177   127   7F    DEL
Run Code Online (Sandbox Code Playgroud)

该表的版权和许可。

^H对应退格符、^M回车符、^J换行符、^I制表符、^[转义符等。