зеркало из
https://github.com/glebtv/tui-textarea.git
synced 2026-08-28 11:36:17 +03:00
* chore: migrate to Rust 2024 edition and bump to v0.9.2 - Bump edition to 2024 and rust-version to 1.85.0 - Replace f64::log10 with usize::ilog10 in num_digits - Fix clippy lints surfaced by edition bump: repeat_n, derived Default, then_some - Expand watch-check and watch-test aliases to cover all feature paths (crossterm_0_28, no-backend, tuirs variants, serde, arbitrary) - Expand CI test and clippy workflows to full 6/8-entry feature matrices including termion on Ubuntu - Apply rustfmt import reordering from edition 2024 rules * fix: revert turis linux checks
32 KiB
32 KiB
v0.9.2 - 2026-02-19
- Migrate to Rust 2024 edition; bump
rust-versionto1.85.0. - Replace floating-point
num_digitswithusize::ilog10for correctness on large values. - Expand
watch-checkalias to covercrossterm_0_28,no-backend,tuirs-crossterm,tuirs-no-backend,serde, andarbitraryfeature paths. - Expand
watch-testalias to covercrossterm_0_28,tuirs-crossterm,serde, andarbitraryfeatures. - Expand CI test and clippy workflows to full feature matrix including
termionandtuirs-termionon Ubuntu.
[Changes][v0.9.2]
v0.9.1 - 2026-02-18
- Fix panic on
Ctrl+U/undo()after oversizeddelete_str()(includingselect_all() + delete_str(usize::MAX)on empty buffers). - Fix root cause by clamping exhausted
delete_str()ranges to EOF so history never stores out-of-bounds rows. - Add defensive cursor clamping in
undo()/redo()when restoring from history. - Add regression tests for the reported panic paths and invalid-history cursor restore edge cases.
v0.9.0 - 2026-02-18
- Add opt-in soft-wrap modes via
WrapMode::{None, Word, Glyph, WordOrGlyph}andTextArea::set_wrap_mode. - Add Unicode-aware wrapped rendering with logical-to-visual row mapping.
- Keep backward-compatible behavior in
WrapMode::None(existing horizontal scrolling path). - Make wrapped width calculations tab-aware to prevent hidden text on lines containing
\t. - Fix wrapped continuation rendering for cursor-line style and selection boundaries.
- Add comprehensive wrap regression tests for long text, newlines, tabs, tiny widths, and wrapped highlight behavior.
v0.8.0 - 2026-02-18
- Add
TextArea::clear()API to clear all text content with undo/redo coverage. (upstream PR #113) - Add custom highlight ranges with priority via
TextArea::custom_highlight()andTextArea::clear_custom_highlight(). (upstream PR #93) - Fix horizontal scrolling with wide Unicode characters by using display width for cursor column calculations. (upstream PR #94)
- Treat
_as part of words for word navigation/edit operations. (upstream PR #98) - Fix editor examples to preserve modified state across multiple inputs. (upstream PR #100)
- Use
portable-atomicfor viewport atomics to improve target compatibility. (upstream PR #111) - Fix README wording for line-number default behavior. (upstream PR #116)
v0.7.1 - 2026-02-18
- Update compatibility for ratatui v0.30.0.
- Publish maintained fork under
srothgan/tui-textarea. - Rename published crate to
tui-textarea-2. - Add CI/collaboration baseline (workflows, templates, contributing guide).
v0.7.0 - 2024-10-22
v0.6.1 - 2024-08-08
- Add
TextArea::selection_rangemethod to get the range of the current selection. Please read the document for more details. (#81, thanks @achristmascarl)let mut textarea = TextArea::from(["aaa"]); // It returns `None` when the text selection is not ongoing assert_eq!(textarea.selection_range(), None); textarea.start_selection(); assert_eq!(textarea.selection_range(), Some(((0, 0), (0, 0)))); textarea.move_cursor(CursorMove::Forward); assert_eq!(textarea.selection_range(), Some(((0, 0), (0, 1)))); // The first element of the pair is always smaller than the second one. textarea.start_selection(); textarea.move_cursor(CursorMove::Back); assert_eq!(textarea.selection_range(), Some(((0, 0), (0, 1)))); - Fix depending on the incorrect version of termion crate when
tuirs-termionfeature is enabled. Since tui crate depends on older version of termion crate v1.5.6, tui-textarea should depend on the same version but actually it depended on the latest version v4.0.0.- If you use tui-textarea with tui crate and termion crate, please ensure that your project also depends on termion v1.5. Otherwise your project accidentally depends on multiple versions of termion crate.
v0.6.0 - 2024-08-07
- BREAKING: Update ratatui crate dependency from v0.27 to v0.28.
- BREAKING: Update crossterm crate dependency from v0.27 to v0.28 because ratatui crate depends on the new version.
- Note: If you use tui crate, crossterm crate dependency remains at v0.25.
v0.5.3 - 2024-08-03
&TextAreanow implementsWidgettrait. (#78)- Now the reference can be passed to
ratatui::terminal::Frame::render_widgetmethod call directly.// v0.5.2 or earlier f.render_widget(textarea.widget(), rect); // v0.5.3 or later f.render_widget(&textarea, rect); - This means that
TextArea::widgetmethod is no longer necessary. To maintain the compatibility the method is not removed but using it starts to report a deprecation warning from v0.5.3.
- Now the reference can be passed to
- Fix a cursor can leave the viewport on horizontal scroll when line number is displayed. (#77)
- Support some key combinations added at termion v4 for
termionfeature. (#68)termion::event::Key::CtrlLefttermion::event::Key::CtrlRighttermion::event::Key::CtrlUptermion::event::Key::CtrlDowntermion::event::Key::CtrlHometermion::event::Key::CtrlEndtermion::event::Key::AltLefttermion::event::Key::AltRighttermion::event::Key::AltUptermion::event::Key::AltDowntermion::event::Key::ShiftLefttermion::event::Key::ShiftRighttermion::event::Key::ShiftUptermion::event::Key::ShiftDown
- Fix the border color is not applied in
single_lineexample. (#79, thanks @fmorroni) - Improve
vimexample's Vim emulation.- Fix the range of text selection on
emapping in operator-pending mode. (#76) - Fix the text selection on
y,d,cmappings in visual mode is not inclusive.
- Fix the range of text selection on
v0.5.2 - 2024-08-01
- Do not hide a cursor when a placeholder text is printed. (#73, thanks @kyu08)
- Add
CursorMove::WordEndwhich moves a cursor to the end of the next word inclusively. (#75, thanks @achristmascarl)- The behavior is similar to
emapping of Vim in normal mode.vimexample implements the mapping for demonstration.
- The behavior is similar to
v0.5.1 - 2024-07-12
- Add
serdeoptional feature. When it is enabled, some types support the serialization/deserialization with serde crate. See the document for more details. (#62, thanks @cestef)use tui_textarea::Input; let json = r#" { "key": { "Char": "a" }, "ctrl": true, "alt": false, "shift": true } "#; let input: Input = serde_json::from_str(json).unwrap(); println!("{input}"); // Input { // key: Key::Char('a'), // ctrl: true, // alt: false, // shift: true, // }
v0.5.0 - 2024-07-07
This is a maintenance release for supporting recent versions of ratatui crate.
- BREAKING CHANGE: Bump the minimal versions of the following dependencies. If you're depending on the crates older than the following versions, please upgrade them before upgrading this crate. (#69, thanks @joshka)
- ratatui 0.27.0
- termion 0.4.0
- termwiz 0.22.0
YankTextnow implementsDisplayinstead ofToStringdirectly. SinceToStringis implemented for any types which implementDisplay, this is not a breaking change.
v0.4.0 - 2023-11-19
This release introduces text selection feature. The internal implementation was largely refactored to handle multi-line text for this feature. As the side effect, several APIs now can handle a multi-line string (string contains newlines) correctly.
- Text selection has been implemented. (#6, #45, thanks @pm100 for the first implementation)
- Default key shortcuts now support text selection. When moving the cursor with pressing a shift key, a textarea starts to select the text under the cursor. The selected text can be copied/cut by the following key shortcuts. Modifying some text while text selection deletes the selected text. Doing undo/redo cancels the ongoing text selection.
Mappings Description Ctrl+C,CopyCopy selected text Ctrl+X,CutCut selected text - The following APIs are added
TextArea::copykeeps the selected text as a yanked textTextArea::cutdeletes the selected text and keeps it as a yanked textTextArea::start_selectionstarts text selectionTextArea::cancel_selectioncancels text selectionTextArea::select_allselects the entire textTextArea::set_selection_stylesets the style of selected textTextArea::selection_stylereturns the current style for selected text
- Default key shortcuts now support text selection. When moving the cursor with pressing a shift key, a textarea starts to select the text under the cursor. The selected text can be copied/cut by the following key shortcuts. Modifying some text while text selection deletes the selected text. Doing undo/redo cancels the ongoing text selection.
- BREAKING CHANGE:
colargument ofTextArea::delete_strwas removed. Instead, current cursor position is used. This change is for aligninig the API signature withTextArea::insert_str.- Before:
fn delete_str(&mut self, col: usize, chars: usize) -> bool - After:
fn delete_str(&mut self, chars: usize) -> bool
- Before:
- BREAKING CHANGE:
TextArea::yank_textnow returnsStringinstead of&str. This change was caused to handle yanking multiple-line text correctly.- Before:
fn yank_text<'a>(&'a self) -> &'a str - After:
fn yank_text(&self) -> String
- Before:
- BREAKING CHANGE:
shiftfield was added toInputto support the Shift modifier key. - Add
Key::Paste,Key::Copy, andKey::Cut. They are only supported by termwiz crate. - Fix
TextArea::insert_chardidn't handle newline ('\n') correctly. - Allow passing multi-line string to
TextArea::insert_str. A string joined with newlines is inserted as multiple lines correctly. - Allow
TextArea::delete_strto delete multiple lines (#42). - Fix
TextArea::set_yank_textdidn't handle multiple lines correctly. - Fix
editorexample didn't handle terminal raw mode on Windows (#44). modalexample was rebuilt asvimexample. It implements Vim emulation to some level as a state machine. It adds the support for very basic visual mode and operator-pending mode. This example aims to show how to implement complicated and stateful key shortcuts.- Add many unit test cases. Several edge cases found by them were fixed. The code coverage of this crate reached 90%.
v0.3.1 - 2023-11-04
- Fix the width of rendered tab character (
\t) is wrong in some cases when hard tab is enabled byTextArea::set_hard_tab_indent(#43). - Fix key inputs are doubled on Windows when converting from
crossterm::event::KeyEventintotui_textarea::Input. Note that the conversion fromcrossterm::event::Eventintotui_textarea::Inputdoes not have this issue. - Support converting the following type instances into
tui_textarea::Input.crossterm::event::KeyCodecrossterm::event::KeyEventcrossterm::event::MouseEventcrossterm::event::MouseKindtermwiz::input::KeyCodetermwiz::input::KeyEventtermion::event::MouseButton
- Fix typos in API document and error message (#40, thanks @fritzrehde).
v0.3.0 - 2023-10-24
- BREAKING CHANGE: Enable ratatui support by default instead of inactive tui-rs.
ratatui-prefix is removed from allratatui-*features.crossterm,termion, andtermwizfeatures are for ratatui:# ratatui with crossterm backend tui-textarea = "0.3" # ratatui with termwiz backend tui-textarea = { version = "0.3", features = ["termwiz"], default-features = false } # ratatui with termion backend tui-textarea = { version = "0.3", features = ["termion"], default-features = false }- Instead, features for tui-rs support are now prefixed with
tuirs-:# tui-rs with crossterm backend tui-textarea = { version = "0.3", features = ["tuirs-crossterm"], default-features = false } # Use proper version of crossterm crossterm = "0.2.5" - Examples and documents are now implemented and described with ratatui by default
- BREAKING CHANGE: Rename
your-backendfeatures tono-backend. You need to update the feature names if you're using tui-textarea with your own backend. - Relax the restriction of ratatui crate dependency from
0.23.0to>=0.23.0, <1, which means 'v0.23.0 or later and earlier than v1'. The latest version of ratatui (v0.24.0) now works with tui-textarea (#36). - Enable
termwizandtermionfeatures on generating the API document. APIs to convert from input events of termwiz/termion totui_textarea::Inputare now listed in the document.
Previous Backend features table (v0.2.4):
| crossterm | termion | termwiz | Your own backend | |
|---|---|---|---|---|
| tui-rs | crossterm (enabled by default) |
termion |
N/A | your-backend |
| ratatui | ratatui-crossterm |
ratatui-termion |
ratatui-termwiz |
ratatui-your-backend |
New backend features table (v0.3.0):
| crossterm | termion | termwiz | Your own backend | |
|---|---|---|---|---|
| tui-rs | tuirs-crossterm |
tuirs-termion |
N/A | tuirs-no-backend |
| ratatui | crossterm (enabled by default) |
termion |
termwiz |
no-backend |
v0.2.4 - 2023-10-21
- Support the ratatui's termwiz backend.
ratatui-termwizfeature was newly added for this.- Add the following dependencies in your Cargo.toml to use termwiz support.
termwiz = "0.20" ratatui = { version = "0.23", default-features = false, features = ["termwiz"] } tui-textarea = { version = "0.2.4", default-features = false, features = ["ratatui-termwiz"] } - Read and run the
termwizexample to know the API usage.cargo run --example termwiz --no-default-features --features=ratatui-termwiz
- Add the following dependencies in your Cargo.toml to use termwiz support.
- Fix calculating the length of tab character when the line contains wide characters. Now the length of wide characters like あ are calculated as 2 correctly.
v0.2.3 - 2023-10-20
- Add APIs to mask text with a character (#32, thanks @pm100).
TextArea::set_mask_char,TextArea::clear_mask_char,TextArea::mask_charare added. See the documentation for more details.- The
passwordexample was added to show the usage.
- Fix the length of displayed hard tab in text (#33, thanks @pm100).
v0.2.2 - 2023-10-01
Very small patch release only for fixing the build failure on docs.rs. No implementation has been changed.
v0.2.1 - 2023-10-01
- Add the support for ratatui crate in addition to tui-rs. The ratatui crate is a community fork of inactive tui-rs crate. (#12)
- The latest version of ratatui v0.23 is supported.
- tui-textarea still uses tui-rs by default to keep the compatibility at this moment. ratatui users explicitly need to set features for it. See the installation document for the features matrix. For example, when you want to use ratatui and crossterm, write the following in your
Cargo.toml:[dependencies] ratatui = "*" tui-textarea = { version = "*", features = ["ratatui-crossterm"], default-features = false } - tui-rs is no longer maintained and the repository was archived. At the next minor version bump, tui-textarea will switch the default features from tui-rs to ratatui. If you use tui-rs, I recommend to switch your dependency to ratatui.
- Examples with ratatui are added to the
examplesdirectory. For example, the following command runs ratatui version ofeditorexample:cargo run --example ratatui_editor --no-default-features --features=ratatui-crossterm,search file.txt
- Add support for the placeholder text which is rendered when no text is input in the textarea. (#16, thanks @pm100)
- Use
TextArea::set_placeholder_textto set the text. To change the text style, useTextArea::set_placeholder_style. See the API documentation for more details. popup_placeholderexample was added to show the usage.cargo run --example popup_placeholder
- Use
- Derive
Debugtrait forTextAreastruct. (#23) - Fix a key input is received twice on Windows. (#17, thanks @pm100)
v0.2.0 - 2022-10-18
- Add
Scrollingenum to provide more flexible scrolling viaTextArea::scrollmethod. It has the following enum variants.- BREAKING
Scrolling::Deltascrolls the textarea by given rows and cols. This variant can be converted from(i16, i16)so migrating from v0.1.6 is very easy.let rows: i16 = ...; let cols: i16 = ...; // Until v0.1.6 textarea.scroll(rows, cols); // Since v0.2.0 textarea.scroll((rows, cols)); Scrolling::PageDownandScrolling::PageUpscroll the textarea by page.Scrolling::HalfPageDownandScrolling::HalfPageUpscroll the textarea by half-page.
- BREAKING
- Update default key mappings handled by
TextArea::inputmethod.- BREAKING Change
PageDownandPageUpkeys to scroll down/up the textarea by page since v0.2.0. Until v0.1.6, it moved the cursor down/up by one paragraph. - Add
Ctrl+VandAlt+Vkeys to scroll down/up the textarea by page as Emacs-like key mappings. - Add
Alt+]andAlt+[keys to move the cursor down/up by one paragraph as Emacs-like key mappings.
- BREAKING Change
- BREAKING Add
#[non_exhaustive]attribute toCursorMoveenum. This is because more cursor move variations may be added in the future. - Fix panic when the max history size is zero (which means the edit history is disabled). (#4)
v0.1.6 - 2022-09-28
- Support mouse scroll. (#2)
- Handle mouse events for both
crosstermandtermionbackends. TextArea::scrollmethod was added.Key::MouseScrollUpandKey::MouseScrollDownvirtual keys are added toKeyenum so that custom backends can support mouse scrolling.CursorMove::InViewportvariant was added toCursorMoveenum, which ensures the cursor to be within the viewport.
- Handle mouse events for both
- Add
TextArea::alignmentandTextArea::set_alignmentto set the text alignment of textarea. Note that right and center alignments don't work well with line number so callingTextArea::set_alignmentwith them automatically disables it. (#3, thanks @Volkalex28)
- Set
rust-versionto 1.56.1 inCargo.tomlto show MSRV explicitly.
v0.1.5 - 2022-07-18
- Improve performance to render a textarea widget. When number of lines increases, now rendering lines is about 2~8x faster according to our benchmark suites. See the commit for more details of the benchmark results. This was archived by managing a vertical scroll position by ourselves instead of scroll handling by
Paragraph. Previously, a cost of rendering lines wasO(n)wherenwas number of all lines. Now the cost isO(1). - Implement
CloneforTextAreaso that textarea instances can be copied easily. It is useful when you create multiple textarea instances with the same configuration. Create a firstTextAreainstance with configuring blocks and styles, then simply clone it. - Add
arbitraryfeature which is disabled by default. By enabling it,Input,KeyandCursorMovecan be randomly generated via arbitrary crate. This feature aims to be used by fuzzing tests. - Add many benchmark suites to track performance; insert/delete lines/characters, text search, moving a cursor.
- Improve fuzzing tests to include rendering a textarea to a dummy terminal backend and moving a cursor randomly.
- Refactor
TextAreaimplementation. The implementation of text search was separated tosrc/search.rs. The implementation of highlighting was separated tosrc/highlight.rs. And the implementation of widget rendered by tui-rs was separated tosrc/widget.rs. These refactorings changed no public API.
v0.1.4 - 2022-07-10
- Fix the cursor line style was not applied when a cursor is at the end of line.
- Fix the cursor position after undoing the modification by 'delete until head of line' (
^Jby default).
v0.1.3 - 2022-07-08
- Text search was implemented. Text search is gated behind
searchfeature flag to avoid depending onregexcrate until it is necessary. See the usage document, the API document, and the working example for more details.TextArea::set_search_patternsets a search pattern in regular expression. This updates highlights at matches in textarea, but does not move the cursor.TextArea::search_forwardmoves cursor to the next match of the text search based on current cursor position.TextArea::search_backmoves cursor to the previous match of the text search based on current cursor position.TextArea::set_search_stylesets the text style for highlighting matches of text search.
v0.1.2 - 2022-06-25
- Indent with hard tab is now supported.
TextArea::set_hard_tab_indentmethod enables indentation with a hard tab on hitting a tab key.Demo withlet mut textarea = TextArea::default(); textarea.set_hard_tab_indent(true); textarea.insert_tab(); assert_eq!(textarea.lines(), ["\t"]);cargo run --example editor:
- Add
TextArea::indentmethod to get an indent string of textarea.let mut textarea = TextArea::default(); assert_eq!(textarea.indent(), " "); textarea.set_tab_length(2); assert_eq!(textarea.indent(), " "); textarea.set_hard_tab_indent(true); assert_eq!(textarea.indent(), "\t");
v0.1.1 - 2022-06-21
- Add
TextArea::yank_textandTextArea::set_yank_textto set/get yanked text of the textarea.let mut textarea = TextArea::default(); textarea.set_yank_text("hello, world"); assert_eq!(textarea.yank_text(), "hello, world"); textarea.paste(); assert_eq!(textarea.lines(), ["hello, world"]); - Add
CursorMove::Jump(row, col)variant to move cursor to arbitrary (row, col) position withTextArea::move_cursor.let mut textarea = TextArea::from(["aaaa", "bbbb"]); textarea.move_cursor(CursorMove::Jump(1, 2)); assert_eq!(textarea.cursor(), (1, 2)); - Fix hard tabs are not rendered (#1)
v0.1.0 - 2022-06-19
First release 🎉
- GitHub repository: https://github.com/rhysd/tui-textarea
- crates.io: https://crates.io/crates/tui-textarea
- docs.rs: https://docs.rs/tui-textarea/latest/tui_textarea/
