A code editor widget for Ratatui, built with syntax highlighting powered by Tree-sitter.
- ๐จ Syntax Highlighting - Powered by Tree-sitter with support for multiple languages
- ๐ Text Editing - Full text editing capabilities with cursor movement
- ๐ฑ๏ธ Mouse Support - Mouse clicks, scroll, text selection, words and lines snapping supported
- ๐ Copy/Paste - Clipboard integration with system clipboard
- ๐ Undo/Redo - Full history management for edit operations
- ๐ฏ Text Selection - Visual text selection with keyboard and mouse
- ๐ Themes - Customizable color themes for syntax highlighting
- ๐ฑ Responsive - Adapts to terminal window size changes
- ๐ Visual Marks - Mark specific regions in the editor
- ๐งฉ Emoji/Unicode Aware - Correct widths, cursor, and selection for grapheme clusters (e.g., โค๏ธ)
The Ratatui Code Editor features blazing fast syntax highlighting powered by Tree-sitter. Tree-sitter incrementally parses your code in real time, enabling blazing fast, accurate and context-aware highlighting for all supported languages.
Performance Features:
- Super Fast: Only the visible portion of the code is highlighted on each render, making even large files feel snappy.
- Smart Caching: Highlighting results are cached per visible region, so scrolling and editing are smooth and efficient.
- Wide Row Support: Handles long lines and wide code gracefully, ensuring correct highlighting and cursor placement even with complex Unicode or tab characters.
This approach means you get instant, editor-quality highlighting in your terminal, with no lagโeven for big files or wide code blocks.
- Rust
- Python
- JavaScript
- TypeScript
- C
- C++
- Go
- C#
- Java
- Html
- Css
- Yaml
- Toml
- Json
- Bash
- Markdown
Add this to your Cargo.toml:
anyhow = "1.0"
crossterm = "0.29"
ratatui = "0.29"
ratatui-code-editor = "0.0.1"use crossterm::{
event::{self, Event, KeyCode},
execute,
terminal::{
enable_raw_mode, disable_raw_mode,
EnterAlternateScreen, LeaveAlternateScreen
},
};
use ratatui::{Terminal, backend::CrosstermBackend, layout::Position};
use ratatui_code_editor::editor::Editor;
use ratatui_code_editor::theme::vesper;
use std::io::stdout;
fn main() -> anyhow::Result<()> {
enable_raw_mode()?;
execute!(stdout(), EnterAlternateScreen)?;
let backend = CrosstermBackend::new(stdout());
let mut terminal = Terminal::new(backend)?;
let content = "fn main() {\n println!(\"Hello, world!\");\n}";
let mut editor = Editor::new("rust", content, vesper())?;
let mut editor_area = ratatui::layout::Rect::default();
loop {
terminal.draw(|f| {
let area = f.area();
editor_area = area;
f.render_widget(&editor, editor_area);
let cursor = editor.get_visible_cursor(&area);
if let Some((x,y)) = cursor {
f.set_cursor_position(Position::new(x, y));
}
})?;
if let Event::Key(key) = event::read()? {
if key.code == KeyCode::Esc {
break;
}
editor.input(key, &editor_area)?;
}
}
disable_raw_mode()?;
execute!(stdout(), LeaveAlternateScreen)?;
Ok(())
}Run the included examples to see the editor in action:
# Minimal editor example
cargo run --release --example minimal
# Half-screen editor
cargo run --release --example half
# Split-screen editor
cargo run --release --example split
# Editor
cargo run --release --example editor <filename>- Arrow Keys - Move cursor
- Any printable character - Insert character
- Delete - Delete characters
- Enter - Insert new line
- Tab - Insert tab or spaces
- Ctrl+D - Duplicate
- Ctrl+X - Cut
- Alt+Enter - go to next line
- Alt+/ - comment/uncomment
- Shift + Arrow Keys - Select text
- Ctrl+A - Select all
- Mouse drag - Select text with mouse
- Mouse double click - Select word with mouse
- Mouse triple click - Select line with mouse
- Ctrl+C - Copy selected text
- Ctrl+V - Paste from clipboard
- Ctrl+X - Cut selected text
- Ctrl+Z - Undo
- Ctrl+Y - Redo
The editor comes with built-in themes:
vesper- Dark theme default- Custom themes can be created by providing color mappings
let custom_theme = vec![
("keyword", "#ff6b6b"),
("string", "#4ecdc4"),
("comment", "#95a5a6"),
("function", "#f39c12"),
];
let editor = Editor::new("rust", content, custom_theme);The editor is built with several key components:
- Editor - Main widget that handles rendering and input
- Code - Text buffer with Tree-sitter integration for syntax highlighting
- History - Undo/redo functionality with edit tracking
- Selection - Text selection state management
- Theme - Color scheme management
ratatui- Terminal UI frameworktree-sitter- Syntax highlighting parserropey- Efficient text buffercrossterm- Cross-platform terminal manipulationarboard- Clipboard accessunicode-width,unicode-segmentation- Unicode text width calculation
Contributions are welcome! Please feel free to submit issues, feature requests, or pull requests.
This project is licensed under the MIT License - see the LICENSE file for details.
- Built on top of the excellent Ratatui TUI framework
- Syntax highlighting powered by Tree-sitter
- Fast and efficient text buffer Ropey
- Awesome list of ratatui crates and applications awesome-ratatui
