From 598d63ccb9c4af0ffa2e1142861eae096d464a49 Mon Sep 17 00:00:00 2001 From: XYenon Date: Wed, 9 Aug 2023 15:56:20 +0800 Subject: [PATCH] feat: add interactive cd --- app/src/executor.rs | 6 +++--- config/preset/keymap.toml | 1 + core/src/manager/tab.rs | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/app/src/executor.rs b/app/src/executor.rs index 7eea35b3..5ae786e7 100644 --- a/app/src/executor.rs +++ b/app/src/executor.rs @@ -1,4 +1,4 @@ -use core::{emit, files::FilesSort, input::InputMode}; +use core::{files::FilesSort, input::InputMode}; use std::path::PathBuf; use config::{keymap::{Control, Exec, Key, KeymapLayer}, manager::SortBy, KEYMAP}; @@ -67,8 +67,8 @@ 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 + let interactive = exec.named.contains_key("interactive"); + cx.manager.active_mut().cd_interactive(interactive, path) } // 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..4138a256 100644 --- a/core/src/manager/tab.rs +++ b/core/src/manager/tab.rs @@ -74,6 +74,24 @@ impl Tab { true } + pub fn cd_interactive(&mut self, interactive: bool, target: PathBuf) -> bool { + if interactive { + tokio::spawn(async move { + let result = emit!(Input(InputOpt::top("Path:").with_value(target.to_string_lossy()))); + + if let Ok(path) = result.await { + let path = PathBuf::from(path); + emit!(Cd(path)); + } + Ok::<(), Error>(()) + }); + } + else { + emit!(Cd(target)); + } + false + } + pub async fn cd(&mut self, mut target: PathBuf) -> bool { let file = if let Ok(f) = File::from(&target).await { f