本文完整阅读约需 6 分钟,如时间较长请考虑收藏后慢慢阅读~

众所周知,Win32下有非常多的命令行光标控制函数,但是在*NIX下,由于这些函数并非GCC官方定义,基本都无法使用,那么这意味着不能够在Linux/Unix/Mac下面控制光标了吗?并非如此,而且有更好的方法:转义序列。

控制光标定位

Linux环境下,控制台会解释ANSI转义序列,转义符是ESC,ASCII码为0x1b,因此,可以通过在中断输出转义序列来实现光标的定位,具体序列如下:

Esc[Line;Columnf

Esc[Line;ColumnH

应用举例:

void gotoxy(int x, int y) {
    printf("%c[%d;%df", 0x1b, y, x);
    // printf("%c[%d;%dH", 0x1b, y, x);
}

注意: 光标位置的行和列都是从 0 开始索引。

转义序列列表:

  • Esc[PnA 光标向上移动Pn行,如果光标已经处于最上方(the top line),则忽略该转义序列。
  • Esc[PnB 光标向下移动Pn行,如果光标已经处于最下方(the buttom line),则忽略该转义序列。
  • Esc[PnC 光标向右移动Pn行,如果光标已经处于最右处(the rightmost column),则忽略该转义序列。
  • Esc[PnD 光标向左移动Pn行,如果光标已经处于最左处(the leftmost column),则忽略该转义序列。
  • Esc[s 保存当前光标位置,之后可以通过恢复光标位置的转义序列回到被保存的光标位置。
  • Esc[u 恢复光标位置,将光标置于 Esc[s 序列保存的光标位置。
  • Esc[2J 清屏,将光标置于(0, 0)处(第一行第一列)。
  • Esc[K 删除从光标所在位置至当前行行末的所有字符,包括当前光标所在位置处的字符。
  • Esc[?25l 隐藏光标。
  • Esc[?25h 显示光标。

设置输出字符颜色

同样,也可以通过输出控制符来控制输出字符的颜色,用法如下:

  • Esc[Ps;Psm 设置图形模式(Set Graphics Mode)。第一个Ps的值为前景色的值,第二个Ps的值为背景色的值。

背景色的颜色值范围为40~49,前景色的颜色值范围为30-39,具体颜色值如下

Color Background Foreground
black 40 30
red 41 31
green 42 32
yellow 43 33
blue 44 34
purple 45 35
deep green 46 36
white 47 37

例如,echo -e "\e[1;42m"表示将背景色设置为green,而echo -e "\e[1;32m表示将前景色设置为green.

其他转义序列控制

  • Esc[0m 关闭所有属性。
  • Esc[1m 设置高亮度。
  • Esc[4m 下划线。
  • Esc[5m 闪烁。
  • Esc[7m 反显。
  • Esc[8m 消隐。