简介

ANSI转义字符是一种用于控制文本终端的特殊字符序列.
它们以"\033"(8进制的33, 也可以是16进制的x1B)为起始, 后跟一个或多个控制码, 用于改变文本显示的颜色、样式、光标位置等

以下是一些常见的ANSI转义字符及其用法:

  • \033[0m: 重置所有属性, 将文本颜色和样式恢复为默认值.
  • \033[1m: 设置粗体文本.
  • \033[4m: 设置下划线文本.
  • \033[7m: 设置反显文本, 即将前景色和背景色互换.
  • \033[30m\033[37m: 设置文本的前景色(文字颜色).
  • \033[40m\033[47m: 设置文本的背景色.
  • \033[1G: 将光标移动到行首.(跟\r格式化控制符差不多)
  • \033[nA: 将光标向上移动n行.
  • \033[nB: 将光标向下移动n行.
  • \033[nC: 将光标向右移动n列.
  • \033[nD: 将光标向左移动n列.
  • \033[y;xH: 将光标移动到指定的行y和列x.
  • \033[2J: 清屏.

这只是一些常见的ANSI转义字符示例, 实际上还有很多其他的控制码.
这些转义字符通常用于控制终端输出的外观和行为.

详解

在转义字符中, \表示转义, 后面033则是控制码, 后面接具体参数.

例如, 0m和1m和7m是设置文本属性, 不必多言

\033[31m开头的序列是设置文本颜色, 分别代表如下

  • \033[30m:黑色
  • \033[31m:红色
  • \033[32m:绿色
  • \033[33m:黄色
  • \033[34m:蓝色
  • \033[35m:洋红
  • \033[36m:青色
  • \033[37m:白色

而40m开头的则同理, 分别为黑红绿黄蓝紫青白.

后面的光标移动控制码, 则如描述, 不多言.

此外, 这几个不同的条目可以用分号;隔开来组合显示, 例如, 显示加粗的红底绿字, 可以如下

1
printf("\033[1;32;41m hello-world \033[0m");

编写进度条的例子

了解了以上知识, 我们就开始写一个彩色进度条的例子

用cpp编写, 大致逻辑就是一个小时间循环, 每个循环里打印递增数量的字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <cstdio>
#include <cstdlib>
#include <windows.h>

int main()
{
const int total = 100;
printf("ansi test\n");
for (int i = 0; i <= total; i++)
{
float progress = (float)i / total;
int barWidth = 80;
std::printf("[");
int pos = barWidth * progress;
printf("\033[1;34m");
for (int j = 0; j < barWidth; j++)
{
if (j < pos)
std::printf("=");
else if (j == pos)
std::printf(">");
else
std::printf(" ");
}
printf("\033[0m");
std::printf("]\033[1;32;41m %d %% \033[0m\033[1G", (int)(progress * 100.0));
std::fflush(stdout);
Sleep(100);
}
std::printf("\n\033[1;37mOK!\033[0m\n");
return 0;
}

代码如上, 不多解释. 运行效果如下

img

在Linux终端提示符的应用

大家可能经常遇到root用户下没有颜色显示的问题, 这其实是在~/.bashrc里面定义的终端颜色

比如这样, 全是白色

img

修改~/.bashrc文件, 示例如下, 核心就在最后一行, 颜色代码也是一样的, 其他规则可以自行百度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ~/.bashrc: executed by bash(1) for non-login shells.

# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022

# You may uncomment the following lines if you want `ls' to be colorized:
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'

alias grep='grep --color=auto'
# Set prompt colors for root user

PS1='\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

改完就有颜色啦

img

参考文章:

https://www.cnblogs.com/xiaoqiangink/p/12718524.html