pub struct TextArea<'a> { /* private fields */ }
Expand description

A type to manage state of textarea.

TextArea::default creates an empty textarea. TextArea::new creates a textarea with given text lines. TextArea::from creates a textarea from an iterator of lines. TextArea::input handles key input. TextArea::widget builds a widget to render. And TextArea::lines returns line texts.

use tui_textarea::{TextArea, Input, Key};

let mut textarea = TextArea::default();

// Input 'a'
let input = Input { key: Key::Char('a'), ctrl: false, alt: false };
textarea.input(input);

// Get widget to render.
let widget = textarea.widget();

// Get lines as String.
println!("Lines: {:?}", textarea.lines());

Implementations

Create TextArea instance with given lines. If you have value other than Vec<String>, TextArea::from may be more useful.

use tui_textarea::TextArea;

let lines = vec!["hello".to_string(), "...".to_string(), "goodbye".to_string()];
let textarea = TextArea::new(lines);
assert_eq!(textarea.lines(), ["hello", "...", "goodbye"]);

Handle a key input with default key mappings. For default key mappings, see the table in the module document. crossterm and termion features enable conversion from their own key event types into Input so this method can take the event values directly. This method returns if the input modified text contents or not in the textarea.

use tui_textarea::{TextArea, Key, Input};

let mut textarea = TextArea::default();

// Handle crossterm key events
let event: crossterm::event::Event = ...;
textarea.input(event);
if let crossterm::event::Event::Key(key) = event {
    textarea.input(key);
}

// Handle termion key events
let event: termion::event::Event = ...;
textarea.input(event);
if let termion::event::Event::Key(key) = event {
    textarea.input(key);
}

// Handle backend-agnostic key input
let input = Input { key: Key::Char('a'), ctrl: false, alt: false };
let modified = textarea.input(input);
assert!(modified);

Handle a key input without default key mappings. This method handles only

  • Single character input without modifier keys
  • Tab
  • Enter
  • Backspace
  • Delete

This method returns if the input modified text contents or not in the textarea.

This method is useful when you want to define your own key mappings and don’t want default key mappings. See ‘Define your own key mappings’ section in the module document.

Insert a single character at current cursor position.

use tui_textarea::TextArea;

let mut textarea = TextArea::default();

textarea.insert_char('a');
assert_eq!(textarea.lines(), ["a"]);

Insert a string at current cursor position. Currently the string must not contain any newlines. This method returns if some text was inserted or not in the textarea.

use tui_textarea::TextArea;

let mut textarea = TextArea::default();

textarea.insert_str("hello");
assert_eq!(textarea.lines(), ["hello"]);

Delete a string in current cursor line. The chars parameter means number of characters, not a byte length of the string. This method returns if some text was deleted or not in the textarea.

use tui_textarea::TextArea;

let mut textarea = TextArea::from(["🐱🐶🐰🐮"]);

textarea.delete_str(1, 2);
assert_eq!(textarea.lines(), ["🐱🐮"]);

Insert a tab at current cursor position. Note that this method does nothing when the tab length is 0. This method returns if a tab string was inserted or not in the textarea. textarea.

use tui_textarea::TextArea;

let mut textarea = TextArea::from(["hi"]);

textarea.insert_tab();
assert_eq!(textarea.lines(), ["    hi"]);

Insert a newline at current cursor position.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["hi"]);

textarea.move_cursor(CursorMove::Forward);
textarea.insert_newline();
assert_eq!(textarea.lines(), ["h", "i"]);

Delete a newline from head of current cursor line. This method returns if a newline was deleted or not in the textarea.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["hello", "world"]);

textarea.move_cursor(CursorMove::Down);
textarea.delete_newline();
assert_eq!(textarea.lines(), ["helloworld"]);

Delete one character before cursor. When the cursor is at head of line, the newline before the cursor will be removed. This method returns if some text was deleted or not in the textarea.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["abc"]);

textarea.move_cursor(CursorMove::Forward);
textarea.delete_char();
assert_eq!(textarea.lines(), ["bc"]);

Delete one character next to cursor. When the cursor is at end of line, the newline next to the cursor will be removed. This method returns if a character was deleted or not in the textarea.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["abc"]);

textarea.move_cursor(CursorMove::Forward);
textarea.delete_next_char();
assert_eq!(textarea.lines(), ["ac"]);

Delete string from cursor to end of the line. When the cursor is at end of line, the newline next to the cursor is removed. This method returns if some text was deleted or not in the textarea.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["abcde"]);

// Move to 'c'
textarea.move_cursor(CursorMove::Forward);
textarea.move_cursor(CursorMove::Forward);

textarea.delete_line_by_end();
assert_eq!(textarea.lines(), ["ab"]);

Delete string from cursor to head of the line. When the cursor is at head of line, the newline before the cursor will be removed. This method returns if some text was deleted or not in the textarea.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["abcde"]);

// Move to 'c'
textarea.move_cursor(CursorMove::Forward);
textarea.move_cursor(CursorMove::Forward);

textarea.delete_line_by_head();
assert_eq!(textarea.lines(), ["cde"]);

