scripting:terminalcodes

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
scripting:terminalcodes [2011/10/22 06:20]
thebonsai [Table]
scripting:terminalcodes [2017/09/13 13:26]
nudin [Misc codes] corrected/updated the situation about more colors
Line 3: Line 3:
 {{keywords>​bash shell scripting colors cursor control vt100 ansi}} {{keywords>​bash shell scripting colors cursor control vt100 ansi}}
  
-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.+Terminal (control) codes are used to issue specific commands to your terminal. This can be related to switching colors or positioning the cursor, ​i.e. anything ​that can't be done by the application itself.
  
  
 ===== How it technically works ===== ===== 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.+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 print the codes with a simple ''​echo''​ command.
  
-__**Note:​**__ I see that codes referenced as "Bash colors"​ sometimes (several "Bash tutorials"​ etc...): That's a retarded and completely incorrect definition.+__**Note:​**__ I see codes referenced as "Bash colors"​ sometimes (several "Bash tutorials"​ etc...): That's a completely incorrect definition.
  
 ===== The tput command ===== ===== 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. +Because there'​s a large number of different terminal control languages, usually a system has an intermediate ​communication ​layer. 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). +
- +
  
 +One of these commands is ''​tput''​. Tput accepts a set of acronyms called //​capability names// and any parameters, if appropriate,​ then looks up the correct escape sequences for the detected terminal in the ''​terminfo''​ database and prints the correct codes (the terminal hopefully understands).
  
 ===== The codes ===== ===== 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!+In this list I'll focus on ANSI/VT100 control codes for the most common ​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'' ​acronyms ​are usually ​the ones dedicated for ANSI escapes!
  
-Also 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 ;-)+I listed ​only the most relevant codes, of course, any ANSI terminal ​understands many more! But let'​s ​keep the discussion centered on common shell scripting ;-)
  
