highlight_file/
highlight_file.rs1use std::cell::LazyCell;
2use std::error::Error;
3use std::fs::File;
4use std::io::{Stdout, stdout};
5
6use ratatui::backend::CrosstermBackend;
7use ratatui::crossterm::event::read;
8use ratatui::crossterm::execute;
9use ratatui::crossterm::terminal::{
10 EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
11};
12use syntect_assets::assets::HighlightingAssets;
13use tui_syntax_highlight::Highlighter;
14
15type Terminal = ratatui::Terminal<CrosstermBackend<Stdout>>;
16type Result<T> = std::result::Result<T, Box<dyn Error>>;
17
18thread_local! {
19 static ASSETS: LazyCell<HighlightingAssets> = LazyCell::new(HighlightingAssets::from_binary);
20}
21
22fn main() -> Result<()> {
23 let mut terminal = setup_terminal()?;
24 let theme = ASSETS.with(|a| a.get_theme("Nord").clone());
25 let highlighter = Highlighter::new(theme);
26 let syntaxes = ASSETS.with(|a| a.get_syntax_set().cloned())?;
27 let syntax = syntaxes
28 .find_syntax_by_name("Rust")
29 .expect("syntax missing");
30 let highlighted_text = highlighter.highlight_reader(
31 File::open("./examples/sqlite_custom/build.rs")?,
32 syntax,
33 &syntaxes,
34 )?;
35 terminal.draw(|frame| {
36 frame.render_widget(highlighted_text, frame.area());
37 })?;
38 read()?;
39 restore_terminal(terminal)?;
40 Ok(())
41}
42
43fn setup_terminal() -> Result<Terminal> {
44 enable_raw_mode()?;
45 let mut stdout = stdout();
46 execute!(stdout, EnterAlternateScreen)?;
47 let backend = CrosstermBackend::new(stdout);
48 let terminal = Terminal::new(backend)?;
49 Ok(terminal)
50}
51
52fn restore_terminal(mut terminal: Terminal) -> Result<()> {
53 disable_raw_mode()?;
54 execute!(terminal.backend_mut(), LeaveAlternateScreen)?;
55 Ok(())
56}