Skip to main content

CustomTextArea

Struct CustomTextArea 

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

A custom text area widget

Implementations§

Source§

impl<'a> CustomTextArea<'a>

Source

pub fn new( style: impl Into<Style>, inline: bool, multiline: bool, text: impl Into<String>, ) -> Self

Creates a new custom text area

Source

pub fn title(self, title: impl Into<Cow<'a, str>>) -> Self

Updates the title of the text area

Source

pub fn forbidden_chars_regex(self, regex: Regex) -> Self

Updates the regex to filter out forbidden characters

Source

pub fn focused(self) -> Self

Updates the text area to be focused

Source

pub fn secret(self, secret: bool) -> Self

Updates the textarea mask char

Source

pub fn is_multiline(&self) -> bool

Returns whether the text area supports multiple lines or not

Source

pub fn is_focused(&self) -> bool

Returns whether the text area is currently focused or not

Source

pub fn set_secret(&mut self, secret: bool)

Sets or clear the the text area mask char

Source

pub fn set_focus(&mut self, focus: bool)

Sets the focus state of the text area

Source

pub fn set_title(&mut self, new_title: impl Into<Cow<'a, str>>)

Updates the title of the text area

Source

pub fn set_forbidden_chars_regex(&mut self, regex: Regex)

Updates the regex to filter out forbidden characters

Source

pub fn set_style(&mut self, style: impl Into<Style>)

Updates the style of this text area

Source

pub fn set_ai_loading(&mut self, loading: bool)

Sets the AI loading state, showing or hiding a spinner

Source

pub fn is_ai_loading(&self) -> bool

Checks if the textarea has the ai loading state

Source

pub fn tick(&mut self)

Advances the spinner animation if active

Source

pub fn lines_as_string(&self) -> String

Retrieves the current text in the text area as a single string

Source

pub fn move_cursor_left(&mut self, word: bool)

Moves the cursor to the left, optionally by word

Source

pub fn move_cursor_right(&mut self, word: bool)

Moves the cursor to the right, optionally by word

Source

pub fn move_home(&mut self, absolute: bool)

Moves the cursor to the head of the line, or the absolute head

Source

pub fn move_end(&mut self, absolute: bool)

Moves the cursor to the end of the line, or the absolute end

Source

pub fn insert_char(&mut self, c: char)

Inserts a char at the current cursor position

Source

pub fn insert_str<S>(&mut self, text: S)
where S: AsRef<str>,

Inserts a text at the current cursor position

Source

pub fn insert_newline(&mut self)

Inserts a newline at the current cursor position, if multiline is enabled

Source

pub fn delete(&mut self, backspace: bool, word: bool)

Delete characters at the cursor position based on the backspace and word flags

Methods from Deref<Target = TextArea<'a>>§

Source

pub fn input(&mut self, input: impl Into<Input>) -> bool

Handle a key input with default key mappings. For default key mappings, see the table in the module document. crossterm, termion, and termwiz 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 ratatui_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 termwiz key events
let event: termwiz::input::InputEvent = ...;
textarea.input(event);
if let termwiz::input::InputEvent::Key(key) = event {
    textarea.input(key);
}

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

pub fn input_without_shortcuts(&mut self, input: impl Into<Input>) -> bool

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.

Source

pub fn insert_char(&mut self, c: char)

Insert a single character at current cursor position.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

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

pub fn insert_str<S>(&mut self, s: S) -> bool
where S: AsRef<str>,

Insert a string at current cursor position. This method returns if some text was inserted or not in the textarea. Both \n and \r\n are recognized as newlines but \r isn’t.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

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

textarea.insert_str(", world\ngoodbye, world");
assert_eq!(textarea.lines(), ["hello, world", "goodbye, world"]);
Source

pub fn delete_str(&mut self, chars: usize) -> bool

Delete a string from the current cursor position. The chars parameter means number of characters, not a byte length of the string. Newlines at the end of lines are counted in the number. This method returns if some text was deleted or not.

use ratatui_textarea::{TextArea, CursorMove};

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

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

let mut textarea = TextArea::from(["🐱", "🐶", "🐰", "🐮"]);
textarea.move_cursor(CursorMove::Down);

textarea.delete_str(4); // Deletes 🐶, \n, 🐰, \n
assert_eq!(textarea.lines(), ["🐱", "🐮"]);
Source

pub fn insert_tab(&mut self) -> bool

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.

use ratatui_textarea::{TextArea, CursorMove};

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

textarea.move_cursor(CursorMove::End); // Move to the end of line

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

pub fn insert_newline(&mut self)

Insert a newline at current cursor position.

use ratatui_textarea::{TextArea, CursorMove};

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

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

pub fn delete_newline(&mut self) -> bool

Delete a newline from head of current cursor line. This method returns if a newline was deleted or not in the textarea. When some text is selected, it is deleted instead.

use ratatui_textarea::{TextArea, CursorMove};

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

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

pub fn delete_char(&mut self) -> bool

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. When some text is selected, it is deleted instead.

use ratatui_textarea::{TextArea, CursorMove};

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

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

pub fn delete_next_char(&mut self) -> bool

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 ratatui_textarea::{TextArea, CursorMove};

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

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

pub fn delete_line_by_end(&mut self) -> bool

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 ratatui_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"]);
Source

pub fn delete_line_by_head(&mut self) -> bool

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 ratatui_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"]);
Source

pub fn delete_word(&mut self) -> bool

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 ratatui_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 "]);
Source

pub fn delete_next_word(&mut self) -> bool

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 ratatui_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"]);
Source

pub fn clear(&mut self) -> bool

Clear the entire content of the textarea, leaving it empty. The cursor position before calling this method does not affect the result. This method integrates with the undo/redo history, so the content can be restored with TextArea::undo. Returns true if any text was deleted, false if the textarea was already empty.

use ratatui_textarea::TextArea;

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

assert!(textarea.clear());
assert!(textarea.is_empty());

textarea.undo();
assert_eq!(textarea.lines(), ["hello", "world"]);
Source

pub fn paste(&mut self) -> bool

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 ratatui_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"]);
Source

pub fn start_selection(&mut self)

Start text selection at the cursor position. If text selection is already ongoing, the start position is reset.

use ratatui_textarea::{TextArea, CursorMove};

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

textarea.start_selection();
textarea.move_cursor(CursorMove::WordForward);
textarea.copy();
assert_eq!(textarea.yank_text(), "aaa ");
Source

pub fn cancel_selection(&mut self)

Stop the current text selection. This method does nothing if text selection is not ongoing.

use ratatui_textarea::{TextArea, CursorMove};

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

textarea.start_selection();
textarea.move_cursor(CursorMove::WordForward);

// Cancel the ongoing text selection
textarea.cancel_selection();

// As the result, this `copy` call does nothing
textarea.copy();
assert_eq!(textarea.yank_text(), "");
Source

pub fn select_all(&mut self)

Select the entire text. Cursor moves to the end of the text buffer. When text selection is already ongoing, it is canceled.

use ratatui_textarea::{TextArea, CursorMove};

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

textarea.select_all();

// Cut the entire text;
textarea.cut();

assert_eq!(textarea.lines(), [""]); // Buffer is now empty
assert_eq!(textarea.yank_text(), "aaa\nbbb\nccc");
Source

pub fn is_selecting(&self) -> bool

Return if text selection is ongoing or not.

use ratatui_textarea::{TextArea};

let mut textarea = TextArea::default();

assert!(!textarea.is_selecting());
textarea.start_selection();
assert!(textarea.is_selecting());
textarea.cancel_selection();
assert!(!textarea.is_selecting());
Source

pub fn set_selection_style(&mut self, style: Style)

Set the style used for text selection. The default style is light blue.

use ratatui_textarea::TextArea;
use ratatui_core::style::{Style, Color};

let mut textarea = TextArea::default();

// Change the selection color from the default to Red
textarea.set_selection_style(Style::default().bg(Color::Red));
assert_eq!(textarea.selection_style(), Style::default().bg(Color::Red));
Source

pub fn selection_style(&mut self) -> Style

Get the style used for text selection.

use ratatui_textarea::TextArea;
use ratatui_core::style::{Style, Color};

let mut textarea = TextArea::default();

assert_eq!(textarea.selection_style(), Style::default().bg(Color::LightBlue));
Source

pub fn copy(&mut self)

Copy the selection text to the yank buffer. When nothing is selected, this method does nothing. To get the yanked text, use TextArea::yank_text.

use ratatui_textarea::{TextArea, Key, Input, CursorMove};

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

// Start text selection at 'W'
textarea.move_cursor(CursorMove::WordForward);
textarea.start_selection();

// Select the word "World" and copy the selected text
textarea.move_cursor(CursorMove::End);
textarea.copy();

assert_eq!(textarea.yank_text(), "World");
assert_eq!(textarea.lines(), ["Hello World"]); // Text does not change
Source

pub fn cut(&mut self) -> bool

Cut the selected text and place it in the yank buffer. This method returns whether the text was modified. The cursor will move to the start position of the text selection. To get the yanked text, use TextArea::yank_text.

use ratatui_textarea::{TextArea, Key, Input, CursorMove};

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

// Start text selection at 'W'
textarea.move_cursor(CursorMove::WordForward);
textarea.start_selection();

// Select the word "World" and copy the selected text
textarea.move_cursor(CursorMove::End);
textarea.cut();

assert_eq!(textarea.yank_text(), "World");
assert_eq!(textarea.lines(), ["Hello "]);
Source

pub fn move_cursor(&mut self, m: CursorMove)

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

use ratatui_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));
Source

