NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2781 most downloaded on crates.io
A bindless library for manipulating terminals.
Last release 10 months ago
21 Nov 2025
Release timing varies
gaps range from 5 weeks to 1.7 years
Some releases are documented
notes for 9 of 36 stable releases
1 version withdrawn
withdrawn after publishing
10 years old
37 releases · first in 2016
Drop Redox-specific code, now that it supports all libc functions
Add helpers to get terminal size from file descriptor
One column per quarter.
Remove debug printing when parsing CSI sequences
Remove unused code and update dependencies.
Remove unused code and update dependencies.
Fixes an error check in Ctrl-Arrow code, no difference in behavior. Cleaned up examples.
Fixes an error check in Ctrl-Arrow code, no difference in behavior. Cleaned up examples.
Fixes a regression in function keys F5 and above.
Fixes a regression in function keys F5 and above.
4.0.0 adds support for horizontal scrolling when working with MouseTerminal.
4.0.0 adds support for horizontal scrolling when working with MouseTerminal.
A change is only necessary if you were matching on all variants of the MouseEvent enum without a wildcard.
In this case, you need to either handle the two new variants, MouseLeft and MouseRight, or add a wildcard.
v3 release improves raw terminal API and enables support of any TTY target.
v3 release improves raw terminal API and enables support of any TTY target.
Changes are only required if you were using IntoRawMode on generic terminals W: Write. Now, terminal
is also required to implement AsFd trait. So replacing generic bounds with W: Write + AsFd
should be sufficient.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
This turns out to be very convinient, but quite critical whenever making breaking changes (that is, major semver bumps).
Termion 1.0.0 is out! This release is breaking, which is also the reason for the semver bump.
Lot'ta goodies.
MouseTerminal struct, you can get mouse events (thanks to IGI-111).Rgb struct.Display instead of custom traits.isatty wrapper: termion::is_tty takes any T: AsRawFd and gives you a bool.This sample table gives an idea of how to go bu converting to the new major version of Termion.
| 0.1.0 | 1.0.0 |
|---|---|
use termion::IntoRawMode |
use termion::raw::IntoRawMode |
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) |
#![feature(step_by)]
extern crate termion;
use termion::event::Key;
use termion::input::TermRead;
use termion::raw::IntoRawMode;
use std::io::{Write, stdout, stdin};
fn rainbow<W: Write>(stdout: &mut W, blue: u8) {
write!(stdout, "{}{}", termion::cursor::Goto(1, 1), termion::clear::All).unwrap();
for red in (0..255).step_by(8 as u8) {
for green in (0..255).step_by(4) {
write!(stdout, "{} ", termion::color::Bg(termion::color::Rgb(red, green, blue))).unwrap();
}
write!(stdout, "\n\r").unwrap();
}
writeln!(stdout, "{}b = {}", termion::style::Reset, blue).unwrap();
}
fn main() {
let stdin = stdin();
let mut stdout = stdout().into_raw_mode().unwrap();
writeln!(stdout, "{}{}{}Use the arrow keys to change the blue in the rainbow.",
termion::clear::All,
termion::cursor::Goto(1, 1),
termion::cursor::Hide).unwrap();
let mut blue = 172u8;
for c in stdin.keys() {
match c.unwrap() {
Key::Up => {
blue = blue.saturating_add(4);
rainbow(&mut stdout, blue);
},
Key::Down => {
blue = blue.saturating_sub(4);
rainbow(&mut stdout, blue);
},
Key::Char('q') => break,
_ => {},
}
stdout.flush().unwrap();
}
write!(stdout, "{}", termion::cursor::Show).unwrap();
}
Your coding agent can read these notes before it upgrades. Set up the MCP server →