-Sometimes ​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!+If couldn't find a matching ANSI escapeyou'll see a :?: as  ​the ​code. 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!**+The ANSI codes always ​start with the ESC character(ASCII 0x1B or octal 033) This isn't part of the list, but **you should avoid using 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) All codes that can be used with ''​tput''​ can be found in terminfo(5). (on OpenBSD at least)
-See [[http://​www.openbsd.org/​cgi-bin/​man.cgi?​query=terminfo&​apropos=0&​sektion=5&​manpath=OpenBSD+Current&​arch=i386&​format=html|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.+See [[http://​www.openbsd.org/​cgi-bin/​man.cgi?​query=terminfo&​apropos=0&​sektion=5&​manpath=OpenBSD+Current&​arch=i386&​format=html|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 ==== ==== General useful ASCII codes ====
Line 48: Line 45:
 |''​ESC''​|27|033|0x1B|''<​none>''​|''​^[''​|Escape character| |''​ESC''​|27|033|0x1B|''<​none>''​|''​^[''​|Escape character|
 |''​DEL''​|127|177|0x7F|''<​none>''​|''<​none>''​|Delete character| |''​DEL''​|127|177|0x7F|''<​none>''​|''<​none>''​|Delete character|
- 
- 
- 
  
 ==== Cursor handling ==== ==== Cursor handling ====
  
 ^ANSI^terminfo equivalent^Description^ ^ANSI^terminfo equivalent^Description^
-|''​[ <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| +|''​[ <X> ; <Y> H''​\\ ''​[ <X> ; <Y> f''​|''​cup <X> <​Y>''​|Home-positioning to ''​X''​ and ''​Y''​ coordinates\\ :!: it seems that ANSI uses 1-1 as home while ''​tput'' ​uses 0-0| 
-|''​[ H''​|''​home''​|Home-positioning ​to root (0-0)| +|''​[ H''​|''​home''​|Move cursor ​to home position ​(0-0)| 
-|''​8''​|''​sc''​|Save current cursor position| +|''​7''​|''​sc''​|Save current cursor position| 
-|''​9''​|''​rc''​|Restore ​current ​cursor position|+|''​8''​|''​rc''​|Restore ​saved cursor position|
 |:?: most likely a normal code like ''​\b''​|''​cub1''​|move left one space (backspace)| |:?: most likely a normal code like ''​\b''​|''​cub1''​|move left one space (backspace)|
-|VT100 ''​[ ? 25 l''​|''​civis''​|switch ​cursor invisible| +|VT100 ''​[ ? 25 l''​|''​civis''​|make cursor invisible| 
-|VT100 ''​[ ? 25 h''​|''​cvvis''​|switch ​cursor visible|+|VT100 ''​[ ? 25 h''​|''​cvvis''​|make cursor visible|
  
 ==== Erasing text ==== ==== Erasing text ====
Line 69: Line 63:
 | ''​[ 1 K'' ​           | ''​el1'' ​             | **Clear line from beginning** to current cursor position ​       | | ''​[ 1 K'' ​           | ''​el1'' ​             | **Clear line from beginning** to current cursor position ​       |
 | ''​[ 2 K'' ​           | ''​el2'':?: ​          | **Clear whole line** (cursor position unchanged) ​               | | ''​[ 2 K'' ​           | ''​el2'':?: ​          | **Clear whole line** (cursor position unchanged) ​               |
- 
- 
  
 ==== General text attributes ==== ==== General text attributes ====
Line 78: Line 70:
 |''​[ 1 m''​|''​bold''​|Set "​bright"​ attribute| |''​[ 1 m''​|''​bold''​|Set "​bright"​ attribute|
 |''​[ 2 m''​|''​dim''​|Set "​dim"​ attribute| |''​[ 2 m''​|''​dim''​|Set "​dim"​ attribute|
 +|''​[ 3 m''​|''​smso''​|Set "​standout"​ attribute|
 |''​[ 4 m''​|set ''​smul''​ unset ''​rmul''​ :?:|Set "​underscore"​ (underlined text) attribute| |''​[ 4 m''​|set ''​smul''​ unset ''​rmul''​ :?:|Set "​underscore"​ (underlined text) attribute|
 |''​[ 5 m''​|''​blink''​|Set "​blink"​ attribute| |''​[ 5 m''​|''​blink''​|Set "​blink"​ attribute|
 |''​[ 7 m''​|''​rev''​|Set "​reverse"​ attribute| |''​[ 7 m''​|''​rev''​|Set "​reverse"​ attribute|
 |''​[ 8 m''​|''​invis''​|Set "​hidden"​ attribute| |''​[ 8 m''​|''​invis''​|Set "​hidden"​ attribute|
- 
- 
  
 ==== Foreground coloring ==== ==== Foreground coloring ====
Line 97: Line 88:
 | ''​[ 3 7 m'' ​ | ''​setaf 7'' ​         | Set **foreground** to color #7 - **white** ​   | | ''​[ 3 7 m'' ​ | ''​setaf 7'' ​         | Set **foreground** to color #7 - **white** ​   |
 | ''​[ 3 9 m'' ​ | ''​setaf 9'' ​         | Set **default** color as foreground color     | | ''​[ 3 9 m'' ​ | ''​setaf 9'' ​         | Set **default** color as foreground color     |
- 
- 
- 
- 
- 
- 
  
 ==== Background coloring ==== ==== Background coloring ====
Line 116: Line 101:
 | ''​[ 4 7 m'' ​ | ''​setab 7'' ​         | Set **background** to color #7 - **white** ​   | | ''​[ 4 7 m'' ​ | ''​setab 7'' ​         | Set **background** to color #7 - **white** ​   |
 | ''​[ 4 9 m'' ​ | ''​setaf 9'' ​         | Set **default** color as background color     | | ''​[ 4 9 m'' ​ | ''​setaf 9'' ​         | Set **default** color as background color     |
- 
- 
- 
- 
- 
  
 ==== Misc codes ==== ==== Misc codes ====
  
 +=== Save/​restore screen ===
  
- 
- 
-=== Save/​restore screen === 
 Used capabilities:​ ''​smcup'',​ ''​rmcup''​ 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:+You'​ve ​undoubtedly ​already ​encountered ​programs that restore the terminal contents after they do their work (like ''​vim''​). This can be done by the following ​commands:
 <​code>​ <​code>​
 # save, clear screen # save, clear screen
Line 144: Line 122:
 </​code>​ </​code>​
  
-Thanks to ''​greycat'' ​for finding ​this and sharing it!+These features require that certain capabilities exist in your termcap/​terminfo. ​ While ''​xterm'' ​and most of its clones (''​rxvt'',​ ''​urxvt'',​ etc) will support the instructions,​ your operating system may not include references to them in its default xterm profile. ​ (FreeBSD, in particular, falls into this category.) ​ If `tput smcup` appears to do nothing for you, and you don't want to modify your system termcap/​terminfo data, and you KNOW that you are using a compatible xterm application,​ the following may work for you:
  
 +<​code>​
 +echo -e '​\033[?​47h'​ # save screen
 +echo -e '​\033[?​47l'​ # restore screen
 +</​code>​
  
-===== Bash examples =====+Certain software uses these codes (via their termcap capabilities) as well. You may have seen the screen save/​restore in ''​less'',​ ''​vim'',​ ''​top'',​ ''​screen''​ and others. ​ Some of these applications may also provide configuration options to *disable* this behaviour. ​ For example, ''​less''​ has a ''​-X''​ option for this, which can also be set in an environment variable:
  
-==== Hardcoded colors ====+<​code>​ 
 +export LESS=
 +less /​path/​to/​file 
 +</​code>​ 
 + 
 +Similarly, ''​vim''​ can be configured not to "​restore"​ the screen by adding the following to your ''​~/​.vimrc'':​
  
-__Directly inside the echo:__ 
 <​code>​ <​code>​
-echo -e 'It is \033[31mnot\033[39m intelligent to use \033[32mhardcoded ANSI\033[39m codes!'​+set t_ti= t_te=
 </​code>​ </​code>​
  
-__With preset variables:__+ 
 + 
 +=== Additional colors === 
 + 
 +Some terminal emulators support additional colors. The most common extension used by xterm-compatible terminals supports 256 colors. These can be generated by ''​tput''​ with ''​seta{f,​b} [0-255]''​ when the ''​TERM''​ value has a ''​-256color''​ suffix. 
 +[[https://​gist.github.com/​XVilka/​8346728#​now-supporting-truecolour|Some terminals]] also support full 24-bit colors, and any X11 color code can be written directly into a special escape sequence. ([[https://​gist.github.com/​XVilka/​8346728|More infos]]) Only a few programs make use of anything beyond 256 colors, and tput doesn'​t know about them. Colors beyond 16 usually only apply to modern terminal emulators running in graphical environments. 
 + 
 +The Virtual Terminal implemented in the Linux kernel supports only 16 colors, and the usual default terminfo entry for ''​TERM=linux''​ defines only 8. There is sometimes an alternate "​linux-16color"​ that you can switch to, to get the other 8 colors. 
 + 
 +===== Bash examples ===== 
 + 
 +==== Hardcoded colors ==== 
 <​code>​ <​code>​
-COL_NORM=$'​\033[39m+printf ​'%b\n' 'It is \033[31mnot\033[39m ​intelligent to use \033[32mhardcoded ​ANSI\033[39m codes!'​
-COL_RED=$'​\033[31m' +
-echo "​Beware,​ ${COL_RED}not all terminals${COL_NORM} support ​ANSI"+
 </​code>​ </​code>​
  
Line 177: Line 173:
 echo "​It'​s ${COL_RED}red${COL_NORM} and ${COL_GREEN}green${COL_NORM} - have you seen?" echo "​It'​s ${COL_RED}red${COL_NORM} and ${COL_GREEN}green${COL_NORM} - have you seen?"
 </​code>​ </​code>​
- 
- 
  
 ==== Misc ==== ==== Misc ====
Line 235: Line 229:
 done done
 </​code>​ </​code>​
 +
 +==== Mandelbrot set ====
 +
 +This is a slightly modified version of Charles Cooke'​s colorful Mandelbrot plot scripts ([[http://​earth.gkhs.net/​ccooke/​shell.html | original w/ screenshot]]) -- ungolfed, optimized a bit, and without hard-coded terminal escapes. The ''​colorBox''​ function is [[http://​en.wikipedia.org/​wiki/​Memoization | memoized]] to collect ''​tput''​ output only when required and output a new escape only when a color change is needed. This limits the number of ''​tput''​ calls to at most 16, and reduces raw output by more than half. The ''​doBash''​ function uses integer arithmetic, but is still ksh93-compatible (run as e.g. ''​bash ./​mandelbrot''​ to use it). The ksh93-only floating-point ''​doKsh''​ is almost 10x faster than ''​doBash''​ (thus the ksh shebang by default), but uses only features that don't make the Bash parser crash.
 +
 +<​code>​
 +#​!/​usr/​bin/​env ksh
 +
 +# Charles Cooke'​s 16-color Mandelbrot
 +# http://​earth.gkhs.net/​ccooke/​shell.html
 +# Combined Bash/ksh93 flavors by Dan Douglas (ormaaj)
 +
 +function doBash {
 + typeset P Q X Y a b c i v x y 
 + for ((P=10**8,​Q=P/​100,​X=320*Q/​cols,​Y=210*Q/​lines,​y=-105*Q,​v=-220*Q,​x=v;​y<​105*Q;​x=v,​y+=Y));​ do
 + for ((;​x<​P;​a=b=i=c=0,​x+=X));​ do
 + for ((;​a**2+b**2<​4*P**2&&​i++<​99;​a=((c=a)**2-b**2)/​P+x,​b=2*c*b/​P+y));​ do :
 + done
 + colorBox $((i<​99?​i%16:​0))
 + done
 + echo
 + done
 +}
 +
 +function doKsh {
 + integer i
 + float a b c x=2.2 y=-1.05 X=3.2/cols Y=2.1/​lines ​
 + while
 + for ((a=b=i=0;​(c=a)**2+b**2<​=2&&​i++<​99&&​(a=a**2-b**2+x,​b=2*c*b+y);​));​ do :
 + done
 + . colorBox $((i<​99?​i%16:​0))
 + if ((x<​1?​!(x+=X):​(y+=Y,​x=-2.2)));​ then
 + print
 + ((y<​1.05)) ​
 + fi
 + do :
 + done
 +}
 +
 +function colorBox {
 + (($1==lastclr)) || printf %s "​${colrs[lastclr=$1]:​=$(tput setaf "​$1"​)}"​
 + printf '​\u2588'​
 +}
 +
 +unset -v lastclr
 +((cols=$(tput cols)-1, lines=$(tput lines)))
 +typeset -a colrs
 +trap 'tput sgr0; echo' EXIT
 +${KSH_VERSION+. doKsh} ${BASH_VERSION+doBash}
 +</​code>​
 +
 +A much more sophisticated version by Roland Mainz can be found [[http://​svn.nrubsig.org/​svn/​people/​gisburn/​scripts/​mandelbrotset1.sh | here]]
  • scripting/terminalcodes.txt
  • Last modified: 2019/08/23 13:22
  • by artmieu