有没有办法擦除最后一行输出?
Is there a way to erase the last line of output?
一个打印 3 行输出的非常简单的程序:
console.log('a');
console.log('b');
console.log('c');
程序有没有办法在打印后删除最后一行?即
console.log('a');
console.log('b');
console.log('c');
clearLastLine();
console.log('C');
这将产生:
a
b
C
简单的解决方案是不打印换行符(即不使用 console.log
)。
- 使用
process.stdout.write
打印没有 EOL 字符的行。
- 使用回车 return (
\r
) 字符 return 到行首。
- 使用
\e[K
清除从光标位置到行尾的所有字符。
示例:
process.stdout.write("000");
process.stdout.write("\n111");
process.stdout.write("\n222");
到这一行,输出将是:
000
111
222
但是,如果你执行:
process.stdout.write("000");
process.stdout.write("\n111");
process.stdout.write("\n222");
process.stdout.write("\r\x1b[K")
process.stdout.write("333");
输出为:
000
111
222\r\x1b[K
333
但是,终端会显示:
000
111
333
以下对我有用:
process.stdout.clearLine();
process.stdout.cursorTo(0);
有一个简单的解决方法:
process.stdout.write(`\x1Bc\rData left: ${currentPercentage}%`)
那会打印出如下内容:
"Data left: 100%"...通过使用它,您将在每次迭代后清除屏幕。
'\x1Bc' 清除该行,'\r' returns 到第 0 列。
方式一:
const clearLastLine = () => {
process.stdout.moveCursor(0, -1) // up one line
process.stdout.clearLine(1) // from cursor to end
}
方式二:
const readline = require('readline')
const clearLastLine = () => {
readline.moveCursor(process.stdout, 0, -1) // up one line
readline.clearLine(process.stdout, 1) // from cursor to end
}
方式三:
const ESC = '\x1b' // ASCII escape character
const CSI = ESC + '[' // control sequence introducer
const clearLastLine = () => {
process.stdout.write(CSI + 'A') // moves cursor up one line
process.stdout.write(CSI + 'K') // clears from cursor to line end
}
方式一使用内置tty
模块提供的方法。
方式 2 使用内置 readline
模块。
方法 3 使用 ANSI escape sequences.
我通过查看 log-update 的源代码了解了 ANSI escape sequences,这是我从 dthree 中了解到的的。在做了更多研究之后,我了解了内置的 readline
和 tty
模块。
通过阅读Node.js的源码,我了解到方式1中使用的方法本质上是对方式2中使用的方法的包装,而方式2中使用的方法本质上是对方法的包装在方法 3 中使用。因此,每种方法最终都会在引擎盖下做基本相同的事情。我已经从高级到低级排序了。
我建议使用方法 1 而不是方法 2,使用方法 2 而不是方法 3,主要是因为我认为方法 1 比方法 2 代码更少,更清晰(因此可读性更高),而方法 2 代码更少但更多比方法 3 更清晰(因此更具可读性),并且通过使用较低级别的方法实现的性能改进(如果有的话)可能可以忽略不计。但是,我认为方式 3 避免加载内置 readline
模块。
此解决方案(所有方式)假设您的光标在程序调用 clearLastLine()
之前正好位于空行的开头。作为 Gajus states in , the solution is simpler if instead your cursor is at the end of the last line. So could you use process.stdout.write()
(instead of console.log()
) 打印最后一行没有尾随换行符?
或者,如果您不需要首先打印最后一行,则解决方案会更简单。所有这些都是在修改 stdout a code smell 吗?你能重新设计你的代码,让最后一行完全不打印吗?
在我的例子中,我正在测试我编写的调用 console.error()
, and I don't want the logged error message to show up in my test output. So instead of having my helper function call console.error()
, I could make it throw an error (or just return an error code and/or message or a boolean). And then my main program that calls my helper function could call console.error()
if my helper function throws an error (or returns an an error code and/or message or false
). Or I could pass a boolean flag argument to my helper function that tells it whether or not to log an error. Or I could redirect stderr, or mock the global console
or stub console.error()
等的辅助函数
如果你想清除写入system.stdout
的最后三行,你可以这样做:
const clearLastLines = (count) => {
process.stdout.moveCursor(0, -count)
process.stdout.clearScreenDown()
}
clearLastLines(3)
唯一对我有用的模块是 single-line-log
安装:
npm i single-line-log
导入:
var log = require('single-line-log').stdout;
然后不要使用 console.log()
记录进度条,只需使用 log()
:
// OLD:
while (task_is_running) {
console.log(Progress.update())
}
// NEW:
while (task_is_running) {
log(Progress.update())
}
与进度条的 clui
相结合,效果很好。
下面是php语言的例子,但是比较笼统
php example - Delete lines in the console
一个打印 3 行输出的非常简单的程序:
console.log('a');
console.log('b');
console.log('c');
程序有没有办法在打印后删除最后一行?即
console.log('a');
console.log('b');
console.log('c');
clearLastLine();
console.log('C');
这将产生:
a
b
C
简单的解决方案是不打印换行符(即不使用 console.log
)。
- 使用
process.stdout.write
打印没有 EOL 字符的行。 - 使用回车 return (
\r
) 字符 return 到行首。 - 使用
\e[K
清除从光标位置到行尾的所有字符。
示例:
process.stdout.write("000");
process.stdout.write("\n111");
process.stdout.write("\n222");
到这一行,输出将是:
000
111
222
但是,如果你执行:
process.stdout.write("000");
process.stdout.write("\n111");
process.stdout.write("\n222");
process.stdout.write("\r\x1b[K")
process.stdout.write("333");
输出为:
000
111
222\r\x1b[K
333
但是,终端会显示:
000
111
333
以下对我有用:
process.stdout.clearLine();
process.stdout.cursorTo(0);
有一个简单的解决方法:
process.stdout.write(`\x1Bc\rData left: ${currentPercentage}%`)
那会打印出如下内容: "Data left: 100%"...通过使用它,您将在每次迭代后清除屏幕。
'\x1Bc' 清除该行,'\r' returns 到第 0 列。
方式一:
const clearLastLine = () => {
process.stdout.moveCursor(0, -1) // up one line
process.stdout.clearLine(1) // from cursor to end
}
方式二:
const readline = require('readline')
const clearLastLine = () => {
readline.moveCursor(process.stdout, 0, -1) // up one line
readline.clearLine(process.stdout, 1) // from cursor to end
}
方式三:
const ESC = '\x1b' // ASCII escape character
const CSI = ESC + '[' // control sequence introducer
const clearLastLine = () => {
process.stdout.write(CSI + 'A') // moves cursor up one line
process.stdout.write(CSI + 'K') // clears from cursor to line end
}
方式一使用内置tty
模块提供的方法。
方式 2 使用内置 readline
模块。
方法 3 使用 ANSI escape sequences.
我通过查看 log-update 的源代码了解了 ANSI escape sequences,这是我从 dthree 中了解到的的readline
和 tty
模块。
通过阅读Node.js的源码,我了解到方式1中使用的方法本质上是对方式2中使用的方法的包装,而方式2中使用的方法本质上是对方法的包装在方法 3 中使用。因此,每种方法最终都会在引擎盖下做基本相同的事情。我已经从高级到低级排序了。
我建议使用方法 1 而不是方法 2,使用方法 2 而不是方法 3,主要是因为我认为方法 1 比方法 2 代码更少,更清晰(因此可读性更高),而方法 2 代码更少但更多比方法 3 更清晰(因此更具可读性),并且通过使用较低级别的方法实现的性能改进(如果有的话)可能可以忽略不计。但是,我认为方式 3 避免加载内置 readline
模块。
此解决方案(所有方式)假设您的光标在程序调用 clearLastLine()
之前正好位于空行的开头。作为 Gajus states in process.stdout.write()
(instead of console.log()
) 打印最后一行没有尾随换行符?
或者,如果您不需要首先打印最后一行,则解决方案会更简单。所有这些都是在修改 stdout a code smell 吗?你能重新设计你的代码,让最后一行完全不打印吗?
在我的例子中,我正在测试我编写的调用 console.error()
, and I don't want the logged error message to show up in my test output. So instead of having my helper function call console.error()
, I could make it throw an error (or just return an error code and/or message or a boolean). And then my main program that calls my helper function could call console.error()
if my helper function throws an error (or returns an an error code and/or message or false
). Or I could pass a boolean flag argument to my helper function that tells it whether or not to log an error. Or I could redirect stderr, or mock the global console
or stub console.error()
等的辅助函数
如果你想清除写入system.stdout
的最后三行,你可以这样做:
const clearLastLines = (count) => {
process.stdout.moveCursor(0, -count)
process.stdout.clearScreenDown()
}
clearLastLines(3)
唯一对我有用的模块是 single-line-log
安装:
npm i single-line-log
导入:
var log = require('single-line-log').stdout;
然后不要使用 console.log()
记录进度条,只需使用 log()
:
// OLD:
while (task_is_running) {
console.log(Progress.update())
}
// NEW:
while (task_is_running) {
log(Progress.update())
}
与进度条的 clui
相结合,效果很好。
下面是php语言的例子,但是比较笼统
php example - Delete lines in the console