pub fn undo(&mut self) -> bool

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

use ratatui_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"]);
Source

pub fn redo(&mut self) -> bool

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

use ratatui_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"]);
Source

pub fn widget(&'a self) -> impl Widget + 'a

👎Deprecated since 0.5.3:

calling this method is no longer necessary on rendering a textarea. pass &TextArea reference to Frame::render_widget method call directly

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

This method was deprecated at v0.5.3 and is no longer necessary. Instead you can directly pass &TextArea reference to the Frame::render_widget method call.

ⓘ
// v0.5.2 or earlier
f.render_widget(textarea.widget(), rect);

// v0.5.3 or later
f.render_widget(&textarea, rect);
Source

pub fn set_style(&mut self, style: Style)

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

use ratatui_core::style::{Style, Color};
use ratatui_textarea::TextArea;

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

pub fn style(&self) -> Style

Get the current style of textarea.

Source

pub fn set_block(&mut self, block: Block<'a>)

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

use ratatui_textarea::TextArea;
use ratatui_widgets::block::Block;
use ratatui_widgets::borders::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());
Source

pub fn remove_block(&mut self)

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

use ratatui_textarea::TextArea;
use ratatui_widgets::block::Block;
use ratatui_widgets::borders::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());
Source

pub fn block<'s>(&'s self) -> Option<&'s Block<'a>>

