1 个不稳定版本
0.1.0 | 2019 年 6 月 28 日 |
---|
#717 在 命令行界面
922 每月下载次数
用于 21 个包 (5 个直接使用)
14KB
178 代码行
raw_tty
此包可用于安全地与 tty 模式进行交互,但最初是为了解决在使用原始模式与 /dev/tty 读取 stdin 数据时的问题而创建的。
使用方法
原始模式
来自 termion
包的描述
管理原始模式。
原始模式是 TTY 可以具有的特定状态。这意味着
- 没有行缓冲(输入是按字节提供的)。
- 输入不会自动输出,而必须由程序员手动完成。
- 输出不会被规范化(例如,
\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