终端特殊字符实现清屏和颜色控制等操作

在使用node.js编写命令行工具的时候,想要写一个命令行的工具条,然后需要对当前行进行清除操作,在反复查阅资料后发现,在终端内进行清屏等操作可以利用向终端输出特殊字符来实现。

颜色控制

以node.js为例,在终端中输出有颜色的文字的方式如下:

1
2
3
4
// 此行代码将在控制台输出黄色的Hello World.
// 行首的 \033[1;33m 是将后续输出文字的颜色修改为黄色
// 行尾的 \033[0m 是在输出完之后讲文字颜色回复正常,以免影响后面的内容
process.stdout.write("\033[1;33m Hello World. \033[0m \n")

下表为常用颜色值对应的字符集合

颜色值 对应的字符 颜色值 对应的字符 颜色值 对应的字符
none \033[0m black \033[0;30m dark_gray \033[1;30m
blue \033[0;34m light_blue \033[1;34m green \033[0;32m
light_green - \033[1;32m cyan \033[0;36m light_cyan \033[1;36m
red \033[0;31m light_red \033[1;31m purple \033[0;35m
light_purple \033[1;35m brown \033[0;33m yellow \033[1;33m
light_gray \033[0;37m white \033[1;37m

特殊效果设置

代码 对应格式 代码 对应格式
\033[0m 关闭所有属性 \033[1m 设置高亮度
\03[4m 下划线 \033[5m 闪烁
\033[7m 反显 \033[8m 消隐
\033[30m\033[37m 设置前景色
\033[40m\033[47m 设置背景色

前景色和背景色的取值范围表:

前景 背景 颜色
30 40 黑色
31 41 紅色
32 42 綠色
33 43 黃色
34 44 藍色
35 45 紫紅色
36 46 青藍色
37 47 白色

清屏等操作

在终端中进行清屏等操作,可以直接向终端输出如下的特殊代码即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 下面这行代码即可实现清屏效果
process.stdout.write('\033[2J')

// 下面这行代码可以将光标置于屏幕的左上角
process.stdout.write('\033[0;0f');

// 如果要清除当前行内容则可以将光标移动到指定的行首,然后清除当前行内容即可
process.stdout.write('\033[0;0f');
process.stdout.write('\033[K');

// 由于我要实现的是一个进度条效果,所以代码如下,用到了保存和恢复光标位置
setInterval(function() {
process.stdout.write("\033[K"); // 清除当前行内容
process.stdout.write("\033[s"); // 保存光标位置
process.stdout.write(thisProgressBar.update(count++, 100)); // 更新进度条信息
process.stdout.write("\033[u"); // 恢复光标位r
}, 1000);
字符 功能 字符 功能
\033[nA 光标上移n行 \03[nB 光标下移n行
\033[nC 光标右移n行 \033[nD 光标左移n行
\033[y;xH 设置光标位置 \033[2J 清屏
\033[K 清除从光标到行尾的内容 \033[s 保存光标位置
\033[u 恢复光标位置 \033[?25l 隐藏光标
\33[?25h` 显示光标