Skip to main content

lsp/
lsp.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 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}