终端特殊字符实现清屏和颜色控制等操作
在使用node.js编写命令行工具的时候,想要写一个命令行的工具条,然后需要对当前行进行清除操作,在反复查阅资料后发现,在终端内进行清屏等操作可以利用向终端输出特殊字符来实现。
颜色控制
以node.js为例,在终端中输出有颜色的文字的方式如下:
// 此行代码将在控制台输出黄色的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 | 白色 |
清屏等操作
在终端中进行清屏等操作,可以直接向终端输出如下的特殊代码即可。
// 下面这行代码即可实现清屏效果
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` | 显示光标 |