Skip to content

Instantly share code, notes, and snippets.

@fnky

fnky/ANSI.md

Last active Jun 17, 2021
Embed
What would you like to do?
ANSI Escape Codes

ANSI Escape Sequences

Standard escape codes are prefixed with Escape:

  • Ctrl-Key: ^[
  • Octal: \033
  • Unicode: \u001b
  • Hexadecimal: \x1b
  • Decimal: 27

Followed by the command, usually delimited by opening square bracket ([) and optionally followed by arguments and the command itself.

Arguments are delimeted by semi colon (;).

For example:

\x1b[1;31m  # Set style to bold, red foreground.

General ASCII Codes

Name decimal octal hex C-escape Ctrl-Key Description
BEL 7 007 0x07 \a ^G Terminal bell
BS 8 010 0x08 \b ^H Backspace
HT 9 011 0x09 \t ^I Horizontal TAB
LF 10 012 0x0A \n ^J Linefeed (newline)
VT 11 013 0x0B \v ^K Vertical TAB
FF 12 014 0x0C \f ^L Formfeed (also: New page NP)
CR 13 015 0x0D \r ^M Carriage return
ESC 27 033 0x1B \e* ^[ Escape character
DEL 127 177 0x7F <none> <none> Delete character

Note: Some control escape sequences, like \e for ESC, are not guaranteed to work in all languages and compilers. It is recommended to use the decimal, octal or hex representation as escape code.

Note: The Ctrl-Key representation is simply associating the non-printable characters from ASCII code 1 with the printable (letter) characters from ASCII code 65 ("A"). ASCII code 1 would be ^A (Ctrl-A), while ASCII code 7 (BEL) would be ^G (Ctrl-G). This is a common representation (and input method) and historically comes from one of the VT series of terminals.

Cursor Controls

ESC Code Sequence Description
ESC[H moves cursor to home position (0, 0)
ESC[{line};{column}H
ESC[{line};{column}f
moves cursor to line #, column #
ESC[#A moves cursor up # lines
ESC[#B moves cursor down # lines
ESC[#C moves cursor right # columns
ESC[#D moves cursor left # columns
ESC[#E moves cursor to beginning of next line, # lines down
ESC[#F moves cursor to beginning of previous line, # lines down
ESC[#G moves cursor to column #
ESC[6n request cursor position (reports as ESC[#;#R)
ESC[s save cursor position
ESC[u restores the cursor to the last saved position

Erase Functions

ESC Code Sequence Description
ESC[J clears the screen
ESC[0J clears from cursor until end of screen
ESC[1J clears from cursor to beginning of screen
ESC[2J clears entire screen
ESC[K clears the current line
ESC[0K clears from cursor to end of line
ESC[1K clears from cursor to start of line
ESC[2K clears entire line

Colors / Graphics Mode

ESC Code Sequence Description
ESC[1;34;{...}m Set graphics modes for cell, separated by semicolon (;).
ESC[0m reset all modes (styles and colors)
ESC[1m set bold mode.
ESC[2m set dim/faint mode.
ESC[3m set italic mode.
ESC[4m set underline mode.
ESC[5m set blinking mode
ESC[7m set inverse/reverse mode
ESC[8m set invisible mode
ESC[9m set strikethrough mode.

Note: Some terminals may not support some of the graphic mode sequences listed above.

Color codes

Most terminals support 8 and 16 colors, as well as 256 (8-bit) colors. These colors are set by the user, but have commonly defined meanings.

8-16 Colors

Color Name Foreground Color Code Background Color Code
Black 30 40
Red 31 41
Green 32 42
Yellow 33 43
Blue 34 44
Magenta 35 45
Cyan 36 46
White 37 47
Reset 0 0

Note: the Reset color is the reset code that resets all colors and text effects.

Most terminals, apart from the basic set of 8 colors, also support the "bright" or "bold" colors. These have their own set of codes, mirroring the normal colors, but with an additional ;1 in their codes:

# Set style to bold, red foreground.
\x1b[1;31mHello
# Set style to dimmed white foreground with red background.
\x1b[2;37;41mWorld

256 Colors

The following escape codes tells the terminal to use the given color ID:

ESC Code Sequence Description
ESC[38;5;{ID}m Set foreground color.
ESC[48;5;{ID}m Set background color.

Where {ID} should be replaced with the color index from 0 to 255 of the following color table:

256 Color table

The table starts with the original 16 colors (0-15).

The proceeding 216 colors (16-231) or formed by a 3bpc RGB value offset by 16, packed into a single value.

The final 24 colors (232-255) are grayscale starting from a shade slighly lighter than black, ranging up to shade slightly darker than white.

Some emulators interpret these steps as linear increments (256 / 24) on all three channels, although some emulators may explicitly define these values.

RGB Colors

More modern terminals supports Truecolor (24-bit RGB), which allows you to set foreground and background colors using RGB.

These escape sequences are usually not well documented.

ESC Code Sequence Description
ESC[38;2;{r};{g};{b}m Set foreground color as RGB.
ESC[48;2;{r};{g};{b}m Set background color as RGB.

Note that ;38 and ;48 corresponds to the 16 color sequence and is interpreted by the terminal to set the foreground and background color respectively. Where as ;2 and ;5 sets the color format.

Screen Modes

Set Mode

ESC Code Sequence Description
ESC[={value}h Changes the screen width or type to the mode specified by value.
ESC[=0h 40 x 25 monochrome (text)
ESC[=1h 40 x 25 color (text)
ESC[=2h 80 x 25 monochrome (text)
ESC[=3h 80 x 25 color (text)
ESC[=4h 320 x 200 4-color (graphics)
ESC[=5h 320 x 200 monochrome (graphics)
ESC[=6h 640 x 200 monochrome (graphics)
ESC[=7h Enables line wrapping
ESC[=13h 320 x 200 color (graphics)
ESC[=14h 640 x 200 color (16-color graphics)
ESC[=15h 640 x 350 monochrome (2-color graphics)
ESC[=16h 640 x 350 color (16-color graphics)
ESC[=17h 640 x 480 monochrome (2-color graphics)
ESC[=18h 640 x 480 color (16-color graphics)
ESC[=19h 320 x 200 color (256-color graphics)
ESC[={value}l Resets the mode by using the same values that Set Mode uses, except for 7, which disables line wrapping. The last character in this escape sequence is a lowercase L.

Common Private Modes

These are some examples of private modes, which are not defined by the specification, but are implemented in most terminals.

ESC Code Sequence Description
ESC[?25l make cursor invisible
ESC[?25h make cursor visible
ESC[?47l restore screen
ESC[?47h save screen
ESC[?1049h enables the alternative buffer
ESC[?1049l disables the alternative buffer

Refer to the XTerm Control Sequences for a more in-depth list of private modes defined by XTerm.

Note: While these modes may be supported by the most terminals, some may not work in multiplexers like tmux.

Keyboard Strings

ESC[{code};{string};{...}p

Redefines a keyboard key to a specified string.

The parameters for this escape sequence are defined as follows:

  • code is one or more of the values listed in the following table. These values represent keyboard keys and key combinations. When using these values in a command, you must type the semicolons shown in this table in addition to the semicolons required by the escape sequence. The codes in parentheses are not available on some keyboards. ANSI.SYS will not interpret the codes in parentheses for those keyboards unless you specify the /X switch in the DEVICE command for ANSI.SYS.

  • string is either the ASCII code for a single character or a string contained in quotation marks. For example, both 65 and "A" can be used to represent an uppercase A.

IMPORTANT: Some of the values in the following table are not valid for all computers. Check your computer's documentation for values that are different.

List of keyboard strings

Key Code SHIFT+code CTRL+code ALT+code
F1 0;59 0;84 0;94 0;104
F2 0;60 0;85 0;95 0;105
F3 0;61 0;86 0;96 0;106
F4 0;62 0;87 0;97 0;107
F5 0;63 0;88 0;98 0;108
F6 0;64 0;89 0;99 0;109
F7 0;65 0;90 0;100 0;110
F8 0;66 0;91 0;101 0;111
F9 0;67 0;92 0;102 0;112
F10 0;68 0;93 0;103 0;113
F11 0;133 0;135 0;137 0;139
F12 0;134 0;136 0;138 0;140
HOME (num keypad) 0;71 55 0;119 --
UP ARROW (num keypad) 0;72 56 (0;141) --
PAGE UP (num keypad) 0;73 57 0;132 --
LEFT ARROW (num keypad) 0;75 52 0;115 --
RIGHT ARROW (num keypad) 0;77 54 0;116 --
END (num keypad) 0;79 49 0;117 --
DOWN ARROW (num keypad) 0;80 50 (0;145) --
PAGE DOWN (num keypad) 0;81 51 0;118 --
INSERT (num keypad) 0;82 48 (0;146) --
DELETE (num keypad) 0;83 46 (0;147) --
HOME (224;71) (224;71) (224;119) (224;151)
UP ARROW (224;72) (224;72) (224;141) (224;152)
PAGE UP (224;73) (224;73) (224;132) (224;153)
LEFT ARROW (224;75) (224;75) (224;115) (224;155)
RIGHT ARROW (224;77) (224;77) (224;116) (224;157)
END (224;79) (224;79) (224;117) (224;159)
DOWN ARROW (224;80) (224;80) (224;145) (224;154)
PAGE DOWN (224;81) (224;81) (224;118) (224;161)
INSERT (224;82) (224;82) (224;146) (224;162)
DELETE (224;83) (224;83) (224;147) (224;163)
PRINT SCREEN -- -- 0;114 --
PAUSE/BREAK -- -- 0;0 --
BACKSPACE 8 8 127 (0)
ENTER 13 -- 10 (0
TAB 9 0;15 (0;148) (0;165)
NULL 0;3 -- -- --
A 97 65 1 0;30
B 98 66 2 0;48
C 99 66 3 0;46
D 100 68 4 0;32
E 101 69 5 0;18
F 102 70 6 0;33
G 103 71 7 0;34
H 104 72 8 0;35
I 105 73 9 0;23
J 106 74 10 0;36
K 107 75 11 0;37
L 108 76 12 0;38
M 109 77 13 0;50
N 110 78 14 0;49
O 111 79 15 0;24
P 112 80 16 0;25
Q 113 81 17 0;16
R 114 82 18 0;19
S 115 83 19 0;31
T 116 84 20 0;20
U 117 85 21 0;22
V 118 86 22 0;47
W 119 87 23 0;17
X 120 88 24 0;45
Y 121 89 25 0;21
Z 122 90 26 0;44
1 49 33 -- 0;120
2 50 64 0 0;121
3 51 35 -- 0;122
4 52 36 -- 0;123
5 53 37 -- 0;124
6 54 94 30 0;125
7 55 38 -- 0;126
8 56 42 -- 0;126
9 57 40 -- 0;127
0 48 41 -- 0;129
- 45 95 31 0;130
= 61 43 --- 0;131
[ 91 123 27 0;26
] 93 125 29 0;27
92 124 28 0;43
; 59 58 -- 0;39
' 39 34 -- 0;40
, 44 60 -- 0;51
. 46 62 -- 0;52
/ 47 63 -- 0;53
` 96 126 -- (0;41)
ENTER (keypad) 13 -- 10 (0;166)
/ (keypad) 47 47 (0;142) (0;74)
* (keypad) 42 (0;144) (0;78) --
- (keypad) 45 45 (0;149) (0;164)
+ (keypad) 43 43 (0;150) (0;55)
5 (keypad) (0;76) 53 (0;143) --

Resources

@fnky

This comment has been minimized.

Copy link
Owner Author

@fnky fnky commented Nov 3, 2018

For iTerm2-specific escape sequences, see:

https://www.iterm2.com/documentation-escape-codes.html

@Managor

This comment has been minimized.

Copy link

@Managor Managor commented Feb 25, 2021

But esc does have a c-escape with \e

@amcgregor

This comment has been minimized.

Copy link

@amcgregor amcgregor commented Feb 25, 2021

But esc does have a c-escape with \e

@Managor It does. However, many languages which support general "C-style escapes" often do not support that one in particular. Python, for example. Thus my code generally standardizes on the octal form, \033 — at-a-glance recognition across languages is useful, too, as I also use that form in shell scripts, Makefiles, &c. An example of pretty request/response logging which itself is rather hideous code, resulting in: (extra symbols—section separators, icons, &c.—provided by Nerd Fonts, and yes, my logs contain emoji)

Screen Shot 2021-01-05 at 15 14 21

Edited to add: and thank you @fnky, I did make extensive use of this reference in developing that prettified output. 🙂

@fnky

This comment has been minimized.

Copy link
Owner Author

@fnky fnky commented Feb 25, 2021

As @amcgregor correctly points out, some languages don't support this specific control escape code (\e). I have updated the docs to include \e control character with an asterisk about this.

This document is meant to include most of the ANSI standard but it is also important to point out differences across languages and environments, as it's often used as a reference for implementations.

Thanks to both @Managor and @amcgregor for bringing this up.

@LordMZTE

This comment has been minimized.

Copy link

@LordMZTE LordMZTE commented Apr 29, 2021

Hey @fnky, I made a fork of this gist adding some escape codes and clarifying it a little. I'd appreciate it if you could take a look at it and maybe consider merging it.

@amcgregor

This comment has been minimized.

Copy link

@amcgregor amcgregor commented Apr 29, 2021

@LordMZTE 👍 on terminology change; "mode" has connotations that are important. 👎 on the whitespace changes, which reduce legibility (and increase maintenance burden) when viewed in an editor while having no impact on HTML generation.

@fnky

This comment has been minimized.

Copy link
Owner Author

@fnky fnky commented Apr 29, 2021

@LordMZTE Thanks for the contribution!

I have added the codes as they are probably more commonly supported than other private mode sequences from DEC Private Mode Set (DECSET).

I provided some more information where to find a list of private modes as defined by XTerm.

@LordMZTE

This comment has been minimized.

Copy link

@LordMZTE LordMZTE commented Apr 29, 2021

@LordMZTE +1 on terminology change; "mode" has connotations that are important. -1 on the whitespace changes, which reduce legibility (and increase maintenance burden) when viewed in an editor while having no impact on HTML generation.

You mean the table alignment? Well, I was just keeping the style of the file consistent.

@bczsalba

This comment has been minimized.

Copy link

@bczsalba bczsalba commented May 5, 2021

Hey there!

Thanks for this file @fnky, it's a really useful!

I created a fork that fixes the "Report cursor position" field. The sequence given was the return format (\ESC[#;#R) and not the input (\ESC[6n).

🚀

@fnky

This comment has been minimized.

Copy link
Owner Author

@fnky fnky commented May 5, 2021

@bczsalba Thanks for contributing! You're absolutely right, in that \ESC[#;#R isn't intended as input, although the description was correct enough.

I've updated the document with your changes and modified the description to better match the actual control codes, as outlined in the VT100 documentation.

Much appreciated :-)

@JoelJarosz

This comment has been minimized.

Copy link

@JoelJarosz JoelJarosz commented May 28, 2021

ESC[{...}m
ESC[{line};{column}H 
ESC[48;2;{r};{g};{b}m
ESC[38;5;${ID}m

what's the proper usage for these? do you include the {} what about ... and $

@bczsalba

This comment has been minimized.

Copy link

@bczsalba bczsalba commented May 28, 2021

You can write things like \033[38;5;141m for the color purple, set the position of the cursor to 60;10 with \033[60;10H, and stuff like that.

The ... I think implies that it can be one of a lot of different data, which is explained better above, and the ${ID} just means to say "replace that with the ID of the thing you want". The {} is not included in them.

@fnky

This comment has been minimized.

Copy link
Owner Author

@fnky fnky commented May 29, 2021

@JoelJarosz thanks for pointing this out. You're right it is a bit confusing.

As @bczsalba mentioned, the curly-braces ({}) are not included in the actual code, they are used to indicate a placeholder. I've updated some of the sections to better reflect this, hope this makes are bit clearer!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment