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

在使用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`| 显示光标|||