Terminal codes (ANSI/VT100) introduction

Terminal (control-)codes are needed to give specific commands to your terminal. This can be related to switching colors or positioning the cursor, simply everything that can't be done by the application itself.

How it technically works

A terminal control code is a special sequence of characters that is printed (like any other text). If the terminal understands the code, it won't display the character-sequence, but will perform some action. You can always print the codes with a simple echo command - for the application, it's nothing special.

Note: I see that codes referenced as “Bash colors” sometimes (several “Bash tutorials” etc...): That's a retarded and completely incorrect definition.

The tput command

Because there's a large number of different terminal control languages, usually a system has an intermediate-layer to talk to it. The real codes are looked up in a database for the currently detected terminal type and you give standardized requests to an API or (from the shell) to a command.

One of these commands is tput - it accepts a set of acronymes and parameters for them, looks up the correct codes for the detected terminal in the terminfo database and prints the correct codes (the terminal hopefully understands).

The codes

In this list I'll focus to ANSI/VT100 control codes for the most needed actions - take it as quick reference. The documentation of your terminal or the terminfo database is always the preferred source when something is unclear! Also the tput acronymes are the ones dedicated for ANSI escapes, usually!

Also I only listed the most relevant codes, of course, any ANSI or especially your nice terminal knows much more! But let's reduce to common shell scripting ;-)

Sometimes I didn't find a matching ANSI escape or vice versa - you'll see a :?: as code then - feel free to mail me or fix it!

The ANSI codes are always intoduced with an ESC character (ASCII 0x1B or octal 033) - this isn't part of the list, but you should avoid to use the ANSI codes directly - use the tput command!

All codes that can be used with tput can be found in terminfo(5). (on OpenBSD at least) See OpenBSD's terminfo(5) under the Capabilities section. The cap-name is the code to use with tput, a description of each code is also provided.

General useful ASCII codes

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.

NamedecimaloctalhexC-escapeCtrl-KeyDescription
BEL70070×07\a^GTerminal bell
BS80100×08\b^HBackspace
HT90110×09\t^IHorizontal TAB
LF100120x0A\n^JLinefeed (newline)
VT110130x0B\v^KVertical TAB
FF120140x0C\f^LFormfeed (also: New page NP)
CR130150x0D\r^MCarriage return
ESC270330x1B<none>^[Escape character
DEL1271770x7F<none><none>Delete character

Cursor handling

ANSIterminfo equivalentDescription
[ <X> ; <Y> H
[ <X> ; <Y> f
cup <X> <Y>Home-positioning to X and Y coordinates
:!: it seems that ANSI takes 1-1 as root while tput takes 0-0
[ HhomeHome-positioning to root (0-0)
8scSave current cursor position
9rcRestore current cursor position
:?: most likely a normal code like \bcub1move left one space (backspace)
VT100 [ ? 25 lcivisswitch cursor invisible
VT100 [ ? 25 hcvvisswitch cursor visible

Erasing text

ANSIterminfo equivalentDescription
[ K
[ 0 K
elClear line from current cursor position to end of line
[ 1 Kel1Clear line from beginning to current cursor position

Note: I found no code to entirely erase the current line (“delete line” is something else!). It might be a combination of positioning the cursor and erase to the end of line.

General text attributes

ANSIterminfo equivalentDescription
[ 0 msgr0Reset all attributes
[ 1 mboldSet “bright” attribute
[ 2 mdimSet “dim” attribute
[ 4 mset smul unset rmul :?:Set “underscore” (underlined text) attribute
[ 5 mblinkSet “blink” attribute
[ 7 mrevSet “reverse” attribute
[ 8 minvisSet “hidden” attribute

Foreground coloring

ANSIterminfo equivalentDescription
[ 3 0 msetaf 0Set foreground to color #0 - black
[ 3 1 msetaf 1Set foreground to color #1 - red
[ 3 2 msetaf 2Set foreground to color #2 - green
[ 3 3 msetaf 3Set foreground to color #3 - yellow
[ 3 4 msetaf 4Set foreground to color #4 - blue
[ 3 5 msetaf 5Set foreground to color #5 - magenta
[ 3 6 msetaf 6Set foreground to color #6 - cyan
[ 3 7 msetaf 7Set foreground to color #7 - white
[ 3 9 msetaf 9Set default foreground color

Background coloring

ANSIterminfo equivalentDescription
[ 4 0 msetab 0Set background to color #0 - black
[ 4 1 msetab 1Set background to color #1 - red
[ 4 2 msetab 2Set background to color #2 - green
[ 4 3 msetab 3Set background to color #3 - yellow
[ 4 4 msetab 4Set background to color #4 - blue
[ 4 5 msetab 5Set background to color #5 - magenta
[ 4 6 msetab 6Set background to color #6 - cyan
[ 4 7 msetab 7Set background to color #7 - white
[ 4 9 msetaf 9Set default background color

Misc codes

Save/restore screen

Used capabilities: smcup, rmcup

For sure, you've already seen those programs that restore the terminal contents after they did their work (like vim). This can be done by the following codes:

# save, clear screen
tput smcup
clear

# example "application" follows...
read -n1 -p "Press any key to continue..."
# example "application" ends here

# restore
tput rmcup

Thanks to greycat for finding this and sharing it!

Bash examples

Hardcoded colors

Directly inside the echo:

echo -e 'It is \033[31mnot\033[39m intelligent to use \033[32mhardcoded ANSI\033[39m codes!'

With preset variables:

COL_NORM=$'\033[39m'
COL_RED=$'\033[31m'
echo "Beware, ${COL_RED}not all terminals${COL_NORM} support ANSI"

Colors using tput

Directly inside the echo:

echo "TPUT is a $(tput setaf 2)nice$(tput setaf 9) and $(tput setaf 5)user friendly$(tput setaf 9) terminal capability database."

With preset variables:

COL_NORM="$(tput setaf 9)"
COL_RED="$(tput setaf 1)"
COL_GREEN="$(tput setaf 2)"
echo "It's ${COL_RED}red${COL_NORM} and ${COL_GREEN}green${COL_NORM} - have you seen?"

Misc

HOME function

home() {
  # yes, actually not much shorter ;-)
  tput home
}

Silly but nice effect

#!/bin/bash

DATA[0]="     _/  _/    _/                            _/    "
DATA[1]="  _/_/_/_/_/  _/_/_/      _/_/_/    _/_/_/  _/_/_/ "
DATA[2]="   _/  _/    _/    _/  _/    _/  _/_/      _/    _/"
DATA[3]="_/_/_/_/_/  _/    _/  _/    _/      _/_/  _/    _/ "
DATA[4]=" _/  _/    _/_/_/      _/_/_/  _/_/_/    _/    _/  "

# virtual coordinate system is X*Y ${#DATA} * 5

REAL_OFFSET_X=0
REAL_OFFSET_Y=0

draw_char() {
  V_COORD_X=$1
  V_COORD_Y=$2

  tput cup $((REAL_OFFSET_Y + V_COORD_Y)) $((REAL_OFFSET_X + V_COORD_X))

  printf %c ${DATA[V_COORD_Y]:V_COORD_X:1}
}


trap 'exit 1' INT TERM
trap 'tput setaf 9; tput cvvis; clear' EXIT

tput civis
clear

while :; do

for ((c=1; c <= 7; c++)); do
  tput setaf $c
  for ((x=0; x<${#DATA[0]}; x++)); do
    for ((y=0; y<=4; y++)); do
      draw_char $x $y
    done
  done
done

done

scripting/terminalcodes.txt · Last modified: 2010/01/02 18:04 by thebonsai
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0