1use crossterm::{
2 event::{self, Event, KeyCode},
3 execute,
4 terminal::{
5 enable_raw_mode, disable_raw_mode,
6 EnterAlternateScreen, LeaveAlternateScreen
7 },
8};
9use ratatui::{Terminal, backend::CrosstermBackend, layout::{Position}};
10use ratatui_code_editor::editor::Editor;
11use ratatui_code_editor::theme::vesper;
12use std::io::stdout;
13
14fn main() -> anyhow::Result<()> {
15 enable_raw_mode()?;
16 execute!(stdout(), EnterAlternateScreen)?;
17
18 let backend = CrosstermBackend::new(stdout());
19 let mut terminal = Terminal::new(backend)?;
20
21 let filename = String::from("test.rs");
22 let content = "fn main() {\n println!(\"Hello, world!\");\n}";
23 let mut editor = Editor::new("rust", content, vesper())?;
24 let mut editor_area = ratatui::layout::Rect::default();
25
26 editor.set_change_callback(Box::new(
27 move |changes| {
28 for (start_row, start_col, end_row, end_col, text) in changes {
29 println!(
30 "Edit {}: ({}, {}) -> ({}, {}) text: '{}'",
31 filename, start_row, start_col, end_row, end_col, text
32 );
33 }
34 }
35 ));
36
37 loop {
38 terminal.draw(|f| {
39 let area = f.area();
40 editor_area = area;
41 f.render_widget(&editor, editor_area);
42
43 let cursor = editor.get_visible_cursor(&area);
44 if let Some((x,y)) = cursor {
45 f.set_cursor_position(Position::new(x, y));
46 }
47 })?;
48
49 if let Event::Key(key) = event::read()? {
50 if key.code == KeyCode::Esc {
51 break;
52 }
53 editor.input(key, &editor_area)?;
54 }
55 }
56
57 disable_raw_mode()?;
58 execute!(stdout(), LeaveAlternateScreen)?;
59 Ok(())
60}