终端控制转义序列

参考:ANSI/VT100 Terminal Control Escape Sequences

宏定义

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
33
#ifndef VT100_H
#define VT100_H

/**
* reference: https://www2.ccs.neu.edu/research/gpc/VonaUtils/vona/terminal/vtansi.htm
*/
#define VT100_CURSOR_UP_ONE_ROW "\033[A"

#define VT100_ERASE_END_OF_LINE "\033[K"
#define VT100_ERASE_START_OF_LINE "\033[1K"
#define VT100_ERASE_LINE "\033[2K"

#define VT100_FG_COLOR_BLACK "\033[30m"
#define VT100_FG_COLOR_RED "\033[31m"
#define VT100_FG_COLOR_GREEN "\033[32m"
#define VT100_FG_COLOR_YELLOW "\033[33m"
#define VT100_FG_COLOR_BLUE "\033[34m"
#define VT100_FG_COLOR_MAGENTA "\033[35m"
#define VT100_FG_COLOR_CYAN "\033[36m"
#define VT100_FG_COLOR_WHITE "\033[37m"

#define VT100_BG_COLOR_BLACK "\033[40m"
#define VT100_BG_COLOR_RED "\033[41m"
#define VT100_BG_COLOR_GREEN "\033[42m"
#define VT100_BG_COLOR_YELLOW "\033[43m"
#define VT100_BG_COLOR_BLUE "\033[44m"
#define VT100_BG_COLOR_MAGENTA "\033[45m"
#define VT100_BG_COLOR_CYAN "\033[46m"
#define VT100_BG_COLOR_WHITE "\033[47m"

#define VT100_RESET_ALL_ATTRS "\033[0m"

#endif //VT100_H

在终端中展示任务处理进度

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
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "VT100.h"

#define NB_TASKS (200) // 任务数
#define NB_HYPHEN (50) // 进度条长度

int main(int argc, const char *argv[]) {

const struct timespec rqtp = {
.tv_sec = 0,
.tv_nsec = 100000000L, // 0.1 秒
};

for (int i = 0; i <= NB_TASKS; ++i) {
printf("In progress: [");
int progress = i * 100 / NB_TASKS;
int n = progress * NB_HYPHEN / 100;
for (int j = 0; j < n; ++j) {
printf(VT100_FG_COLOR_GREEN "#" VT100_RESET_ALL_ATTRS);
}
for (int j = n; j < NB_HYPHEN; ++j) {
printf(" ");
}
printf("] " VT100_FG_COLOR_RED "%3d%%" VT100_RESET_ALL_ATTRS "\r\n", progress);

if (NB_TASKS == i) {
printf("Task completed!\r\n");
break;
}

nanosleep(&rqtp, NULL);

printf(VT100_CURSOR_UP_ONE_ROW VT100_ERASE_LINE);

fflush(stdout);
}

return EXIT_SUCCESS;
}

终端控制转义序列
https://daniate.github.io/2021/10/24/终端控制转义序列/
作者
Daniate
发布于
2021年10月24日
许可协议