Get the block of textarea if exists.

Source

pub fn set_tab_length(&mut self, len: u8)

Set the length of tab character. Setting 0 disables tab inputs.

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

let mut textarea = TextArea::default();
let tab_input = Input { key: Key::Tab, ctrl: false, alt: false, shift: 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(), ["          "]);
Source

pub fn tab_length(&self) -> u8

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

Source

pub fn set_hard_tab_indent(&mut self, enabled: bool)

Set if a hard tab is used or not for indent. When true is set, typing a tab key inserts a hard tab instead of spaces. By default, hard tab is disabled.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

textarea.set_hard_tab_indent(true);
textarea.insert_tab();
assert_eq!(textarea.lines(), ["\t"]);
Source

pub fn hard_tab_indent(&self) -> bool

Get if a hard tab is used for indent or not.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

assert!(!textarea.hard_tab_indent());
textarea.set_hard_tab_indent(true);
assert!(textarea.hard_tab_indent());
Source

pub fn indent(&self) -> &'static str

Get a string for indent. It consists of spaces by default. When hard tab is enabled, it is a tab character.

use ratatui_textarea::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");
Source

pub fn set_max_histories(&mut self, max: usize)

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

Source

pub fn max_histories(&self) -> usize

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

Source

pub fn set_cursor_line_style(&mut self, style: Style)

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 ratatui_core::style::{Style, Color};
use ratatui_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());
Source

pub fn cursor_line_style(&self) -> Style

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

Source

pub fn set_line_number_style(&mut self, style: Style)

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 ratatui_core::style::{Style, Color};
use ratatui_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));
Source

