feat: allow shell to execute command (useful for cd)

This commit is contained in:
iff 2023-08-12 22:55:31 +02:00
parent e63d55110e
commit cb38df3c37
3 changed files with 22 additions and 4 deletions

View file

@ -9,5 +9,6 @@ pattern = [
suggest = [ suggest = [
''' '''
#[err_contains(no such file or directory)] #[err_contains(no such file or directory)]
mkdir -p {{command[1]}} ''' mkdir -p {{command[1]}}
cd {{command[1]}} '''
] ]

View file

@ -183,10 +183,10 @@ pub fn initialization(shell: &str, binary_path: &str, auto_alias: &str) {
let mut init = format!( let mut init = format!(
"\ "\
_PR_LAST_COMMAND=\"{}\" \ eval $(_PR_LAST_COMMAND=\"{}\" \
_PR_ALIAS=\"{}\" \ _PR_ALIAS=\"{}\" \
_PR_SHELL=\"{}\" \ _PR_SHELL=\"{}\" \
\"{}\"", \"{}\")",
last_command, alias, shell, binary_path last_command, alias, shell, binary_path
); );
@ -197,7 +197,7 @@ pub fn initialization(shell: &str, binary_path: &str, auto_alias: &str) {
match shell { match shell {
"bash" | "zsh" => { "bash" | "zsh" => {
init = format!(r#"alias {}='{}'"#, auto_alias, init); init = format!(r#"alias {}=eval '$({})'"#, auto_alias, init);
} }
"fish" => { "fish" => {
init = format!( init = format!(

View file

@ -226,6 +226,7 @@ pub fn confirm_suggestion(shell: &str, command: &str, highlighted: &str) -> Resu
.unwrap(); .unwrap();
if process.success() { if process.success() {
println!("{}", shell_evaluated_commands(&command));
return Ok(()); return Ok(());
} else { } else {
if now.elapsed() > Duration::from_secs(3) { if now.elapsed() > Duration::from_secs(3) {
@ -257,6 +258,7 @@ pub fn confirm_suggestion(shell: &str, command: &str, highlighted: &str) -> Resu
.unwrap(); .unwrap();
if process.success() { if process.success() {
println!("{}", shell_evaluated_commands(&command));
Ok(()) Ok(())
} else { } else {
if now.elapsed() > Duration::from_secs(3) { if now.elapsed() > Duration::from_secs(3) {
@ -272,3 +274,18 @@ pub fn confirm_suggestion(shell: &str, command: &str, highlighted: &str) -> Resu
Err(error_msg.to_string()) Err(error_msg.to_string())
} }
} }
fn shell_evaluated_commands(command: &str) -> String {
let lines = command
.lines()
.map(|line| line.trim().trim_end_matches(['\\', ';', '|', '&']))
.collect::<Vec<&str>>();
let mut commands = Vec::new();
for line in lines {
if line.starts_with("cd") {
commands.push(line.to_string());
}
}
commands.join(" && ")
}