7

当我打开终端时,我有一个带有白色字符的黑色背景。我还有一个绿色占位符,它向我指示当前光标在哪里。

在终端中运行的任何 perl 脚本中,此行为都是相同的。

如何在脚本中更改光标指示器的颜色(具体来说,我希望它消失一段时间然后回来)?

我正在使用 Linux 和 bash。

4

4 回答 4

4

没有什么可移植的,但某些终端接受转义序列来改变光标颜色。

例如xterm接受OSC 12设置颜色

$ echo -e "\e]12;red\a"
于 2012-07-16T17:30:01.820 回答
4

简短的回答

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

长答案

到今天为止, ge tty当前版本(包含在[util-linux 是提供大多数核心命令的 linux 包,例如, , , , - 仅举几例) - 如果您的 linux 内核版本是>=4.4) 的行为与尚未更新的 kernel.org 文档(VGA 的软件光标)中描述的行为不同。util-linux 2.27.1loginsumountmorekill

考虑

echo -n -e '\e[?字节1;字节2;字节3c'

字节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

字节 2(SW 插入符号):

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

字节 3(SW 插入符号):

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

突出显示:突出显示插入符号下方的字符(例如,将其更改为白色 [真正闪亮的白色] 而不是深白色 [TTY 通常默认的浅灰色])。

颜色:插入符号的颜色。请注意,与我们都知道和喜爱的 ANSI 颜色代码的通常顺序相比,位是相反的,所以 - 对于这个三元组 - 第 7 个是L sb 而第 5 个是M sb。

因此,虽然在 70 年代 ANSI 定义了以下颜色代码,但为 TTY、各种 linux 终端、控制台等设置了普遍采用的事实上的标准

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)

在这种情况下,我们有相反的情况

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)

(括号内为八进制值)

所以,这里是列表:

#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
于 2016-08-12T20:50:46.963 回答
2

如果更改打印文本的颜色,则可以更改光标的颜色。所以你不能简单地改变光标的颜色而不改变你正在打印的文本的颜色。

但是您可以使光标不可见:

system("tput cinvis"); # make cursor invisible
system("tput cnorm");  # make cursor visible
于 2012-07-15T17:57:44.110 回答
1

你有没有尝试过这样的事情?

use Term::ANSIColor qw(:constants);

print RED, "Danger, Will Robinson!\n", RESET;
于 2012-07-15T17:32:19.897 回答