pub fn remove_line_number(&mut self)

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 ratatui_core::style::{Style, Color};
use ratatui_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);
Source

pub fn line_number_style(&self) -> Option<Style>

Get the style of line number if set.

Source

pub fn line_number_width(&self) -> u16

Get the width in columns of the line number gutter: the digits of the last line number plus one margin column on each side. It is 0 when line numbers are not enabled. Text is drawn to the right of the gutter, so this is the offset to subtract when converting a column within the rendered area into a text column for TextArea::screen_to_data.

use ratatui_core::style::Style;
use ratatui_textarea::TextArea;

let mut textarea: TextArea = (1..=10).map(|i| i.to_string()).collect();
assert_eq!(textarea.line_number_width(), 0);

textarea.set_line_number_style(Style::default());
assert_eq!(textarea.line_number_width(), 4); // "10" plus a margin on each side
Source

pub fn set_placeholder_text(&mut self, placeholder: impl Into<String>)

Set the placeholder text. The text is set in the textarea when no text is input. Setting a non-empty string "" enables the placeholder. The default value is an empty string so the placeholder is disabled by default. To customize the text style, see TextArea::set_placeholder_style.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();
assert_eq!(textarea.placeholder_text(), "");
assert!(textarea.placeholder_style().is_none());

textarea.set_placeholder_text("Hello");
assert_eq!(textarea.placeholder_text(), "Hello");
assert!(textarea.placeholder_style().is_some());
Source

pub fn set_placeholder_style(&mut self, style: Style)

Set the style of the placeholder text. The default style is a dark gray text.

use ratatui_core::style::{Style, Color};
use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();
assert_eq!(textarea.placeholder_style(), None); // When the placeholder is disabled

textarea.set_placeholder_text("Enter your message"); // Enable placeholder by setting non-empty text

let style = Style::default().bg(Color::Blue);
textarea.set_placeholder_style(style);
assert_eq!(textarea.placeholder_style(), Some(style));
Source

pub fn placeholder(&self) -> &Text<'_>

Get the placeholder. The placeholder is shown when the textarea is empty.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();
textarea.set_styled_placeholder("Hello");
assert_eq!(textarea.placeholder().lines[0].spans[0].content, "Hello");
Source

pub fn set_styled_placeholder(&mut self, placeholder: impl Into<Text<'a>>)

Set the placeholder as a styled ratatui_core::text::Text value. The placeholder is shown when the textarea is empty. Accepts anything that converts into Text: a plain &str, a styled Line, or a full Text.

To disable the placeholder, pass an empty Text: textarea.set_styled_placeholder(Text::default()). Alternatively, set_placeholder_text called with "" also clears it.

use ratatui_core::style::{Color, Style, Stylize};
use ratatui_core::text::{Line, Span, Text};
use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

// Plain string
textarea.set_styled_placeholder("Enter your message");
assert!(!textarea.placeholder().lines.is_empty());

// Styled span
textarea.set_styled_placeholder(Line::from(vec![
    Span::styled("Required: ", Style::default().fg(Color::Red)),
    Span::raw("enter your name"),
]));

// Multi-line Text
textarea.set_styled_placeholder(Text::from_iter([
    Line::raw("Line 1"),
    Line::raw("Line 2"),
]));
Source

pub fn placeholder_text(&self) -> &str

Get the placeholder text. An empty string means the placeholder is disabled. The default value is an empty string.

use ratatui_textarea::TextArea;

let textarea = TextArea::default();
assert_eq!(textarea.placeholder_text(), "");
Source

pub fn placeholder_style(&self) -> Option<Style>

Get the placeholder style. When the placeholder text is empty, it returns None since the placeholder is disabled. The default style is a dark gray text.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();
assert_eq!(textarea.placeholder_style(), None);

textarea.set_placeholder_text("hello");
assert!(textarea.placeholder_style().is_some());
Source

pub fn set_mask_char(&mut self, mask: char)

Specify a character masking the text. All characters in the textarea will be replaced by this character. This API is useful for making a kind of credentials form such as a password input.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

textarea.set_mask_char('*');
assert_eq!(textarea.mask_char(), Some('*'));
textarea.set_mask_char('●');
assert_eq!(textarea.mask_char(), Some('●'));
Source

pub fn clear_mask_char(&mut self)

Clear the masking character previously set by TextArea::set_mask_char.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

textarea.set_mask_char('*');
assert_eq!(textarea.mask_char(), Some('*'));
textarea.clear_mask_char();
assert_eq!(textarea.mask_char(), None);
Source

pub fn mask_char(&self) -> Option<char>

Get the character to mask text. When no character is set, None is returned.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

assert_eq!(textarea.mask_char(), None);
textarea.set_mask_char('*');
assert_eq!(textarea.mask_char(), Some('*'));
Source

pub fn set_cursor_style(&mut self, style: Style)

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 ratatui_core::style::{Style, Color};
use ratatui_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);
Source