Delete a word before cursor. Word boundary appears at spaces, punctuations, and others. For example fn foo(a) consists of words fn, foo, (, a, ). When the cursor is at head of line, the newline before the cursor will be removed.

This method returns if some text was deleted or not in the textarea.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["aaa bbb ccc"]);

textarea.move_cursor(CursorMove::End);

textarea.delete_word();
assert_eq!(textarea.lines(), ["aaa bbb "]);
textarea.delete_word();
assert_eq!(textarea.lines(), ["aaa "]);

Delete a word next to cursor. Word boundary appears at spaces, punctuations, and others. For example fn foo(a) consists of words fn, foo, (, a, ). When the cursor is at end of line, the newline next to the cursor will be removed.

This method returns if some text was deleted or not in the textarea.

use tui_textarea::TextArea;

let mut textarea = TextArea::from(["aaa bbb ccc"]);

textarea.delete_next_word();
assert_eq!(textarea.lines(), [" bbb ccc"]);
textarea.delete_next_word();
assert_eq!(textarea.lines(), [" ccc"]);

Paste a string previously deleted by TextArea::delete_line_by_head, TextArea::delete_line_by_end, TextArea::delete_word, TextArea::delete_next_word. This method returns if some text was inserted or not in the textarea.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["aaa bbb ccc"]);

textarea.delete_next_word();
textarea.move_cursor(CursorMove::End);
textarea.paste();
assert_eq!(textarea.lines(), [" bbb cccaaa"]);

Move the cursor to the position specified by the CursorMove parameter. For each kind of cursor moves, see the document of CursorMove.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["abc", "def"]);

textarea.move_cursor(CursorMove::Forward);
assert_eq!(textarea.cursor(), (0, 1));
textarea.move_cursor(CursorMove::Down);
assert_eq!(textarea.cursor(), (1, 1));

Undo the last modification. This method returns if the undo modified text contents or not in the textarea.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["abc def"]);

textarea.delete_next_word();
assert_eq!(textarea.lines(), [" def"]);
textarea.undo();
assert_eq!(textarea.lines(), ["abc def"]);

Redo the last undo change. This method returns if the redo modified text contents or not in the textarea.

use tui_textarea::{TextArea, CursorMove};

let mut textarea = TextArea::from(["abc def"]);

textarea.delete_next_word();
assert_eq!(textarea.lines(), [" def"]);
textarea.undo();
assert_eq!(textarea.lines(), ["abc def"]);
textarea.redo();
assert_eq!(textarea.lines(), [" def"]);

Build a tui-rs widget to render the current state of the textarea. The widget instance returned from this method can be rendered with tui::terminal::Frame::render_widget.

use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::Terminal;
use tui_textarea::TextArea;

let mut textarea = TextArea::default();

let layout = Layout::default()
    .direction(Direction::Vertical)
    .constraints([Constraint::Min(1)].as_ref());
let backend = CrosstermBackend::new(std::io::stdout());
let mut term = Terminal::new(backend).unwrap();

loop {
    term.draw(|f| {
        let chunks = layout.split(f.size());
        let widget = textarea.widget();
        f.render_widget(widget, chunks[0]);
    }).unwrap();

    // ...
}

Set the style of textarea. By default, textarea is not styled.

use tui::style::{Style, Color};
use tui_textarea::TextArea;

let mut textarea = TextArea::default();
let style = Style::default().fg(Color::Red);
textarea.set_style(style);
assert_eq!(textarea.style(), style);

Get the current style of textarea.

Set the block of textarea. By default, no block is set.

use tui_textarea::TextArea;
use tui::widgets::{Block, Borders};

let mut textarea = TextArea::default();
let block = Block::default().borders(Borders::ALL).title("Block Title");
textarea.set_block(block);
assert!(textarea.block().is_some());

Remove the block of textarea which was set by TextArea::set_block.

use tui_textarea::TextArea;
use tui::widgets::{Block, Borders};

let mut textarea = TextArea::default();
let block = Block::default().borders(Borders::ALL).title("Block Title");
textarea.set_block(block);
textarea.remove_block();
assert!(textarea.block().is_none());

Get the block of textarea if exists.

Set the length of tab character. Due to limitation of tui-rs, hard tab is not supported. Setting 0 disables tab inputs.

use tui_textarea::{TextArea, Input, Key};

let mut textarea = TextArea::default();
let tab_input = Input { key: Key::Tab, ctrl: false, alt: false };

textarea.set_tab_length(8);
textarea.input(tab_input.clone());
assert_eq!(textarea.lines(), ["        "]);

textarea.set_tab_length(2);
textarea.input(tab_input);
assert_eq!(textarea.lines(), ["          "]);

Get how many spaces are used for representing tab character. The default value is 4.

Set how many modifications are remembered for undo/redo. Setting 0 disables undo/redo.

Get how many modifications are remembered for undo/redo. The default value is 50.

Set the style of line at cursor. By default, the cursor line is styled with underline. To stop styling the cursor line, set the default style.

use tui::style::{Style, Color};
use tui_textarea::TextArea;

let mut textarea = TextArea::default();

