NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2974 most downloaded on crates.io
A fast and robust text rope for Rust
Last release 1 years ago
02 Aug 2025
Release timing varies
gaps range from 4 weeks to 12 months
Most releases are documented
notes for 30 of 36 stable releases
3 versions withdrawn
withdrawn after publishing
12 years old
44 releases · first in 2015
Nothing published for this version
Nothing published for this version
Prep for 2.0.0-alpha.2 release.
Prep for 2.0.0-alpha.2 release.
One column per quarter.
Update Cargo.toml in preparation for alpha release.
Update Cargo.toml in preparation for alpha release.
Prepare for release v1.6.1.
Prepare for release v1.6.1.
Prep for release v1.6.0.
Prep for release v1.6.0.
is_instance() method, which checks if two ropes are same-memory instances of each other.Lines iterator for an empty rope or rope slice.Prep for release v1.5.1.
Prep for release v1.5.1.
Lines iterator, thanks to @pascalkuthe (PR #70).Hash impl was incorrect, due to making incorrect assumptions about the guaranteed behavior of Hashers. This didn't cause any problems with Rust's default hasher, but was incorrect in the general case.len_lines() could give incorrect counts on RopeSlices that split CRLF pairs.Special early release, mainly to accomodate the Helix project. It is not recommended to use this release outside of Helix.
Prep for release v1.5.0.
Prep for release v1.5.0.
reversed() method for Ropey's iterators. This is the same as reverse() except instead of mutating in-place, it consumes the iterator and returns it reversed. This is more convenient when chaining iterator method calls.simd cargo feature flag. It's enabled by default, but can be disabled to use only scalar code (no simd intrinsics).repr(C).Prep for release v1.4.1.
Prep for release v1.4.1.
Prep for release v1.4.0.
Prep for release v1.4.0.
byte_slice() and get_byte_slice() methods to Rope and RopeSlice to slice by byte index instead of char index. This can allow optimizations in client code in some cases.cr_lines and unicode_lines feature flags to the crate, to manage what line endings are recognized and tracked. This allows, for example, building Ropey to only recognize line feed as a line break. unicode_lines is on by default, and corresponds to the original behavior.std::hash::Hash for Rope and RopeSlice.str_utils module out into a separate crate, str_indices. The str_utils module still exists, but is now mostly just a re-export of the new crate.Prepare for release v1.3.2.
Prepare for release v1.3.2.
RopeSlice methods. They were unintentionally strict.Prep for release v1.3.1.
Prep for release v1.3.1.
Rope::append() to append many small ropes together.RopeSlices occasionally failing to convert to a &str with RopeSlice::as_str().Added non-panicking versions of all methods on Rope and RopeSlice.
Rope and RopeSlice.prev() and next().Rope and RopeSlice can now convert between char indices and utf16 code unit indices. This useful when interacting with external APIs that use utf16 co
Rope and RopeSlice can now convert between char indices and utf16 code unit indices. This useful when interacting with external APIs that use utf16 code units as their text indexing scheme.Iterators can now be created directly to start at any position in the Rope or RopeSlice.
Rope or RopeSlice.prev() method.Clone and Debug traits.Bytes, Chars, and Lines iterators now implement ExactSizeIterator.Chunks iterator no longer yields empty chunks, for example if the Rope or RopeSlice it was created from is also empty.Converted a lot of unsafe code to safe code, with minimal performance impact.
Implemented Eq, Ord, and PartialOrd traits for Rope and RopeSlice.
Eq, Ord, and PartialOrd traits for Rope and RopeSlice.Turns out the previous Line iterator bug fix introduced a different bug. Fixed!
The Lines iterator would sometimes emit an extra blank line when created from a small rope slice.
write_to() convenience method could potentially write only part of the rope, without any error indication.Minor performance improvements to a few methods on Rope and RopeSlice.
Rope and RopeSlice.Rope::byte() for fetching individual bytes by index.Rope and RopeSlice, in the form of From impls.Rope::to_string(), RopeSlice::from_str(), RopeSlice::to_string(), and RopeSlice::to_rope() in favor of From impls that do the same thing.Minor across-the-board speedups by using SIMD better.
Significant speedups across the board by using SIMD for index conversions.
File loading is slightly faster.
Increased Rope::insert() speed by roughly 1.4x for small insertion strings.
Building new ropes via RopeBuilder or Rope::from_str() is now about 15% faster.
The chunk fetching methods on slices returned bogus starting char indices.
RopeSlices have been given a major speed boost for small slices: for contiguous slices of text in memory, they will simply point at the text without a
RopeSlices have been given a major speed boost for small slices: for contiguous slices of text in memory, they will simply point at the text without any tree structure. This makes it feasible to use RopeSlices to yield e.g. graphemes or words, even in tight inner loops, while maintaining performance.Ropes and RopeSlices, via byte or char index. The chunk containing the given byte or char will be returned along with offset information.Ropes and RopeSlices, you can now convert between any of: byte, char, and line indices.RopeSlices from string slices. This isn't terribly useful when using Ropey's standard API's, but it allows for much more efficient implementations of things like custom iterators.RopeSlices text as a contiguous string slice when possible. This is useful for client code to be able to make a fast-path branch for small slices that happen to be contiguous. Like the above item, this can result in significant performance gains for certain use-cases.examples directory of the repo for working implementations.Added a new Rope::insert_char() convenience method for inserting a single Unicode scalar value.
Rope::insert_char() convenience method for inserting a single Unicode scalar value.0.6.0 and 0.6.1 had an API regression where you now had to specify the segmenter in the type parameters of RopeSlice and the various iterators.
No functional changes. Just updated the readme to render properly on crates.io.
Grapheme segmentation can now be customized if needed.
Rope::remove(), Rope::slice(), and RopeSlice::slice() now take range syntax to specify
their ranges.Added a design overview document to the repo, explaining Ropey's design. Mainly targeted at potential contributors.
PartialEq impls. Rope and RopeSlice can now be compared for equality with not just &str, but also String and Cow<str>.Rope::char(), which fetches a single Unicode scalar value as a char, is now several times faster.Comparing two empty ropes for equality would panic.
Rope::remove() didn't always merge graphemes between chunks properly.
Rope::remove() got a nice speed boost.Massive speed boost for small insertions: between %40 - %50 faster.
Rope::from_str() now only uses stack memory for strings smaller than ~3MB. (Aside from the resulting Rope itself, of course.)There were ocassionally unnecessary heap allocations that took up a small amount of extra space in the rope.
Calling Rope::line_to_char() with a line index one-past-the-end would panic. This wasn't consistent with other indexing, and has been fixed and now re
Rope::line_to_char() with a line index one-past-the-end would panic. This wasn't consistent with other indexing, and has been fixed and now returns the one-past-the-end char index.Rope::remove() code that were put in during debugging. They were causing significant slow downs for removes.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
Your coding agent can read these notes before it upgrades. Set up the MCP server →