diff --git a/src/args.rs b/src/args.rs index ae7cafd..fd7d9ab 100644 --- a/src/args.rs +++ b/src/args.rs @@ -7,6 +7,7 @@ pub fn handle_args() { } let mut auto_aliasing = String::new(); let mut shell = String::new(); + let mut cnf = true; let mut index = 1; while index < args.len() { match args[index].as_str() { @@ -29,6 +30,10 @@ pub fn handle_args() { } index += 1; } + "--noncf" => { + cnf = false; + index += 1 + } _ => { shell = args[index].clone(); index += 1 @@ -43,7 +48,7 @@ pub fn handle_args() { let binary_path = &args[0]; - initialization(&shell, binary_path, &auto_aliasing); + initialization(&shell, binary_path, &auto_aliasing, cnf); } fn print_help() { diff --git a/src/main.rs b/src/main.rs index c819723..5dc2d74 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,11 +18,11 @@ use sys_locale::get_locale; mod args; mod files; +mod modes; mod rules; mod shell; mod style; mod suggestions; -mod modes; #[cfg(feature = "runtime-rules")] mod replaces; @@ -60,15 +60,12 @@ fn main() { let mode = match std::env::var("_PR_MODE") { Ok(mode) => mode, - Err(_) => { - "suggestion".to_string() - } + Err(_) => "suggestion".to_string(), }; match mode.as_str() { "suggestion" => modes::suggestion(), "cnf" => modes::cnf(), - _ => { - } + _ => {} } } diff --git a/src/modes.rs b/src/modes.rs index 6a9bd38..1457cc3 100644 --- a/src/modes.rs +++ b/src/modes.rs @@ -1,7 +1,7 @@ use crate::shell::{command_output, get_shell, PRIVILEGE_LIST}; use crate::style::highlight_difference; -use crate::{shell, suggestions}; use crate::suggestions::{split_command, suggest_typo}; +use crate::{shell, suggestions}; use colored::Colorize; pub fn suggestion() { @@ -72,8 +72,8 @@ pub fn cnf() { let best_match = suggest_typo(&[executable.to_owned()], vec!["path".to_string()]); if best_match == executable { - eprintln!("{}: no command found", shell); - return + eprintln!("{}: command not found: {}", shell, executable); + return; } match PRIVILEGE_LIST.contains(&split_command[0].as_str()) { true => { diff --git a/src/shell.rs b/src/shell.rs index a711c41..37ab0bf 100644 --- a/src/shell.rs +++ b/src/shell.rs @@ -146,7 +146,7 @@ pub fn expand_alias_multiline(shell: &str, full_command: &str) -> String { expanded } -pub fn initialization(shell: &str, binary_path: &str, auto_alias: &str) { +pub fn initialization(shell: &str, binary_path: &str, auto_alias: &str, cnf: bool) { let last_command; let alias; @@ -227,11 +227,57 @@ end } } + if cnf { + match shell { + "bash" | "zsh" => { + init = format!( + r#" +command_not_found_handler() {{ + eval $(_PR_LAST_COMMAND="$@" _PR_SHELL="{}" _PR_MODE=cnf "{}") +}} + +{} +"#, + shell, binary_path, init + ); + } + "fish" => { + init = format!( + r#" +function fish_command_not_found --on-event fish_command_not_found + eval $(_PR_LAST_COMMAND="$argv" _PR_SHELL="{}" _PR_MODE=cnf "{}") +end + +{} +"#, + shell, binary_path, init + ); + } + _ => { + println!("Unsupported shell: {}", shell); + exit(1); + } + } + } + println!("{}", init); std::process::exit(0); } +pub fn get_shell() -> String { + match std::env::var("_PR_SHELL") { + Ok(shell) => shell, + Err(_) => { + eprintln!( + "{}", + t!("no-env-setup", var = "_PR_SHELL", help = "pay-respects -h") + ); + std::process::exit(1); + } + } +} + pub fn shell_syntax(shell: &str, command: &mut String) { #[allow(clippy::single_match)] match shell {