如何在 Rust 中每次打印新行后清空终端屏幕?

36

我使用了 println! 打印了一些文本,现在我需要清除终端并写入新的文本,以替换旧文本。如何清除终端上的所有文本?

我尝试了这段代码,但它只清除了当前行,而 1 仍然在输出中。

fn main() {
    println!("1");
    print!("2");
    print!("\r");
}

11
这不是重复问题!这是在寻求清除终端的方法。链接中的“重复”是关于清除当前行的。该问题还说明清除当前行并不有助于解决问题。 - itmuckel
5个回答

59

6
更简单的方式:print!("\x1B[2J"); - Pavel Strakhov
@PavelStrakhov,虽然这不会将光标定位到最顶端,但与第一个相比要简单得多。 - iamcastelli
1
@iamcastelli 第二个基本上和第一个一样,只是在结尾加了\x1b[1;1H\x1b[2J清除屏幕,\x1b[1;1H将光标位置设置为(1;1) :) - somerandomdev49
这个工作在哪些操作系统/终端环境下可以运行,哪些不可以? - alter_igel

32
print!("\x1B[2J\x1B[1;1H");

这将清空屏幕并将光标置于屏幕的第一行和第一列。


10
由得票最高答案提供的解决方案并没有按照我想要的方式工作。 \x1B[2J\x1B[1;1H序列只会向下滚动终端,实际上它会隐藏内容而非清除内容。由于我想运行一个无限循环来重新呈现显示给用户的内容,这就是问题所在,因为我的终端窗口的滚动条每次“tick”时都会缩小。
Clear a terminal screen for real的启发,我正在使用
print!("{esc}c", esc = 27 as char);

这对我来说非常好用。对于我没有使用过的其他系统可能会有一些缺点,我不知道。


2
在Linux或macOS终端中尝试以下操作:
std::process::Command::new("clear").status().unwrap();

在Windows中:

std::process::Command::new("cls").status().unwrap();

这基本上是向终端发送“清除”命令。

1
这实际上没有产生期望的效果。 - amyiris

0
cant-run-a-system-command-in-windows中,由Vallentin提供了准确的答案。
use std::{
    error::Error,
    process::Command,
};

fn main() -> Result<(), Box<dyn Error>> {

    clear_terminal_screen();
    println!("Hello World!");

    Ok(())
}

如下:

pub fn clear_terminal_screen() {
    if cfg!(target_os = "windows") {
        Command::new("cmd")
            .args(["/c", "cls"])
            .spawn()
            .expect("cls command failed to start")
            .wait()
            .expect("failed to wait");
    } else {
        Command::new("clear")
            .spawn()
            .expect("clear command failed to start")
            .wait()
            .expect("failed to wait");
    };
}

查看Rust Playground

1
您的回答可以通过添加更多关于代码的功能和如何帮助提问者的信息来改进。 - Tyler2P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接