What does the ^ character mean in sequences like ^X^I?
^c
is a common notation for Ctrl+c where c is a (uppercase) letter or one of @[\]^_
. It designates the corresponding control character. The correspondence is that the numeric code of the control character is the numeric code of the printable character (letter or punctuation symbol) minus 64, which corresponds to setting a bit to 0 in base 2. In addition, ^?
often means character 127.
Some keys send a control character:
- Escape = Ctrl+[
- Tab = Ctrl+I
- Return (or Enter or ⏎) = Ctrl+M
- Backspace = Ctrl+? or Ctrl+H (depending on the terminal configuration)
Alt (often called Meta because that was the name of the key at that position on historical Unix machines) plus a printable character sends ^[
(escape) followed by that character.
Most function and cursor keys send an escape sequence, i.e. the character ^[
followed by some printable characters. The details depend on the terminal and its configuration. For xterm, the defaults are documented in the manual. The manual is not beginner-friendly. Here are some tips to help:
- CSI means
^[[
, i.e. escape followed by open-bracket. - SS3 means
^[O
, i.e. escape followed by uppercase-O. - "application mode" is something that full-screen programs usually turn on. Some keys send a different escape sequence in this mode, for historical reasons. (There are actually multiple modes but I won't go into a detailed discussion because in practice, if it matters, you can just bind the escape sequences of both modes, since there are no conflicts.)
- Modifiers (Shift, Ctrl, Alt/Meta) are indicated by a numerical code. Insert a semicolon and that number just before the last character of the escape sequence. Taking the example in the documentation: F5 sends
^[[15~
, and Shift+F5 sends^[[15;2~
. For cursor keys that send^[[
and one letter X, to indicate a modifier M, the escape sequence is^[[1;MX
.
Xterm follows an ANSI standard which itself is based on historical usage dating back from physical terminals. Most modern terminal emulators follow that ANSI standard and implement some but not all of xterm's extensions. Do expect minor variations between terminals though.
Thus:
^X^I
= Ctrl+X Ctrl+I = Ctrl+X Tab^[^@
= Ctrl+Alt+@ = Escape Ctrl+@. On most terminals, Ctrl+Space also sends^@
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, with1;M
to indicate the modifier M). Note that many terminals don't actually send these escape sequences for Alt+cursor key.^[[1;3D
= Alt+Left^[[1;5C
= Ctrl+Right
There's no general, convenient way to look up the key corresponding to an escape sequence. The other way round, pressing Ctrl+V followed by a key chord at a shell prompt (or in many terminal-based editors) inserts the escape sequence literally.
See also How do keyboard input and text output work? and key bindings table?
To extend on Gilles' mention of the correspondence:
The correspondence is that the numeric code of the control character is the numeric code of the printable character (letter or punctuation symbol) minus 64, which corresponds to setting a bit to 0 in base 2.
You can see it in ascii(7)
. Look at the octal numbers:
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
Copyright and license for the table.
^H
corresponds to backspace character, ^M
to carriage return, ^J
to newline, ^I
to tab, ^[
to escape, etc.
The ^ character stands for the control key. ^[ produces ESCAPE, or ASCII 27. Capitalization in this context is normally not significant, and ^A means the same as ^a, namely the control key pressed at the same time as the "a" key.
^[^@ means ESCAPE followed by control-@ (depending on the keyboard layout, you may have to press Shift or Alt-Gr at the same time in order to produce "@").
^X^[q means control-x followed by ESCAPE followed by q.
^[[1;5C means ESCAPE followed by the character string "[1;5C". To me, this looks like a terminal control sequence, which changes text properties like colour, boldness, italics and so on.
I don't know if the usage of ^ to signify the control key is standardized, but it is described by a Wikipedia page. Producing ASCII 27 by typing ^[ was probably pioneered by DEC terminals like VT100 and might be a standard by now.