pub fn cursor_style(&self) -> Style

Get the style of cursor.

Source

pub fn lines(&'a self) -> &'a [String]

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 ratatui_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"]);
Source

pub fn cursor(&self) -> DataCursor

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

use ratatui_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));
Source

pub fn screen_cursor(&self) -> ScreenCursor

Source

pub fn scroll_offset(&self) -> (u16, u16)

Get the scroll position as a 0-base (row, col) pair: the display line and column drawn at the top-left of the rendered area.

Display lines are counted after soft wrapping, so with WrapMode::None a display line is a line of the text and otherwise a long line spans several. This is the offset that turns a position within the rendered area into the screen position TextArea::screen_to_data expects.

The value is recorded while rendering, so it is (0, 0) until the widget has been drawn at least once.

use ratatui_core::buffer::Buffer;
use ratatui_core::layout::Rect;
use ratatui_core::widgets::Widget as _;
use ratatui_textarea::{CursorMove, TextArea};

let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect();
assert_eq!(textarea.scroll_offset(), (0, 0));

// The viewport follows the cursor while drawing.
textarea.move_cursor(CursorMove::Bottom);
let area = Rect { x: 0, y: 0, width: 8, height: 4 };
(&textarea).render(area, &mut Buffer::empty(area));

let (row, _) = textarea.scroll_offset();
assert_eq!(row, 16, "the last four lines are on screen");
Source

pub fn screen_to_data(&self, row: usize, col: usize) -> DataCursor

Convert a screen position into the position in the text drawn there, accounting for soft wrapping and tab expansion.

This is the mapping a mouse click needs. row and col are 0-base display coordinates counted from the top-left of the text, not of the rendered area — add TextArea::scroll_offset to coordinates taken from the area the widget was drawn into, and subtract TextArea::line_number_width from the column when line numbers are enabled.

Positions outside the text clamp rather than being rejected: a row past the last display line resolves to that line, and a column past the end of a line resolves to its end. A click below or to the right of the text therefore lands where a reader would expect.

use ratatui_textarea::{CursorMove, DataCursor, TextArea};

let mut textarea = TextArea::from(["hello", "world"]);
assert_eq!(textarea.screen_to_data(1, 3), DataCursor(1, 3));

// Below the text clamps to the last line.
assert_eq!(textarea.screen_to_data(99, 0), DataCursor(1, 0));

// Move the cursor to a clicked position.
let clicked = textarea.screen_to_data(0, 2);
textarea.move_cursor(CursorMove::Jump(clicked.0 as u16, clicked.1 as u16));
assert_eq!(textarea.cursor(), (0, 2));
Source

pub fn selection_range(&self) -> Option<((usize, usize), (usize, usize))>

Get the current selection range as a pair of the start position and the end position. The range is bounded inclusively below and exclusively above. The positions are 0-base character-wise (row, col) values. The first element of the pair is always smaller than the second one even when it is ahead of the cursor. When no text is selected, this method returns None.

use ratatui_textarea::TextArea;
use ratatui_textarea::CursorMove;

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

// 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))));

textarea.move_cursor(CursorMove::Down);
assert_eq!(textarea.selection_range(), Some(((0, 0), (1, 1))));

// Start selection at (1, 1)
textarea.cancel_selection();
textarea.start_selection();

// The first element of the pair is always smaller than the second one
textarea.move_cursor(CursorMove::Back);
assert_eq!(textarea.selection_range(), Some(((1, 0), (1, 1))));
Source

