#tty #raw #mode #stdin #stdio #reading #was

raw_tty

此包可用于安全地与 tty 模式进行交互,但最初是为了解决在使用原始模式与 /dev/tty 读取 stdin 数据时的问题而创建的。

1 个不稳定版本

0.1.0 2019 年 6 月 28 日

#717命令行界面

Download history 240/week @ 2024-03-14 299/week @ 2024-03-21 318/week @ 2024-03-28 310/week @ 2024-04-04 305/week @ 2024-04-11 216/week @ 2024-04-18 281/week @ 2024-04-25 255/week @ 2024-05-02 212/week @ 2024-05-09 225/week @ 2024-05-16 241/week @ 2024-05-23 347/week @ 2024-05-30 183/week @ 2024-06-06 271/week @ 2024-06-13 246/week @ 2024-06-20 154/week @ 2024-06-27

922 每月下载次数
用于 21 个包 (5 个直接使用)

Apache-2.0 OR MIT

14KB
178 代码行

raw_tty

此包可用于安全地与 tty 模式进行交互,但最初是为了解决在使用原始模式与 /dev/tty 读取 stdin 数据时的问题而创建的。

使用方法

原始模式

来自 termion 包的描述

管理原始模式。

原始模式是 TTY 可以具有的特定状态。这意味着

  1. 没有行缓冲(输入是按字节提供的)。
  2. 输入不会自动输出,而必须由程序员手动完成。
  3. 输出不会被规范化(例如,\n 表示“向下移动一行”,而不是“换行”)。

对于设计终端程序至关重要。

示例

use raw_tty::IntoRawMode;
use std::io::{Write, stdin, stdout};
                                                                                           
fn main() {
    let stdin = stdin().into_raw_mode().unwrap();
    let mut stdout = stdout();
                                                                                           
    write!(stdout, "Hey there.").unwrap();
}

使用 /dev/tty 的示例

use raw_tty::IntoRawMode;
use std::io::{self, Read, Write, stdin, stdout};
use std::fs;
                                                                                           
fn main() -> io::Result<()> {
    let mut tty = fs::OpenOptions::new().read(true).write(true).open("/dev/tty")?;
    // Can use the tty_input for keys while also reading stdin for data.
    let mut tty_input = tty.try_clone()?.into_raw_mode();
    let mut buffer = String::new();
    stdin().read_to_string(&mut buffer)?;
                                                                                           
    write!(tty, "Hey there.")
}

通用示例

use raw_tty::GuardMode;
use std::io::{self, Write, stdin, stdout};
                                                                                           
fn test_into_raw_mode() -> io::Result<()> {
    let mut stdin = stdin().guard_mode()?;
    stdin.set_raw_mode()?;
    let mut out = stdout();
                                                                                           
    out.write_all(b"this is a test, muahhahahah\r\n")?;
                                                                                           
    drop(out);
    Ok(())
}
                                                                                           
fn main() -> io::Result<()> {
    let mut stdout = stdout().guard_mode()?;
    stdout.modify_mode(|ios| /* do stuff with termios here */ ios)?;
                                                                                           
    // Have to use &* since TtyModeGuard only implements
    // deref, unlike RawReader which implements read specifically.
    // Otherwise, it wouldn't be recognized as `Write`able.
    write!(&mut *stdout, "Hey there.")
}
                                                                                           

依赖项

~2MB
~48K SLoC