是否可以在同一行中从右向左打印?

  • 本文关键字:打印 一行 是否 rust crossterm
  • 更新时间 :
  • 英文 :


我试着从右到左打印几个单词,但我的最后一个单词覆盖了前面的单词并擦除了最后一行。我在输出中得到了第二个单词,我做错了什么?谢谢你。

fn render(&self, stdout: &mut Stdout) {
stdout
.execute(Clear(ClearType::All))
.unwrap()
.execute(MoveTo(30, 20))
.unwrap()
.execute(Print("First"))
.unwrap()
.execute(MoveTo(20, 20))
.unwrap()
.execute(Print("Second"))
.unwrap();
}

您的程序很可能在打印"Second"后退出。shell会覆盖光标当前位置之后的所有内容,也就是文本"second"之后的所有内容。因为这是函数做的最后一件事。如果你在退出前添加了一个睡眠调用:

...
.execute(Print("Second"))
.unwrap();
std::thread::sleep(std::time::Duration::from_secs(5));

您将看到以下输出:

<lots of blank lines>
Second|    First

,其中|为光标的位置。程序退出后,光标后的所有文本被擦除(在zshbash上测试)。

您可以在退出前移动到下一行,从而使shell保留该行:

use std::io::stdout;
use crossterm::{cursor::*, style::*, terminal::*, ExecutableCommand};
fn main() {
let mut stdout = stdout();
stdout
.execute(Clear(ClearType::All))
.unwrap()
.execute(MoveTo(30, 20))
.unwrap()
.execute(Print("First"))
.unwrap()
.execute(MoveTo(20, 20))
.unwrap()
.execute(Print("Second"))
.unwrap()
.execute(MoveTo(0, 21))
.unwrap();
}

最新更新