1 个稳定版本
使用旧的 Rust 2015
1.6.0 | 2021年2月10日 |
---|
#434 in 命令行界面
68KB
1.5K SLoC
文档 | 示例 | 变更日志 | 教程 |
---|
Termion 是一个用于低级处理、操作和读取终端信息的纯Rust无绑定库。它为 Termbox 提供了一个功能齐全的替代方案。
Termion 旨在简单而富有表现力。它是无绑定的,这意味着它不是一个其他库(例如 ncurses 或 termbox)的前端,而是一个直接与 TTY 通信的独立库。
Termion 非常方便,因为它完全覆盖了基本的 TTY 功能,提供了一致的 API。Termion 比较低级,仅包含与幕后实际发生的事情相匹配的抽象。对于更高级的用法,请参阅 inquirer-rs,它使用 Termion 作为后端。
Termion 为用户生成转义和 API 调用。这使得使用转义更加简洁。
支持 Redox、Mac OS X、BSD 和 Linux(或更一般地,ANSI 终端)。
关于稳定性的说明
此 crate 是稳定的。
Cargo.toml
[dependencies]
termion = "*"
0.1.0 到 1.0.0 指南
以下示例表格展示了如何将 Termion 转换为新的大版本。
0.1.0 | 1.0.0 |
---|---|
使用 termion::IntoRawMode |
使用 termion::raw::IntoRawMode |
使用 termion::TermRead |
使用 termion::input::TermRead |
stdout.color(color::Red); |
write!(stdout,"{}", color::Fg(color::Red)); |
stdout.color_bg(color::Red); |
write!(stdout,"{}", color::Bg(color::Red)); |
stdout.goto(x,y); |
write!(stdout,"{}", cursor::Goto(x,y)); |
color::rgb(r,g,b); |
color::Rgb(r, g, b) (truecolor) |
x.with_mouse() |
MouseTerminal::from(x) |
特性
- 原始模式。
- 真彩色。
- 256色模式。
- 光标移动。
- 文本格式化。
- 控制台大小。
- 仅 TTY 流。
- 控制序列。
- Termios控制。
- 密码输入。
- Redox支持。
- 安全的
isatty
包装器。 - 无恐慌的错误处理。
- 特殊键事件(修饰符、特殊键等)。
- 无分配。
- 异步键盘事件。
- 鼠标输入。
- 经过仔细测试。
- 每个项目都有详细文档。
等等。
示例
样式和颜色。
extern crate termion;
use termion::{color, style};
use std::io;
fn main() {
println!("{}Red", color::Fg(color::Red));
println!("{}Blue", color::Fg(color::Blue));
println!("{}Blue'n'Bold{}", style::Bold, style::Reset);
println!("{}Just plain italic", style::Italic);
}
移动光标
extern crate termion;
fn main() {
print!("{}{}Stuff", termion::clear::All, termion::cursor::Goto(1, 1));
}
鼠标
extern crate termion;
use termion::event::{Key, Event, MouseEvent};
use termion::input::{TermRead, MouseTerminal};
use termion::raw::IntoRawMode;
use std::io::{Write, stdout, stdin};
fn main() {
let stdin = stdin();
let mut stdout = MouseTerminal::from(stdout().into_raw_mode().unwrap());
write!(stdout, "{}{}q to exit. Click, click, click!", termion::clear::All, termion::cursor::Goto(1, 1)).unwrap();
stdout.flush().unwrap();
for c in stdin.events() {
let evt = c.unwrap();
match evt {
Event::Key(Key::Char('q')) => break,
Event::Mouse(me) => {
match me {
MouseEvent::Press(_, x, y) => {
write!(stdout, "{}x", termion::cursor::Goto(x, y)).unwrap();
},
_ => (),
}
}
_ => {}
}
stdout.flush().unwrap();
}
}
读取密码
extern crate termion;
use termion::input::TermRead;
use std::io::{Write, stdout, stdin};
fn main() {
let stdout = stdout();
let mut stdout = stdout.lock();
let stdin = stdin();
let mut stdin = stdin.lock();
stdout.write_all(b"password: ").unwrap();
stdout.flush().unwrap();
let pass = stdin.read_passwd(&mut stdout);
if let Ok(Some(pass)) = pass {
stdout.write_all(pass.as_bytes()).unwrap();
stdout.write_all(b"\n").unwrap();
} else {
stdout.write_all(b"Error\n").unwrap();
}
}
用法
请参阅examples/
,以及文档,可以使用cargo doc
渲染。
更多完整示例,请参阅我使用termion为Redox制作的扫雷实现。
许可证
MIT/X11。
依赖项
~22-270KB