NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2949 most downloaded on crates.io
Library for parsing terminal data
Last release 1 years ago
12 Jul 2025
Ships unpredictably
gaps range from 8 days to 3.4 years
Nearly every release is documented
notes for 32 of 32 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
32 releases · first in 2016
changelog and version bump
changelog and version bump
changelog and version bump
changelog and version bump
One column per quarter.
changelog and version bump
changelog and version bump
Parser::process_cb, which works the same as Parser::process except that
it calls callbacks during parsing when it finds a terminal escape which is
potentially useful but not something that affects the screen itself.Screen have been removed in favor of the new callback
API described above:
title_formattedtitle_difftitleicon_namebells_diffaudible_bell_countvisual_bell_counterrorsCell no longer implements Default.Screen no longer implements vte::Perform.Parser::set_size and Parser::set_scrollback have been moved to methods
on Screen, and Parser::screen_mut was added to get a mutable reference
to the screen.Cell::contents now returns &str instead of String, eliminating an
allocation in many cases. (Chris Olszewski, #14)Grid::visible_rows. (rezigned, #11)changelog and version bump
changelog and version bump
changelog and version bump
changelog and version bump
changelog and version bump
Screen::errors to track the number of parsing errors seen so farchangelog and version bump
changelog and version bump
changelog and version bump
changelog and version bump
changelog and version bump
changelog and version bump
Screen::cursor_state_formatted to draw the last character in a line
with the appropriate drawing attributes if it needs to redraw itchangelog and version bump
changelog and version bump
Screen::alternate_screen to determine if the alternate screen is in useScreen::row_wrapped to determine whether the row at the given index should
wrap its textScreen::cursor_state_formatted to set the cursor position and hidden state
(including internal state like the one-past-the-end state which isn't visible
in the return value of cursor_position)Screen::rows_formatted now outputs correct escape codes in some edge cases
at the beginning of a row when the previous row was wrappedScreen::state_formatted and Screen::state_diff convenience wrappers
Screen::state_formatted and Screen::state_diff convenience wrappersScreen::attributes_formatted now correctly resets previously set attributes
where necessaryScreen::attributes_diff, since I can't actually think of any
situation where it does a thing that makes sense.### Changed * Drop dependency on enumset
enumsetScreen::attributes_formatted and Screen::attributes_diff to retrieve the current state of the drawing attributes as escape sequences
Screen::attributes_formatted and Screen::attributes_diff to retrieve the
current state of the drawing attributes as escape sequencesScreen::fgcolor, Screen::bgcolor, Screen::bold, Screen::italic,
Screen::underline, and Screen::inverse to retrieve the current state of
the drawing attributes directlyImplementation of std::Write for Parser
std::io::Write for ParserScreen::contents_between, for returning the contents logically between two given cells (for things like clipboard selection)
Screen::contents_between, for returning the contents logically between two
given cells (for things like clipboard selection)\e[38:2:255:0:0m behaves the same way as
\e[38;2;255;0;0m)enumset to fix a dependency which fails to build### Changed * Bumped vte dep to 0.6.
vte dep to 0.6.Removed the unicode-normalization feature altogether - it turns out that it still has a couple edge cases where it causes incorrect behavior, and fixi
New (default-on) cargo feature unicode-normalization which can be disabled to disable normalizing cell contents to NFC - it's a pretty small edge case
unicode-normalization which can be disabled
to disable normalizing cell contents to NFC - it's a pretty small edge case,
and the data tables required to support it are quite large, which affects
size-sensitive targets like wasmFix output of contents_formatted and contents_diff when the cursor position ends at one past the end of a row.
contents_formatted and contents_diff when the cursor
position ends at one past the end of a row.Fix zero-width characters when the cursor is at the end of a row.
Add more debug logging for unhandled escape sequences.
debug log level.Screen::input_mode_formatted and Screen::input_mode_diff give escape codes to set the current terminal input modes.
Screen::input_mode_formatted and Screen::input_mode_diff give escape
codes to set the current terminal input modes.Screen::title_formatted and Screen::title_diff give escape codes to set
the terminal window title.Screen::bells_diff gives escape codes to trigger any audible or visual
bells which have been seen since the previous state.Screen::contents_diff no longer includes audible or visual bells (see
Screen::bells_diff instead).Screen::set_size now actually resizes when requested (previously the underlying storage was not being resized, leading to panics when writing outside
Screen::set_size now actually resizes when requested (previously the
underlying storage was not being resized, leading to panics when writing
outside of the original screen).Default impl for Parser which creates an 80x24 terminal with no scrollback.
Default impl for Parser which creates an 80x24 terminal with no
scrollback.Parser::screen_mut (and the pub &mut self methods on Screen). The few
things you can do to change the screen state directly are now exposed as
methods on Parser itself.Cell::contents now returns a String instead of a &str.Screen::check_audible_bell and Screen::check_visual_bell have been
replaced with Screen::audible_bell_count and Screen::visual_bell_count.
You should keep track of the "since the last method call" state yourself
instead of having the screen track it for you.Screen::contents_diff now includes audible and visual bells when
appropriate.Screen::fgcolor, Screen::bgcolor, Screen::bold, Screen::italic, Screen::underline, Screen::inverse, and Screen::alternate_screen: these are just imple
Screen::fgcolor, Screen::bgcolor, Screen::bold, Screen::italic,
Screen::underline, Screen::inverse, and Screen::alternate_screen:
these are just implementation details that people shouldn't need to care
about.Clearing cells now correctly sets the cell background color.
contents_formatted and
contents_diff.less, for instance).contents_formatted now also resets attributes at the start, like
contents_diff does.Make contents_formatted explicitly show the cursor when necessary, in case the cursor was previously hidden.
contents_formatted explicitly show the cursor when necessary, in case
the cursor was previously hidden.Screen::rows which is like Screen::contents except that it returns the data by row instead of all at once, and also allows you to restrict the region
Screen::rows which is like Screen::contents except that it returns the
data by row instead of all at once, and also allows you to restrict the
region returned to a subset of columns.Screen::rows_formatted which is like Screen::rows, but returns escape
sequences sufficient to draw the requested subset of each row.Screen::contents_diff and Screen::rows_diff which return escape sequences
sufficient to turn the visible state of one screen (or a subset of the screen
in the case of rows_diff) into another.contents_formatted now returns Vec<u8> instead of String.contents and contents_formatted now only allow getting the contents of
the entire screen rather than a subset (but see the entry for rows and
rows_formatted above).Cell::new, since there's not really any reason that this is useful for
someone to do from outside of the crate.contents_formatted now preserves the state of empty cells instead of
filling them with spaces.contents_formatted now ensures that the cursor has the correct hidden state
and location.contents_formatted now clears the screen before starting to draw.Reimplemented in pure safe rust, with a much more accurate parser
Fix returning uninit memory in get_string_formatted/get_string_plaintext
### Fixed * Fix builds
### Added * Initial release
Your coding agent can read these notes before it upgrades. Set up the MCP server →