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

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

颜色控制

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

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

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

颜色值对应的字符颜色值对应的字符颜色值对应的字符
none\033[0mblack\033[0;30mdark_gray\033[1;30m
blue\033[0;34mlight_blue\033[1;34mgreen\033[0;32m
light_green -\033[1;32mcyan\033[0;36mlight_cyan\033[1;36m
red\033[0;31mlight_red\033[1;31mpurple\033[0;35m
light_purple\033[1;35mbrown\033[0;33myellow\033[1;33m
light_gray\033[0;37mwhite\033[1;37m

特殊效果设置

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

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

前景背景颜色
3040黑色
3141紅色
3242綠色
3343黃色
3444藍色
3545紫紅色
3646青藍色
3747白色

清屏等操作

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

// 下面这行代码即可实现清屏效果
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`显示光标