diff options
| author | Patrick Decat <pdecat@gmail.com> | 2023-03-25 18:27:20 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-25 17:27:20 +0000 |
| commit | 13ce5f746c946f5695c55642a9af5ead8894f692 (patch) | |
| tree | 897bf423b9cebff29654b2a32e45b99027fcb02a | |
| parent | Respect exit_mode setting when exiting with arrow down keypress (#807) (diff) | |
| download | atuin-13ce5f746c946f5695c55642a9af5ead8894f692.zip | |
feat: add an inline view mode (#648)
* add inline viewport
* Add inline_height setting. Zero disables inline mode (the default)
| -rw-r--r-- | Cargo.lock | 3 | ||||
| -rw-r--r-- | Cargo.toml | 3 | ||||
| -rw-r--r-- | atuin-client/src/settings.rs | 2 | ||||
| -rw-r--r-- | src/command/client/search/interactive.rs | 40 |
4 files changed, 37 insertions, 11 deletions
@@ -1764,8 +1764,7 @@ dependencies = [ [[package]] name = "ratatui" version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcc0d032bccba900ee32151ec0265667535c230169f5a011154cdcd984e16829" +source = "git+https://github.com/conradludgate/tui-rs-revival?branch=inline#6ed61959ecfc560e4e6a00a1410bb5fcbf0eda91" dependencies = [ "bitflags", "cassowary", @@ -81,3 +81,6 @@ version = "0.3" default-features = false features = ["ansi", "fmt", "registry", "env-filter"] optional = true + +[patch.crates-io] +ratatui = { git = "https://github.com/conradludgate/tui-rs-revival", branch = "inline" } diff --git a/atuin-client/src/settings.rs b/atuin-client/src/settings.rs index bbbd78ee..a2d4f8c5 100644 --- a/atuin-client/src/settings.rs +++ b/atuin-client/src/settings.rs @@ -151,6 +151,7 @@ pub struct Settings { pub filter_mode: FilterMode, pub filter_mode_shell_up_key_binding: Option<FilterMode>, pub shell_up_key_binding: bool, + pub inline_height: u16, pub show_preview: bool, pub exit_mode: ExitMode, pub word_jump_mode: WordJumpMode, @@ -336,6 +337,7 @@ impl Settings { .set_default("search_mode", "fuzzy")? .set_default("filter_mode", "global")? .set_default("shell_up_key_binding", false)? + .set_default("inline_height", 0)? .set_default("show_preview", false)? .set_default("exit_mode", "return-original")? .set_default("session_token", "")? diff --git a/src/command/client/search/interactive.rs b/src/command/client/search/interactive.rs index feec4171..6fd4e1d8 100644 --- a/src/command/client/search/interactive.rs +++ b/src/command/client/search/interactive.rs @@ -33,7 +33,7 @@ use ratatui::{ style::{Color, Modifier, Style}, text::{Span, Spans, Text}, widgets::{Block, BorderType, Borders, Paragraph}, - Frame, Terminal, + Frame, Terminal, TerminalOptions, Viewport, }; const RETURN_ORIGINAL: usize = usize::MAX; @@ -466,29 +466,37 @@ impl State { struct Stdout { stdout: std::io::Stdout, + inline_mode: bool, } impl Stdout { - pub fn new() -> std::io::Result<Self> { + pub fn new(inline_mode: bool) -> std::io::Result<Self> { terminal::enable_raw_mode()?; let mut stdout = stdout(); + if !inline_mode { + execute!(stdout, terminal::EnterAlternateScreen)?; + } execute!( stdout, - terminal::EnterAlternateScreen, event::EnableMouseCapture, - event::EnableBracketedPaste + event::EnableBracketedPaste, )?; - Ok(Self { stdout }) + Ok(Self { + stdout, + inline_mode, + }) } } impl Drop for Stdout { fn drop(&mut self) { + if !self.inline_mode { + execute!(self.stdout, terminal::LeaveAlternateScreen).unwrap(); + } execute!( self.stdout, - terminal::LeaveAlternateScreen, event::DisableMouseCapture, - event::DisableBracketedPaste + event::DisableBracketedPaste, ) .unwrap(); terminal::disable_raw_mode().unwrap(); @@ -531,9 +539,18 @@ pub async fn history( settings: &Settings, db: &mut impl Database, ) -> Result<String> { - let stdout = Stdout::new()?; + let stdout = Stdout::new(settings.inline_height > 0)?; let backend = CrosstermBackend::new(stdout); - let mut terminal = Terminal::new(backend)?; + let mut terminal = Terminal::with_options( + backend, + TerminalOptions { + viewport: if settings.inline_height > 0 { + Viewport::Inline(settings.inline_height) + } else { + Viewport::Fullscreen + }, + }, + )?; let mut input = Cursor::from(query.join(" ")); // Put the cursor at the end of the query by default @@ -608,6 +625,11 @@ pub async fn history( results = app.query_results(db).await?; } }; + + if settings.inline_height > 0 { + terminal.clear()?; + } + if index < results.len() { // index is in bounds so we return that entry Ok(results.swap_remove(index).command.clone()) |
