diff --git a/atuin-client/config.toml b/atuin-client/config.toml index 9a094f8811b..abd2b9fe983 100644 --- a/atuin-client/config.toml +++ b/atuin-client/config.toml @@ -38,6 +38,13 @@ ## possible values: global, host, session, directory # filter_mode = "global" +## List of filter modes and how to cycle them +## For example, setting this to ["session", "host", "global"] makes you only +## cycle through these three, with "session" being the default, "host" coming +## next and "global" being last. +## possible values: global, host, session, directory, workspace +# filter_mode_list = ["global", "host", "session", "directory", "workspace"] + ## With workspace filtering enabled, Atuin will filter for commands executed ## in any directory within a git repository tree (default: false) # workspaces = false diff --git a/atuin-client/src/settings.rs b/atuin-client/src/settings.rs index de6b10a42c0..ea2a4f9bd08 100644 --- a/atuin-client/src/settings.rs +++ b/atuin-client/src/settings.rs @@ -262,6 +262,7 @@ pub struct Settings { pub session_path: String, pub search_mode: SearchMode, pub filter_mode: FilterMode, + pub filter_mode_list: Vec, pub filter_mode_shell_up_key_binding: Option, pub search_mode_shell_up_key_binding: Option, pub shell_up_key_binding: bool, @@ -493,6 +494,7 @@ impl Settings { .set_default("sync_frequency", "10m")? .set_default("search_mode", "fuzzy")? .set_default("filter_mode", "global")? + .set_default("filter_mode_list", vec!["global", "host", "session", "directory", "workspace"])? .set_default("style", "auto")? .set_default("inline_height", 0)? .set_default("show_preview", false)? diff --git a/atuin/src/command/client/search/interactive.rs b/atuin/src/command/client/search/interactive.rs index 27c82f2c669..78616e47650 100644 --- a/atuin/src/command/client/search/interactive.rs +++ b/atuin/src/command/client/search/interactive.rs @@ -359,23 +359,10 @@ impl State { } KeyCode::Char('u') if ctrl => self.search.input.clear(), KeyCode::Char('r') if ctrl => { - let filter_modes = if settings.workspaces && self.search.context.git_root.is_some() - { - vec![ - FilterMode::Global, - FilterMode::Host, - FilterMode::Session, - FilterMode::Directory, - FilterMode::Workspace, - ] - } else { - vec![ - FilterMode::Global, - FilterMode::Host, - FilterMode::Session, - FilterMode::Directory, - ] - }; + let mut filter_modes = settings.filter_mode_list.clone(); + if settings.workspaces && self.search.context.git_root.is_some() { + filter_modes.retain(|fm| *fm != FilterMode::Workspace); + } let i = self.search.filter_mode as usize; let i = (i + 1) % filter_modes.len();