diff --git a/atuin/src/command/client/history.rs b/atuin/src/command/client/history.rs index 3ca6dc4..6189d05 100644 --- a/atuin/src/command/client/history.rs +++ b/atuin/src/command/client/history.rs @@ -51,6 +51,13 @@ pub enum Cmd { #[arg(long)] cmd_only: bool, + #[arg(long, short, default_value = "true")] + // accept no value + #[arg(num_args(0..=1), default_missing_value("true"))] + // accept a value + #[arg(action = clap::ArgAction::Set)] + reverse: bool, + /// Available variables: {command}, {directory}, {duration}, {user}, {host}, {exit} and {time}. /// Example: --format "{time} - [{duration}] - {directory}$\t{command}" #[arg(long, short)] @@ -93,7 +100,7 @@ impl ListMode { } #[allow(clippy::cast_sign_loss)] -pub fn print_list(h: &[History], list_mode: ListMode, format: Option<&str>) { +pub fn print_list(h: &[History], list_mode: ListMode, format: Option<&str>, reverse: bool) { let w = std::io::stdout(); let mut w = w.lock(); @@ -113,7 +120,13 @@ pub fn print_list(h: &[History], list_mode: ListMode, format: Option<&str>) { ListMode::CmdOnly => std::iter::once(ParseSegment::Key("command")).collect(), }; - for h in h.iter().rev() { + let iterator = if reverse { + Box::new(h.iter().rev()) as Box> + } else { + Box::new(h.iter()) as Box> + }; + + for h in iterator { match writeln!(w, "{}", parsed_fmt.with_args(&FmtHistory(h))) { Ok(()) => {} // ignore broken pipe (issue #626) @@ -266,6 +279,7 @@ impl Cmd { Ok(()) } + #[allow(clippy::too_many_arguments)] async fn handle_list( db: &mut impl Database, settings: &Settings, @@ -274,6 +288,7 @@ impl Cmd { cwd: bool, mode: ListMode, format: Option, + reverse: bool, ) -> Result<()> { let session = if session { Some(env::var("ATUIN_SESSION")?) @@ -304,7 +319,7 @@ impl Cmd { } }; - print_list(&history, mode, format.as_deref()); + print_list(&history, mode, format.as_deref(), reverse); Ok(()) } @@ -320,10 +335,12 @@ impl Cmd { cwd, human, cmd_only, + reverse, format, } => { let mode = ListMode::from_flags(human, cmd_only); - Self::handle_list(db, settings, context, session, cwd, mode, format).await + let reverse = reverse; + Self::handle_list(db, settings, context, session, cwd, mode, format, reverse).await } Self::Last { @@ -337,6 +354,7 @@ impl Cmd { last, ListMode::from_flags(human, cmd_only), format.as_deref(), + true, ); Ok(()) diff --git a/atuin/src/command/client/search.rs b/atuin/src/command/client/search.rs index bdfa30b..fd0a2e2 100644 --- a/atuin/src/command/client/search.rs +++ b/atuin/src/command/client/search.rs @@ -169,7 +169,7 @@ impl Cmd { .await?; } } else { - super::history::print_list(&entries, list_mode, self.format.as_deref()); + super::history::print_list(&entries, list_mode, self.format.as_deref(), true); } }; Ok(()) diff --git a/docs/docs/commands/list.md b/docs/docs/commands/list.md index c48d9d0..4d4f2a9 100644 --- a/docs/docs/commands/list.md +++ b/docs/docs/commands/list.md @@ -11,6 +11,7 @@ title: Listing History | `--session`/`-s` | Enable listing history for the current session only (default: false) | | `--human` | Use human-readable formatting for the timestamp and duration (default: false) | | `--cmd-only` | Show only the text of the command (default: false) | +| `--reverse` | Reverse the order of the output (default: false) | | `--format` | Specify the formatting of a command (see below) | ## Format