pub fn set_alignment(&mut self, alignment: HorizontalAlignment)

Set text alignment. When Alignment::Center or Alignment::Right is set, line number is automatically disabled because those alignments don’t work well with line numbers.

use ratatui_core::layout::Alignment;
use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

textarea.set_alignment(Alignment::Center);
assert_eq!(textarea.alignment(), Alignment::Center);
Source

pub fn alignment(&self) -> HorizontalAlignment

Get current text alignment. The default alignment is Alignment::Left.

use ratatui_core::layout::Alignment;
use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

assert_eq!(textarea.alignment(), Alignment::Left);
Source

pub fn set_wrap_mode(&mut self, mode: WrapMode)

Set the soft-wrap mode used when rendering text.

Source

pub fn wrap_mode(&self) -> WrapMode

Get the current soft-wrap mode.

Source

pub fn is_empty(&self) -> bool

Check if the textarea has a empty content.

use ratatui_textarea::TextArea;

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

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

pub fn yank_text(&self) -> String

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, TextArea::delete_str, TextArea::copy, and TextArea::cut. When multiple lines were yanked, they are always joined with \n.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::from(["abc"]);
textarea.delete_next_word();
assert_eq!(textarea.yank_text(), "abc");

// Multiple lines are joined with \n
let mut textarea = TextArea::from(["abc", "def"]);
textarea.delete_str(5);
assert_eq!(textarea.yank_text(), "abc\nd");
Source

pub fn set_yank_text(&mut self, text: impl Into<String>)

Set a yanked text. The text can be inserted by TextArea::paste. \n and \r\n are recognized as newline but \r isn’t.

use ratatui_textarea::TextArea;

let mut textarea = TextArea::default();

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

pub fn scroll(&mut self, scrolling: impl Into<Scrolling>)

Scroll the textarea. See Scrolling for the argument. The cursor will not move until it goes out the viewport. When the cursor position is outside the viewport after scroll, the cursor position will be adjusted to stay in the viewport using the same logic as CursorMove::InViewport.

use ratatui_textarea::TextArea;

// Let's say terminal height is 8.

// Create textarea with 20 lines "0", "1", "2", "3", ...
let mut textarea: TextArea = (0..20).into_iter().map(|i| i.to_string()).collect();

// Scroll down by 15 lines. Since terminal height is 8, cursor will go out
// the viewport.
textarea.scroll((15, 0));
// So the cursor position was updated to stay in the viewport after the scrolling.
assert_eq!(textarea.cursor(), (15, 0));

// Scroll up by 5 lines. Since the scroll amount is smaller than the terminal
// height, cursor position will not be updated.
textarea.scroll((-5, 0));
assert_eq!(textarea.cursor(), (15, 0));

// Scroll up by 5 lines again. The terminal height is 8. So a cursor reaches to
// the top of viewport after scrolling up by 7 lines. Since we have already
// scrolled up by 5 lines, scrolling up by 5 lines again makes the cursor overrun
// the viewport by 5 - 2 = 3 lines. To keep the cursor stay in the viewport, the
// cursor position will be adjusted from line 15 to line 12.
textarea.scroll((-5, 0));
assert_eq!(textarea.cursor(), (12, 0));

Trait Implementations§

Source§

impl<'a> Clone for CustomTextArea<'a>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Deref for CustomTextArea<'a>

Source§

type Target = TextArea<'a>

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<'a> DerefMut for CustomTextArea<'a>

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
Source§

impl<'a> Widget for &CustomTextArea<'a>

Source§

fn render(self, area: Rect, buf: &mut Buffer)

Draws the current state of the widget in the given buffer. That is the only method required to implement a custom widget.

Auto Trait Implementations§

§

impl<'a> !Freeze for CustomTextArea<'a>

§

impl<'a> !RefUnwindSafe for CustomTextArea<'a>

§

impl<'a> !Sync for CustomTextArea<'a>

§

impl<'a> Send for CustomTextArea<'a>

§

impl<'a> Unpin for CustomTextArea<'a>

§

impl<'a> UnsafeUnpin for CustomTextArea<'a>

§

impl<'a> UnwindSafe for CustomTextArea<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more