mirror of
https://github.com/TECHNOFAB11/pay-respects.git
synced 2025-12-12 14:30:10 +01:00
feat: command not found hook
This commit is contained in:
parent
f80fbaa8d3
commit
e7f3eca47f
4 changed files with 59 additions and 11 deletions
|
|
@ -7,6 +7,7 @@ pub fn handle_args() {
|
||||||
}
|
}
|
||||||
let mut auto_aliasing = String::new();
|
let mut auto_aliasing = String::new();
|
||||||
let mut shell = String::new();
|
let mut shell = String::new();
|
||||||
|
let mut cnf = true;
|
||||||
let mut index = 1;
|
let mut index = 1;
|
||||||
while index < args.len() {
|
while index < args.len() {
|
||||||
match args[index].as_str() {
|
match args[index].as_str() {
|
||||||
|
|
@ -29,6 +30,10 @@ pub fn handle_args() {
|
||||||
}
|
}
|
||||||
index += 1;
|
index += 1;
|
||||||
}
|
}
|
||||||
|
"--noncf" => {
|
||||||
|
cnf = false;
|
||||||
|
index += 1
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
shell = args[index].clone();
|
shell = args[index].clone();
|
||||||
index += 1
|
index += 1
|
||||||
|
|
@ -43,7 +48,7 @@ pub fn handle_args() {
|
||||||
|
|
||||||
let binary_path = &args[0];
|
let binary_path = &args[0];
|
||||||
|
|
||||||
initialization(&shell, binary_path, &auto_aliasing);
|
initialization(&shell, binary_path, &auto_aliasing, cnf);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_help() {
|
fn print_help() {
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,11 @@ use sys_locale::get_locale;
|
||||||
|
|
||||||
mod args;
|
mod args;
|
||||||
mod files;
|
mod files;
|
||||||
|
mod modes;
|
||||||
mod rules;
|
mod rules;
|
||||||
mod shell;
|
mod shell;
|
||||||
mod style;
|
mod style;
|
||||||
mod suggestions;
|
mod suggestions;
|
||||||
mod modes;
|
|
||||||
|
|
||||||
#[cfg(feature = "runtime-rules")]
|
#[cfg(feature = "runtime-rules")]
|
||||||
mod replaces;
|
mod replaces;
|
||||||
|
|
@ -60,15 +60,12 @@ fn main() {
|
||||||
|
|
||||||
let mode = match std::env::var("_PR_MODE") {
|
let mode = match std::env::var("_PR_MODE") {
|
||||||
Ok(mode) => mode,
|
Ok(mode) => mode,
|
||||||
Err(_) => {
|
Err(_) => "suggestion".to_string(),
|
||||||
"suggestion".to_string()
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
match mode.as_str() {
|
match mode.as_str() {
|
||||||
"suggestion" => modes::suggestion(),
|
"suggestion" => modes::suggestion(),
|
||||||
"cnf" => modes::cnf(),
|
"cnf" => modes::cnf(),
|
||||||
_ => {
|
_ => {}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::shell::{command_output, get_shell, PRIVILEGE_LIST};
|
use crate::shell::{command_output, get_shell, PRIVILEGE_LIST};
|
||||||
use crate::style::highlight_difference;
|
use crate::style::highlight_difference;
|
||||||
use crate::{shell, suggestions};
|
|
||||||
use crate::suggestions::{split_command, suggest_typo};
|
use crate::suggestions::{split_command, suggest_typo};
|
||||||
|
use crate::{shell, suggestions};
|
||||||
use colored::Colorize;
|
use colored::Colorize;
|
||||||
|
|
||||||
pub fn suggestion() {
|
pub fn suggestion() {
|
||||||
|
|
@ -72,8 +72,8 @@ pub fn cnf() {
|
||||||
|
|
||||||
let best_match = suggest_typo(&[executable.to_owned()], vec!["path".to_string()]);
|
let best_match = suggest_typo(&[executable.to_owned()], vec!["path".to_string()]);
|
||||||
if best_match == executable {
|
if best_match == executable {
|
||||||
eprintln!("{}: no command found", shell);
|
eprintln!("{}: command not found: {}", shell, executable);
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
match PRIVILEGE_LIST.contains(&split_command[0].as_str()) {
|
match PRIVILEGE_LIST.contains(&split_command[0].as_str()) {
|
||||||
true => {
|
true => {
|
||||||
|
|
|
||||||
48
src/shell.rs
48
src/shell.rs
|
|
@ -146,7 +146,7 @@ pub fn expand_alias_multiline(shell: &str, full_command: &str) -> String {
|
||||||
expanded
|
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 last_command;
|
||||||
let alias;
|
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);
|
println!("{}", init);
|
||||||
|
|
||||||
std::process::exit(0);
|
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) {
|
pub fn shell_syntax(shell: &str, command: &mut String) {
|
||||||
#[allow(clippy::single_match)]
|
#[allow(clippy::single_match)]
|
||||||
match shell {
|
match shell {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue