Skip to main content

minimal/
minimal.rs

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 content = "fn main() {\n    println!(\"Hello, world!\");\n}";
22    let mut editor = Editor::new("rust", content, vesper())?;
23    let mut editor_area = ratatui::layout::Rect::default();
24    
25    loop {
26        terminal.draw(|f| {
27            let area = f.area();
28            editor_area = area;
29            f.render_widget(&editor, editor_area);
30
31            let cursor = editor.get_visible_cursor(&area);
32            if let Some((x,y)) = cursor {
33                f.set_cursor_position(Position::new(x, y));
34            }
35        })?;
36        
37        if let Event::Key(key) = event::read()? {
38            if key.code == KeyCode::Esc {
39                break;
40            }
41            editor.input(key, &editor_area)?;
42        }
43    }
44    
45    disable_raw_mode()?;
46    execute!(stdout(), LeaveAlternateScreen)?;    
47    Ok(())
48}