Home

Awesome

EdTUI

<div align="center">

Continuous Integration

</div>

Overview

EdTUI is a text editor widget for the Ratatui ecosystem. It is designed to provide a user experience inspired by Vim. Edtui is developed to be used as an editor in ratatui apps. It is not supposed to be a stand-alone code editor.

Instantiate the state and render the view:

use edtui::{EditorState, EditorTheme, EditorView};
use ratatui::widgets::Widget;

let mut state = EditorState::default();
EditorView::new(&mut state)
        .theme(EditorTheme::default())
        .wrap(true) // line wrapping
        .render(area, buf);

Handle events:

use edtui::EditorEventHandler;

let mut event_handler = EditorEventHandler::default();
event_handler.on_key_event(key_event, &mut state);

Features

Demo

Keybindings

EdTUI offers a set of keybindings similar to Vim. Here are some of the most common keybindings:

Normal Mode:
KeybindingDescription
iEnter Insert mode
vEnter Visual mode
h, j, k, lNavigate left, down, up, and right
wMove forward to the start of a word
eMove forward to the end of a word
bMove backward to the start of a word
xDelete the character under the cursor
u, <ctrl>+rUndo/Redo last action
EscEscape Visual mode
0Move cursor to start of line
^Move cursor to first non-blank character
$Move cursor to end of line
ggMove cursor to the first row
G Move cursor to the last row
%Move cursor to closing/opening bracket
aAppend after the cursor
AAppend at the end of the line
oAdd a new line below and enter Insert mode
OAdd a new line above and enter Insert mode
JJoin current line with the line below
dDelete the selection (Visual mode)
ddDelete the current line
DDelete to the end of the line
viwSelect between delimiters. Supported: ["]
vi + ", ', (, [ or {Select between delimiter ", ', (, [ or {
ci + ", ', (, [ or {Change between delimiter ", ', (, [ or {
uUndo the last change
rRedo the last undone action
yCopy the selected text in visual mode
yyCopy the current line in normal mode
pPaste the copied text
Insert Mode:
KeybindingDescription
EscReturn to Normal mode
BackspaceDelete the previous character
EnterInsert line break
ArrowsNavigation

For more keybindings and customization options, refer to the code.

Experimental Mouse Support

Edtui includes experimental mouse support:

let event_handler = EditorEvent::default();
event_handler.on_mouse_event(mouse_event, &mut state);
// or handle both key and mouse event
event_handler.on_event(event, &mut state);

Syntax highlighting

Syntax highlighting was added in version 0.8.4. It is experimental, so expect breaking changes.

Edtui offers a number of custom themes, see [SyntaxHighlighter::theme] for a complete list. If you want to use a custom theme, see [SyntaxHighlighter::custom_theme]. Check syntect for more details about themes and extensions.

use edtui::EditorState;
use edtui::EditorView;
use edtui::SyntaxHighlighter;

let theme_name = "dracula";
let extension = "rs";
let syntax_highlighter = SyntaxHighlighter::new(theme_name, extension);
EditorView::new(&mut EditorState::default())
        .syntax_highlighter(Some(syntax_highlighter))
        .render(area, buf);

Roadmap

License: MIT