A multiline text editor widget with undo/redo, cursor movement, and selection.
Uses the ratatui-textarea Rust crate. State lives in Rust via ResourceArc —
create it with ExRatatui.textarea_new/0 and pass the reference as :state.
Usage
state = ExRatatui.textarea_new()
ExRatatui.textarea_handle_key(state, "h", [])
ExRatatui.textarea_handle_key(state, "i", [])
ExRatatui.textarea_get_value(state) # => "hi"
%Textarea{state: state, block: %Block{title: "Message", borders: [:all]}}Key handling
Forward key events via ExRatatui.textarea_handle_key/3. The textarea
supports Emacs-style shortcuts by default:
Ctrl+A/Home— beginning of lineCtrl+E/End— end of lineCtrl+K— delete to end of lineCtrl+W— delete word backward- Arrow keys, Page Up/Down, etc.
Enter vs Submit
The textarea always inserts newlines on Enter. To implement "Enter = submit,
Shift+Enter = newline", intercept Enter in your App's handle_event before
forwarding to the textarea.
Examples
iex> %ExRatatui.Widgets.Textarea{}
%ExRatatui.Widgets.Textarea{
state: nil,
style: %ExRatatui.Style{},
cursor_style: %ExRatatui.Style{},
cursor_line_style: %ExRatatui.Style{},
placeholder: nil,
placeholder_style: %ExRatatui.Style{},
line_number_style: nil,
block: nil
}
iex> alias ExRatatui.Widgets.{Textarea, Block}
iex> alias ExRatatui.Style
iex> %Textarea{
...> placeholder: "Type a message...",
...> placeholder_style: %Style{fg: :dark_gray},
...> block: %Block{title: "Message", borders: [:all]}
...> }
%ExRatatui.Widgets.Textarea{
state: nil,
style: %ExRatatui.Style{},
cursor_style: %ExRatatui.Style{},
cursor_line_style: %ExRatatui.Style{},
placeholder: "Type a message...",
placeholder_style: %ExRatatui.Style{fg: :dark_gray},
line_number_style: nil,
block: %ExRatatui.Widgets.Block{title: "Message", borders: [:all]}
}
Summary
Types
@type t() :: %ExRatatui.Widgets.Textarea{ block: ExRatatui.Widgets.Block.t() | nil, cursor_line_style: ExRatatui.Style.t(), cursor_style: ExRatatui.Style.t(), line_number_style: ExRatatui.Style.t() | nil, placeholder: String.t() | nil, placeholder_style: ExRatatui.Style.t(), state: reference() | nil, style: ExRatatui.Style.t() }