gpt4 book ai didi

console - 在原始模式下使用 termion 时如何创建新行?

转载 作者:行者123 更新时间:2023-11-29 08:10:29 35 4
gpt4 key购买 nike

我正在使用 termion crate像事件监听器一样使用 termion::raw::IntoRawMode 捕获用户输入键。我无法在控制台中打印新行,因为 stdout 处于“原始模式”并且 \n 未被识别为新行。我不知道如何在调用 draw_user 方法时禁用原始模式,然后返回原始模式以再次监听按键事件。

之前第二行开头是空格,不知道为什么:

enter image description here

这是我的代码:

extern crate termion;

use termion::event::Key;
use termion::input::TermRead;
use termion::raw::IntoRawMode;
use std::io::{stdin, stdout, Write};

fn main() {
let mut x: u16 = 1;
let mut y: u16 = 1;
// Get the standard input stream.
let stdin = stdin();
// Get the standard output stream and go to raw mode.
let mut stdout = stdout().into_raw_mode().unwrap();
write!(
stdout,
"{}{}{}",
// Clear the screen.
termion::clear::All,
// Goto (1,1).
termion::cursor::Goto(1, 1),
// Hide the cursor.
termion::cursor::Hide
).unwrap();
// Flush stdout (i.e. make the output appear).
stdout.flush().unwrap();

for c in stdin.keys() {
// Clear the current line.
write!(
stdout,
"{}{}{}",
termion::cursor::Goto(1, 1),
termion::clear::CurrentLine,
termion::clear::BeforeCursor
).unwrap();

// Print the key we type...
match c.unwrap() {
// Exit.
Key::Char('q') => break,
Key::Ctrl('c') => break,
Key::Left => {
x -= 1;
draw_user(&mut x, &mut y);
}
Key::Right => {
x += 1;
draw_user(&mut x, &mut y);
}
Key::Up => {
y -= 1;
draw_user(&mut x, &mut y);
}
Key::Down => {
y += 1;
draw_user(&mut x, &mut y);
}
_ => println!(""),
}
stdout.flush().unwrap();
}
// Show the cursor again before we exit.
write!(
stdout,
"{}{}",
termion::cursor::Show,
termion::clear::AfterCursor
).unwrap();
// Flush again.
}

fn draw_user(x: &mut u16, y: &mut u16) {
let termsize = termion::terminal_size().ok();
let termwidth = termsize.map(|(w, _)| w - 10).unwrap();
let termheight = termsize.map(|(_, h)| h).unwrap();
if *x < 1 {
*x = 1;
}
if *x > termwidth {
*x = termwidth;
}
if *y < 1 {
*y = 1;
}
if *y > termheight {
*y = termheight;
}
//println!("x:{}, y:{}", *x, *y);
for h in 1..termheight + 1 {
for w in 1..termwidth + 1 {
//print!("w:{}",w);
if h == *y && w == *x {
print!("☺");
} else {
print!("*");
}
}
println!("");
}
}

最佳答案

严格来说换行符\n的意思是“转到同一位置的下一行”。为了从行首开始,您需要添加一个回车\r,这意味着“转到当前行的开头”。这就是 Windows 中的文本文件使用 \r\n 组合来标记行尾的原因。 Unix 和 MacOS 认为这种区分对于计算机文件没有意义,并且在空间非常宝贵的时候一次多占用一个字节,因此他们决定在文本文件中使用单个字符。出于同样的原因,计算机控制台有两种模式,一种是在收到换行符时自动添加回车符(以减少控制台通过串行线连接时传输的数据量),另一种是严格应用回车符它们被发送(用于细粒度控制)。由于调用了stdout().into_raw_mode(),所以是第二种模式,需要手动输出回车。

此行为继承自旧式机械打字机,“换行”是将纸张前进一行的键,“回车”是允许手动将马车移回起始位置的 handle 。

关于console - 在原始模式下使用 termion 时如何创建新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48494508/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com