vt100
Library for parsing terminal data
0.16.2
10M downloads/mo
#3105 most downloaded on crates.io
doy/vt100-rust
What this package is like to depend on
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
0 releases in the last 12 months
see the full history below
Release timeline
32 releases · Apr 2016 to Jul 2025
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
Releases
latest 32-
0.16.212 Jul 2025Release notes
Open source →Fixed
- Fixed potential cursor out of bounds when using decrc after resizing. (#13)
-
0.16.110 Jul 2025 -
0.16.008 Jul 2025Release notes
Open source →Added
Parser::process_cb, which works the same asParser::processexcept that it calls callbacks during parsing when it finds a terminal escape which is potentially useful but not something that affects the screen itself.- Support for xterm window resize request escape codes, via the new callback mechanism.
- Support for dim formatting. (Daniel Faust, #9)
- Support for CNL/CPL escape codes. (Danny Weinberg, #10)
- Support for OSC 52 (clipboard manipulation).
Removed
- These methods on
Screenhave been removed in favor of the new callback API described above:title_formattedtitle_difftitleicon_namebells_diffaudible_bell_countvisual_bell_counterrors
- Additionally, unhandled escape sequences no longer log to STDERR; they instead call various callback methods which can be defined to log if desired.
Cellno longer implementsDefault.Screenno longer implementsvte::Perform.
Changed
Parser::set_sizeandParser::set_scrollbackhave been moved to methods onScreen, andParser::screen_mutwas added to get a mutable reference to the screen.Cell::contentsnow returns&strinstead ofString, eliminating an allocation in many cases. (Chris Olszewski, #14)
Fixed
- Fixed some issues with calculating scrollback offsets correctly in
Grid::visible_rows. (rezigned, #11)
-
0.15.205 Feb 2023 -
0.15.121 Dec 2021Release notes
Open source →Changed
- Removed a lot of unnecessary test data from the packaged crate, making downloads faster
-
0.15.015 Dec 2021Release notes
Open source →Added
Screen::errorsto track the number of parsing errors seen so far
Fixed
- No longer generate spurious diffs in some cases where the cursor is past the end of a row
- Fix restoring the cursor position when scrolled back
Changed
- Various internal refactorings
-
0.14.006 Dec 2021Release notes
Open source →Changed
- Unknown UTF-8 characters default to a width of 1, rather than 0 (except for control characters, as mentioned below)
Fixed
- Ignore C1 control characters rather than adding them to the cell data, since they are non-printable
-
0.13.205 Dec 2021Release notes
Open source →Changed
- Delay allocation of the alternate screen until it is used (saves a bit of memory in basic cases)
-
0.13.105 Dec 2021Release notes
Open source →Fixed
- Fixed various line wrapping state issues
- Fixed cursor positioning after writing zero width characters at the end of the line
- Fixed
Screen::cursor_state_formattedto draw the last character in a line with the appropriate drawing attributes if it needs to redraw it
-
0.13.018 Nov 2021Release notes
Open source →Added
Screen::alternate_screento determine if the alternate screen is in useScreen::row_wrappedto determine whether the row at the given index should wrap its textScreen::cursor_state_formattedto 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 ofcursor_position)
Fixed
Screen::rows_formattednow outputs correct escape codes in some edge cases at the beginning of a row when the previous row was wrapped- VPA escape sequence can no longer position the cursor off the screen
-
0.12.009 Mar 2021Release notes
Open source →Added
Screen::state_formattedandScreen::state_diffconvenience wrappers
Fixed
Screen::attributes_formattednow correctly resets previously set attributes where necessary
Removed
- Removed
Screen::attributes_diff, since I can't actually think of any situation where it does a thing that makes sense.
-
0.11.107 Mar 2021 -
0.11.007 Mar 2021Release notes
Open source →Added
Screen::attributes_formattedandScreen::attributes_diffto retrieve the current state of the drawing attributes as escape sequencesScreen::fgcolor,Screen::bgcolor,Screen::bold,Screen::italic,Screen::underline, andScreen::inverseto retrieve the current state of the drawing attributes directly
-
0.10.007 Mar 2021 -
0.9.006 Mar 2021Release notes
Open source →Added
Screen::contents_between, for returning the contents logically between two given cells (for things like clipboard selection)- Support SGR subparameters (so
\e[38:2:255:0:0mbehaves the same way as\e[38;2;255;0;0m)
Fixed
- Bump
enumsetto fix a dependency which fails to build
-
0.8.109 Feb 2020 -
0.8.007 Dec 2019Release notes
Open source →Removed
- Removed the unicode-normalization feature altogether - it turns out that it still has a couple edge cases where it causes incorrect behavior, and fixing those would be a lot more effort.
Fixed
- Fix a couple more end-of-line/wrapping bugs, especially around cursor positioning.
- Fix applying combining characters to wide characters.
- Ensure cells can't have contents with width zero (to avoid ambiguity). If an empty cell gets a combining character applied to it, default that cell to a (normal-width) space first.
-
0.7.023 Nov 2019Release notes
Open source →Added
- New (default-on) cargo feature
unicode-normalizationwhich 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 wasm
- New (default-on) cargo feature
-
0.6.320 Nov 2019Release notes
Open source →Fixed
- Fix output of
contents_formattedandcontents_diffwhen the cursor position ends at one past the end of a row. - If the cursor position is one past the end of a row, any char, even a combining char, needs to cause the cursor position to wrap.
- Fix output of
-
0.6.213 Nov 2019 -
0.6.113 Nov 2019Release notes
Open source →Added
- Add more debug logging for unhandled escape sequences.
Changed
- Unhandled escape sequence warnings are now at the
debuglog level.
-
0.6.013 Nov 2019Release notes
Open source →Added
Screen::input_mode_formattedandScreen::input_mode_diffgive escape codes to set the current terminal input modes.Screen::title_formattedandScreen::title_diffgive escape codes to set the terminal window title.Screen::bells_diffgives escape codes to trigger any audible or visual bells which have been seen since the previous state.
Changed
Screen::contents_diffno longer includes audible or visual bells (seeScreen::bells_diffinstead).
-
0.5.112 Nov 2019Release notes
Open source →Fixed
Screen::set_sizenow actually resizes when requested (previously the underlying storage was not being resized, leading to panics when writing outside of the original screen).
-
0.5.012 Nov 2019Release notes
Open source →Added
- Scrollback support.
Defaultimpl forParserwhich creates an 80x24 terminal with no scrollback.
Removed
Parser::screen_mut(and thepub&mut selfmethods onScreen). The few things you can do to change the screen state directly are now exposed as methods onParseritself.
Changed
Cell::contentsnow returns aStringinstead of a&str.Screen::check_audible_bellandScreen::check_visual_bellhave been replaced withScreen::audible_bell_countandScreen::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.
Fixed
- Lots of performance and output optimizations.
- Clearing a cell now sets all of that cell's attributes to the current attribute set, since different terminals render different things for an empty cell based on the attributes.
Screen::contents_diffnow includes audible and visual bells when appropriate.
-
0.4.008 Nov 2019Release notes
Open source →Removed
Screen::fgcolor,Screen::bgcolor,Screen::bold,Screen::italic,Screen::underline,Screen::inverse, andScreen::alternate_screen: these are just implementation details that people shouldn't need to care about.
Fixed
- Fixed cursor movement when the cursor position is already outside of an active scroll region.
-
0.3.208 Nov 2019Release notes
Open source →Fixed
- Clearing cells now correctly sets the cell background color.
- Fixed a couple bugs in wide character handling in
contents_formattedandcontents_diff. - Fixed RI when the cursor is at the top of the screen (fixes scrolling up in
less, for instance). - Fixed VPA incorrectly being clamped to the scroll region.
- Stop treating soft hyphen specially (as far as i can tell, no other terminals do this, and i'm not sure why i thought it was necessary to begin with).
contents_formattednow also resets attributes at the start, likecontents_diffdoes.
-
0.3.106 Nov 2019Release notes
Open source →Fixed
- Make
contents_formattedexplicitly show the cursor when necessary, in case the cursor was previously hidden.
- Make
-
0.3.006 Nov 2019Release notes
Open source →Added
Screen::rowswhich is likeScreen::contentsexcept 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_formattedwhich is likeScreen::rows, but returns escape sequences sufficient to draw the requested subset of each row.Screen::contents_diffandScreen::rows_diffwhich return escape sequences sufficient to turn the visible state of one screen (or a subset of the screen in the case ofrows_diff) into another.
Changed
- The screen is now exposed separately from the parser, and is cloneable.
contents_formattednow returnsVec<u8>instead ofString.contentsandcontents_formattednow only allow getting the contents of the entire screen rather than a subset (but see the entry forrowsandrows_formattedabove).
Removed
Cell::new, since there's not really any reason that this is useful for someone to do from outside of the crate.
Fixed
contents_formattednow preserves the state of empty cells instead of filling them with spaces.- We now clear the row wrapping state when the number of columns in the terminal is changed.
contents_formattednow ensures that the cursor has the correct hidden state and location.contents_formattednow clears the screen before starting to draw.
-
0.2.004 Nov 2019Release notes
Open source →Changed
- Reimplemented in pure safe rust, with a much more accurate parser
- A bunch of minor API tweaks, some backwards-incompatible
-
0.1.204 Jun 2016Release notes
Open source →Fixed
- Fix returning uninit memory in get_string_formatted/get_string_plaintext
- Handle emoji and zero width unicode characters properly
- Fix cursor positioning with regards to scroll regions and wrapping
- Fix parsing of (ignored) character set escapes
- Explicitly suppress status report escapes
-
0.1.128 Apr 2016 -
0.1.028 Apr 2016