From 58ad04b61cf567c7a8756869f19d6d5682122b12 Mon Sep 17 00:00:00 2001 From: Konrad Borowski Date: Fri, 19 Jul 2013 09:56:47 +0200 Subject: [PATCH] Avoid standard command not found message when command-not-found is found Squashed commit of the following: commit c208bc30b7747b3743212483b3dd7e3f90819f49 Merge: 97bea94 2633372 Author: Konrad Borowski Date: Fri Jul 19 09:56:12 2013 +0200 Merge branch 'command-not-found' of git://github.com/GlitchMr/fish-shell into command-not-found commit 26333721b9048333d1e7932505c221a31fd0e624 Author: Konrad Borowski Date: Fri Jul 19 09:55:13 2013 +0200 Fix command_not_found when not found commit db34460bb51a4b1c1c456c2e535ae8d913d1071e Author: Konrad Borowski Date: Wed Jul 17 13:41:57 2013 +0200 Avoid showing standard command not found message when possible In bash, command-not-found handler causes the standard messages to not appear. Because of events model in fish, it isn't really an option, so I moved the standard command not found message to fish function. This way, the messages aren't repeated, and the standard command not found message appears only when handler couldn't be found. --- parser.cpp | 16 ++++++++++------ share/functions/__fish_config_interactive.fish | 18 ++++++++++-------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/parser.cpp b/parser.cpp index a8390af84..d6aa18868 100644 --- a/parser.cpp +++ b/parser.cpp @@ -2027,6 +2027,7 @@ int parser_t::parse_job(process_t *p, for this, used by other shells like bash and zsh). */ + if (wcschr(cmd, L'=')) { wchar_t *cpy = wcsdup(cmd); @@ -2076,9 +2077,15 @@ int parser_t::parse_job(process_t *p, } else { - debug(0, - _(L"Unknown command '%ls'"), - cmd?cmd:L"UNKNOWN"); + /* + Handle unrecognized commands with standard + command not found handler that can make better + error messages + */ + + wcstring_list_t event_args; + event_args.push_back(args.at(0).completion); + event_fire_generic(L"fish_command_not_found", &event_args); } tmp = current_tokenizer_pos; @@ -2090,9 +2097,6 @@ int parser_t::parse_job(process_t *p, job_set_flag(j, JOB_SKIP, 1); - wcstring_list_t event_args; - event_args.push_back(args.at(0).completion); - event_fire_generic(L"fish_command_not_found", &event_args); proc_set_last_status(err==ENOENT?STATUS_UNKNOWN_COMMAND:STATUS_NOT_EXECUTABLE); } } diff --git a/share/functions/__fish_config_interactive.fish b/share/functions/__fish_config_interactive.fish index 814fff198..d7961861f 100644 --- a/share/functions/__fish_config_interactive.fish +++ b/share/functions/__fish_config_interactive.fish @@ -218,21 +218,23 @@ function __fish_config_interactive -d "Initializations that should be performed function fish_command_not_found_setup --on-event fish_command_not_found # Remove fish_command_not_found_setup so we only execute this once functions --erase fish_command_not_found_setup - + # First check in /usr/lib, this is where modern Ubuntus place this command if test -f /usr/lib/command-not-found function fish_command_not_found_handler --on-event fish_command_not_found /usr/lib/command-not-found $argv end - fish_command_not_found_handler $argv + # Ubuntu Feisty places this command in the regular path instead + else if type -p command-not-found > /dev/null 2> /dev/null + function fish_command_not_found_handler --on-event fish_command_not_found + command-not-found $argv + end + # Use standard fish command not found handler otherwise else - # Ubuntu Feisty places this command in the regular path instead - if type -p command-not-found > /dev/null 2> /dev/null - function fish_command_not_found_handler --on-event fish_command_not_found - command-not-found $argv - end - fish_command_not_found_handler $argv + function fish_command_not_found_handler --on-event fish_command_not_found + echo fish: Unknown command "'$argv'" >&2 end end + fish_command_not_found_handler $argv end end