diff --git a/src/main.rs b/src/main.rs index 7692fcf..58ef754 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,7 +62,10 @@ fn main() { if command.is_none() { break; }; - command.unwrap() + + let mut command = command.unwrap(); + shell::shell_syntax(&shell, &mut command); + command }; let highlighted_suggestion = { diff --git a/src/shell.rs b/src/shell.rs index fb8f301..1017777 100644 --- a/src/shell.rs +++ b/src/shell.rs @@ -246,3 +246,37 @@ end std::process::exit(0); } + +pub fn shell_syntax(shell: &str, command: &mut String) { + #[allow(clippy::single_match)] + match shell { + "nushell" => { + *command = command.replace(" && ", " and "); + } + _ => {} + } +} + +pub fn shell_evaluated_commands(shell: &str, command: &str) -> Option { + let lines = command + .lines() + .map(|line| line.trim().trim_end_matches(['\\', ';', '|', '&'])) + .collect::>(); + let mut dirs = Vec::new(); + for line in lines { + if let Some(dir) = line.strip_prefix("cd ") { + dirs.push(dir.to_string()); + } + } + + let cd_dir = dirs.join(""); + if cd_dir.is_empty() { + return None; + } + + #[allow(clippy::single_match)] + match shell { + "nushell" => Some(cd_dir), + _ => Some(format!("cd {}", cd_dir)), + } +} diff --git a/src/suggestions.rs b/src/suggestions.rs index 8273035..4809817 100644 --- a/src/suggestions.rs +++ b/src/suggestions.rs @@ -8,7 +8,7 @@ use regex_lite::Regex; use crate::files::{get_best_match_file, get_path_files}; use crate::rules::match_pattern; -use crate::shell::{expand_alias_multiline, PRIVILEGE_LIST}; +use crate::shell::{expand_alias_multiline, shell_evaluated_commands, PRIVILEGE_LIST}; pub fn suggest_command(shell: &str, last_command: &str, error_msg: &str) -> Option { let split_command = split_command(last_command); @@ -237,8 +237,10 @@ pub fn confirm_suggestion(shell: &str, command: &str, highlighted: &str) -> Resu .unwrap(); if process.success() { - println!("{}", shell_evaluated_commands(&command)); - return Ok(()); + let cd = shell_evaluated_commands(shell, &command); + if let Some(cd) = cd { + println!("{}", cd); + } } else { if now.elapsed() > Duration::from_secs(3) { exit(1); @@ -272,7 +274,10 @@ pub fn confirm_suggestion(shell: &str, command: &str, highlighted: &str) -> Resu .unwrap(); if process.success() { - println!("{}", shell_evaluated_commands(&command)); + let cd = shell_evaluated_commands(shell, &command); + if let Some(cd) = cd { + println!("{}", cd); + } Ok(()) } else { if now.elapsed() > Duration::from_secs(3) { @@ -291,18 +296,3 @@ pub fn confirm_suggestion(shell: &str, command: &str, highlighted: &str) -> Resu Err(error_msg.to_string()) } } - -fn shell_evaluated_commands(command: &str) -> String { - let lines = command - .lines() - .map(|line| line.trim().trim_end_matches(['\\', ';', '|', '&'])) - .collect::>(); - let mut commands = Vec::new(); - for line in lines { - if line.starts_with("cd ") { - commands.push(line.to_string()); - } - } - - commands.join(" && \\ \n") -}