let style = Style::default().fg(Color::Red);
textarea.set_cursor_line_style(style);
assert_eq!(textarea.cursor_line_style(), style);

// Disable cursor line style
textarea.set_cursor_line_style(Style::default());

Get the style of cursor line. By default it is styled with underline.

Set the style of line number. By setting the style with this method, line numbers are drawn in textarea, meant that line numbers are disabled by default. If you want to show line numbers but don’t want to style them, set the default style.

use tui::style::{Style, Color};
use tui_textarea::TextArea;

let mut textarea = TextArea::default();

// Show line numbers in dark gray background
let style = Style::default().bg(Color::DarkGray);
textarea.set_line_number_style(style);
assert_eq!(textarea.line_number_style(), Some(style));

Remove the style of line number which was set by TextArea::set_line_number_style. After calling this method, Line numbers will no longer be shown.

use tui::style::{Style, Color};
use tui_textarea::TextArea;

let mut textarea = TextArea::default();

textarea.set_line_number_style(Style::default().bg(Color::DarkGray));
textarea.remove_line_number();
assert_eq!(textarea.line_number_style(), None);

Get the style of line number if set.

Set the style of cursor. By default, a cursor is rendered in the reversed color. Setting the same style as cursor line hides a cursor.

use tui::style::{Style, Color};
use tui_textarea::TextArea;

let mut textarea = TextArea::default();

let style = Style::default().bg(Color::Red);
textarea.set_cursor_style(style);
assert_eq!(textarea.cursor_style(), style);

Get the style of cursor.

Get slice of line texts. This method borrows the content, but not moves. Note that the returned slice will never be empty because an empty text means a slice containing one empty line. This is correct since any text file must end with a newline.

use tui_textarea::TextArea;

let mut textarea = TextArea::default();
assert_eq!(textarea.lines(), [""]);

textarea.insert_char('a');
assert_eq!(textarea.lines(), ["a"]);

textarea.insert_newline();
assert_eq!(textarea.lines(), ["a", ""]);

textarea.insert_char('b');
assert_eq!(textarea.lines(), ["a", "b"]);

Convert TextArea instance into line texts.

use tui_textarea::TextArea;

let mut textarea = TextArea::default();

textarea.insert_char('a');
textarea.insert_newline();
textarea.insert_char('b');

assert_eq!(textarea.into_lines(), ["a", "b"]);

Get the current cursor position. 0-base character-wise (row, col) cursor position.

use tui_textarea::TextArea;

let mut textarea = TextArea::default();
assert_eq!(textarea.cursor(), (0, 0));

textarea.insert_char('a');
textarea.insert_newline();
textarea.insert_char('b');

assert_eq!(textarea.cursor(), (1, 1));

Check if the textarea has a empty content.

use tui_textarea::TextArea;

let textarea = TextArea::default();
assert!(textarea.is_empty());

let textarea = TextArea::from(["hello"]);
assert!(!textarea.is_empty());

Get the yanked text. Text is automatically yanked when deleting strings by TextArea::delete_line_by_head, TextArea::delete_line_by_end, TextArea::delete_word, TextArea::delete_next_word.

use tui_textarea::TextArea;

let mut textarea = TextArea::from(["abc"]);

textarea.delete_next_word();
assert_eq!(textarea.yank_text(), "abc");

Set a yanked text. The text can be inserted by TextArea::paste. The string passed to method must not contain any newlines.

use tui_textarea::TextArea;

let mut textarea = TextArea::default();

textarea.set_yank_text("hello, world");
textarea.paste();
assert_eq!(textarea.lines(), ["hello, world"]);

Trait Implementations

Create TextArea instance with empty text content.

use tui_textarea::TextArea;

let textarea = TextArea::default();
assert_eq!(textarea.lines(), [""]);
assert!(textarea.is_empty());

Returns the “default value” for a type. Read more

Convert any iterator whose elements can be converted into String into TextArea. Each String element is handled as line. Ensure that the strings don’t contain any newlines. This method is useful to create TextArea from std::str::Lines.

use tui_textarea::TextArea;

// From `String`
let text = "hello\nworld";
let textarea = TextArea::from(text.lines());
assert_eq!(textarea.lines(), ["hello", "world"]);

// From array of `&str`
let textarea = TextArea::from(["hello", "world"]);
assert_eq!(textarea.lines(), ["hello", "world"]);

// From slice of `&str`
let slice = &["hello", "world"];
let textarea = TextArea::from(slice.iter().copied());
assert_eq!(textarea.lines(), ["hello", "world"]);

Converts to this type from the input type.

Collect line texts from iterator as TextArea. It is useful when creating a textarea with text read from a file. Iterator::collect handles errors which may happen on reading each lines. The following example reads text from a file efficiently line-by-line.

use std::fs;
use std::io::{self, BufRead};
use std::path::Path;
use tui_textarea::TextArea;

fn read_from_file<'a>(path: impl AsRef<Path>) -> io::Result<TextArea<'a>> {
    let file = fs::File::open(path.as_ref())?;
    io::BufReader::new(file).lines().collect()
}

Creates a value from an iterator. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.