Noticed that when pasting multi-line blocks, each newline was treated like a new submission. Update tui to handle Paste directly and map newlines to shift+enter. # Test Copied this into clipboard: ``` Do nothing. Explain this repo to me. ``` Pasted in and saw multi-line input. Hitting Enter then submitted the full block.
46 lines
1.4 KiB
Rust
46 lines
1.4 KiB
Rust
use std::io::Stdout;
|
|
use std::io::stdout;
|
|
use std::io::{self};
|
|
|
|
use crossterm::event::DisableBracketedPaste;
|
|
use crossterm::event::DisableMouseCapture;
|
|
use crossterm::event::EnableBracketedPaste;
|
|
use crossterm::event::EnableMouseCapture;
|
|
use ratatui::Terminal;
|
|
use ratatui::backend::CrosstermBackend;
|
|
use ratatui::crossterm::execute;
|
|
use ratatui::crossterm::terminal::EnterAlternateScreen;
|
|
use ratatui::crossterm::terminal::LeaveAlternateScreen;
|
|
use ratatui::crossterm::terminal::disable_raw_mode;
|
|
use ratatui::crossterm::terminal::enable_raw_mode;
|
|
|
|
/// A type alias for the terminal type used in this application
|
|
pub type Tui = Terminal<CrosstermBackend<Stdout>>;
|
|
|
|
/// Initialize the terminal
|
|
pub fn init() -> io::Result<Tui> {
|
|
execute!(stdout(), EnterAlternateScreen)?;
|
|
execute!(stdout(), EnableMouseCapture)?;
|
|
execute!(stdout(), EnableBracketedPaste)?;
|
|
enable_raw_mode()?;
|
|
set_panic_hook();
|
|
Terminal::new(CrosstermBackend::new(stdout()))
|
|
}
|
|
|
|
fn set_panic_hook() {
|
|
let hook = std::panic::take_hook();
|
|
std::panic::set_hook(Box::new(move |panic_info| {
|
|
let _ = restore(); // ignore any errors as we are already failing
|
|
hook(panic_info);
|
|
}));
|
|
}
|
|
|
|
/// Restore the terminal to its original state
|
|
pub fn restore() -> io::Result<()> {
|
|
execute!(stdout(), DisableMouseCapture)?;
|
|
execute!(stdout(), DisableBracketedPaste)?;
|
|
execute!(stdout(), LeaveAlternateScreen)?;
|
|
disable_raw_mode()?;
|
|
Ok(())
|
|
}
|