How to change the color of the current cursor position indicator?

When I open the terminal, I have a black background with white characters. I also have a green placeholder that tells me where the cursor is currently located.

This behavior is the same during any perl script that is running in the terminal.

How can I change the color of the cursor indicator inside a script (in particular, I want it to disappear for a while and then return)?

I use Linux and bash.

+6
source share
4 answers

You can change the color of the cursor if you change the color of the printed text. Thus, you cannot just change the color of the cursor without changing the color of the text you are printing.

But you can make the cursor invisible:

system("tput cinvis"); # make cursor invisible system("tput cnorm"); # make cursor visible 
+2
source

Nothing portable, but some terminals accept escape sequences to change the color of the cursor.

For example xterm accepts OSC 12 to set the color

 $ echo -e "\e]12;red\a" 
+3
source

Short answer

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

Long answer

To date, the current version of the tty age (found in util-linux 2.27.1 [util-linux is the linux package that provides most of the basic commands, for example login , su , mount , more , kill - to name a few] - and you should have it if your version of the Linux kernel> = 4.4) has a different behavior than described in the kernel.org documentation not yet updated ( Program cursor for VGA ).

Consider

echo -n -e '\e[? Byte 1 ; byte2 ; byte 3 c'

Byte 1:

 +---------------+---------------+ | 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 | | +-----------------------------+ 

Backlight: emphasizes the character under the carriage (for example, changing it to white [true shiny white] instead of dark white [light gray, commonly used for TTY]).

Color: carriage color. Please note that in comparison with the usual order of ANSI color codes, which we all know and love, the bits are reversed, so for this triplet - the 7th - L sb, and the 5th - M sb.

So, although in the 70s ANSI defined the following color codes, setting the de facto standard universally accepted for TTY, various Linux terminals, consoles and something else

 000 (0) black 001 (1) red 010 (2) green 011 (3) yellow or dark yellow 100 (4) blue or dark blue 101 (5) magenta, purple or violet 110 (6) cyan or light blue 111 (7) white or dark white (light gray) 

in this case we have the opposite

 000 (0) black 100 (4) red 010 (2) green 110 (6) yellow or dark yellow 001 (1) blue or dark blue 101 (5) magenta, purple or violet 011 (3) cyan or light blue 111 (7) white or dark white (light gray) 

(Octal value in parentheses)

So here is the list:

 #Hardware carets (blinking and [dark ]white) echo -n -e '\e[?0c' #default caret echo -n -e '\e[?1c' #invisible caret echo -n -e '\e[?2c' #underscore caret echo -n -e '\e[?3c' #thicker underscore caret echo -n -e '\e[?4c' #smaller block caret echo -n -e '\e[?5c' #small block caret echo -n -e '\e[?6c' #big block caret echo -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 red echo -n -e '\e[?16;0;64c' #00001000 0 01000000 green echo -n -e '\e[?16;0;192c'#00001000 0 11000000 yellow echo -n -e '\e[?16;0;32c' #00001000 0 00100000 blue echo -n -e '\e[?16;0;160c'#00001000 0 10100000 magenta echo -n -e '\e[?16;0;96c' #00001000 0 01100000 cyan echo -n -e '\e[?16;0;224c'#00001000 0 11100000 dim white echo -n -e '\e[?16;0;16c' #00001000 0 00010000 black + highlighting echo -n -e '\e[?16;0;144c'#00001000 0 10010000 red + highlighting echo -n -e '\e[?16;0;80c' #00001000 0 01010000 green + highlighting echo -n -e '\e[?16;0;208c'#00001000 0 11010000 yellow + highlighting echo -n -e '\e[?16;0;48c' #00001000 0 00110000 blue + highlighting echo -n -e '\e[?16;0;176c'#00001000 0 10110000 magenta + highlighting echo -n -e '\e[?16;0;112c'#00001000 0 01110000 cyan + highlighting echo -n -e '\e[?16;0;240c'#00001000 0 11110000 dim white + highlighting 
+2
source

Have you tried something like this?

 use Term::ANSIColor qw(:constants); print RED, "Danger, Will Robinson!\n", RESET; 
+1
source

Source: https://habr.com/ru/post/920526/


All Articles