How do I change the color of current cursor position indicator? How do I change the color of current cursor position indicator? linux linux

How do I change the color of current cursor position indicator?


Nothing portable, but certain terminals accept escape sequences to change the cursor colour.

For example xterm accepts OSC 12 to set the colour

$ echo -e "\e]12;red\a"


Short answer

echo -n -e '\e[?0c'       #DISAPPEARecho -n -e '\e[?16;0;64c' #REAPPEARecho -n -e '\e[?16;0;80c' #REAPPEAR w/highlighting

Long answer

As of today, the current version of agetty (contained in util-linux 2.27.1 [util-linux is the linux package providing most core commands, like login, su, mount, more, kill - to name a few] - and you should have it if your linux kernel version is >=4.4) has a different behavior than described in the yet-to-be-updated kernel.org documentation (Software cursor for VGA).

Consider

echo -n -e '\e[?byte1;byte2;byte3c'

byte1:

+---------------+---------------+|  high nibble  |   low nibble  |+---+-----------+-----------+---+|msb|           |           |lsb|+---+---+---+---+---+---+---+---+| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |+---+---+---+---+---+---+---+---+                  |   |   |   |                  |   |   |   +-+                  |   |   |     |   These bits specify the 8                  |   |   +-----+-> possible blinking HW carets                  |   |         |                     |   +---------+                  |                  +---------------> When set, this bit enables SW                                    caret instead of HW caret

byte2 (SW caret):

                +-----------------> A pretty useless mask applied                |                   to bits in byte3+---------------+---------------+|  high nibble  |   low nibble  |+---+-----------+-----------+---+|msb|           |           |lsb|+---+---+---+---+---+---+---+---+| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |+---+---+---+---+---+---+---+---+

byte3 (SW caret):

+---------------+---------------+|  high nibble  |   low nibble  |+---+-----------+-----------+---+|msb|           |           |lsb|+---+---+---+---+---+---+---+---+| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |+---+---+---+---+---+---+---+---+  |   |   |   |  |   |   |   +-------------------> Highlighting  |   |   |  |   |   +---------------------+  |   |                         |  |   +-------------------------+-> Color  |                             |  +-----------------------------+

Highlighting: highligths the character beneath the caret (e.g. changing it to white [true shiny white] instead of dark white [the light gray that is commonly the default for TTYs]).

Color: the color of the caret. Note that, compared to the usual order of ANSI color codes we all know and love, bits are reversed, so -for this triplet- the 7th is the Lsb while the 5th is the Msb.

So, while in the 70s ANSI defined the following color codes, setting a de-facto standard adopted universally for TTYs, miscellaneous linux terminals, consoles, and whatnot

000 (0) black001 (1) red010 (2) green011 (3) yellow or dark yellow100 (4) blue or dark blue101 (5) magenta, purple or violet110 (6) cyan or light blue111 (7) white or dark white (light gray)

in this case we have the opposite

000 (0) black100 (4) red010 (2) green110 (6) yellow or dark yellow001 (1) blue or dark blue101 (5) magenta, purple or violet011 (3) cyan or light blue111 (7) white or dark white (light gray)

(Octal value parenthesized)

So, here comes the list:

#Hardware carets (blinking and [dark ]white)echo -n -e '\e[?0c' #default caretecho -n -e '\e[?1c' #invisible caretecho -n -e '\e[?2c' #underscore caretecho -n -e '\e[?3c' #thicker underscore caretecho -n -e '\e[?4c' #smaller block caretecho -n -e '\e[?5c' #small block caretecho -n -e '\e[?6c' #big block caretecho -n -e '\e[?7c' #biggest block caret#On my Linux machine, both 6 and 7 are the big rectangular full-size block caret#Software carets (non-blinking and colored)echo -n -e '\e[?16;0;0c'  #00001000 0 00000000 black (thus invisible on black background)echo -n -e '\e[?16;0;128c'#00001000 0 10000000 redecho -n -e '\e[?16;0;64c' #00001000 0 01000000 greenecho -n -e '\e[?16;0;192c'#00001000 0 11000000 yellowecho -n -e '\e[?16;0;32c' #00001000 0 00100000 blueecho -n -e '\e[?16;0;160c'#00001000 0 10100000 magentaecho -n -e '\e[?16;0;96c' #00001000 0 01100000 cyanecho -n -e '\e[?16;0;224c'#00001000 0 11100000 dim whiteecho -n -e '\e[?16;0;16c' #00001000 0 00010000 black     + highlightingecho -n -e '\e[?16;0;144c'#00001000 0 10010000 red       + highlightingecho -n -e '\e[?16;0;80c' #00001000 0 01010000 green     + highlightingecho -n -e '\e[?16;0;208c'#00001000 0 11010000 yellow    + highlightingecho -n -e '\e[?16;0;48c' #00001000 0 00110000 blue      + highlightingecho -n -e '\e[?16;0;176c'#00001000 0 10110000 magenta   + highlightingecho -n -e '\e[?16;0;112c'#00001000 0 01110000 cyan      + highlightingecho -n -e '\e[?16;0;240c'#00001000 0 11110000 dim white + highlighting


You can change the color of cursor if you change the color of the printed text.So you can't simple change the color of the cursor not changing the color of the text you are printing.

But you can make cursor invisible:

system("tput cinvis"); # make cursor invisiblesystem("tput cnorm");  # make cursor visible