diff --git a/app/src/executor.rs b/app/src/executor.rs index 437bcef4..78414152 100644 --- a/app/src/executor.rs +++ b/app/src/executor.rs @@ -67,8 +67,12 @@ impl Executor { "forward" => cx.manager.active_mut().forward(), "cd" => { let path = exec.args.get(0).map(PathBuf::from).unwrap_or_default(); - emit!(Cd(path)); - false + if exec.named.contains_key("interactive") { + cx.manager.active_mut().cd_interactive(path) + } else { + emit!(Cd(path)); + false + } } // Selection diff --git a/config/preset/keymap.toml b/config/preset/keymap.toml index 5ae1e1ab..661665ea 100644 --- a/config/preset/keymap.toml +++ b/config/preset/keymap.toml @@ -97,6 +97,7 @@ keymap = [ { on = [ "g", "c" ], exec = "cd ~/.config" }, { on = [ "g", "d" ], exec = "cd ~/Downloads" }, { on = [ "g", "t" ], exec = "cd /tmp" }, + { on = [ "g", "" ], exec = "cd --interactive" }, ] [tasks] diff --git a/core/src/manager/tab.rs b/core/src/manager/tab.rs index 719fb57d..9124c995 100644 --- a/core/src/manager/tab.rs +++ b/core/src/manager/tab.rs @@ -115,6 +115,18 @@ impl Tab { true } + pub fn cd_interactive(&mut self, target: PathBuf) -> bool { + tokio::spawn(async move { + let result = + emit!(Input(InputOpt::top("Change directory:").with_value(target.to_string_lossy()))); + + if let Ok(target) = result.await { + emit!(Cd(PathBuf::from(target))); + } + }); + false + } + pub fn enter(&mut self) -> bool { let hovered = if let Some(ref h) = self.current.hovered { h.clone()