mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-30 14:24:35 +08:00
340de73172
Previously, when a command wasn't found, fish would emit the "fish_command_not_found" *event*. This was annoying as it was hard to override (the code ended up checking for a function called `__fish_command_not_found_handler` anyway!), the setup was ugly, and it's useless - there is no use case for multiple command-not-found handlers. Instead, let's just call a function `fish_command_not_found` if it exists, or print the default message otherwise. The event is completely removed, but because a missing event is not an error (MEISNAE in C++-speak) this isn't an issue. Note that, for backwards-compatibility, we still keep the default handler function around even tho the new one is hard-coded in C++. Also, if we detect a previous handler, the new handler just calls it. This way, the backwards-compatible way to install a custom handler is: ```fish function __fish_command_not_found_handler --on-event fish_command_not_found # do a little dance, make a little love, get down tonight end ``` and the new hotness is ```fish function fish_command_not_found # do the thing end ``` Fixes #7293.
77 lines
2.0 KiB
ReStructuredText
77 lines
2.0 KiB
ReStructuredText
.. _cmd-fish_cmd_not_found:
|
|
|
|
fish_command_not_found - what to do when a command wasn't found
|
|
===============================================================
|
|
|
|
Synopsis
|
|
--------
|
|
|
|
::
|
|
|
|
function fish_command_not_found
|
|
...
|
|
end
|
|
|
|
|
|
Description
|
|
-----------
|
|
|
|
When fish tries to execute a command and can't find it, it invokes this function.
|
|
|
|
It can print a message to tell you about it, and it often also checks for a missing package that would include the command.
|
|
|
|
Fish ships multiple handlers for various operating systems and chooses from them when this function is loaded,
|
|
or you can define your own.
|
|
|
|
It receives the full commandline as one argument per token, so $argv[1] contains the missing command.
|
|
|
|
When you leave ``fish_command_not_found`` undefined (e.g. by adding an empty function file) or explicitly call ``__fish_default_command_not_found_handler``, fish will just print a simple error.
|
|
|
|
Example
|
|
-------
|
|
|
|
A simple handler:
|
|
|
|
::
|
|
|
|
function fish_command_not_found
|
|
echo Did not find command $argv[1]
|
|
end
|
|
|
|
> flounder
|
|
Did not find command flounder
|
|
|
|
Or the handler for OpenSUSE's command-not-found::
|
|
|
|
function fish_command_not_found
|
|
/usr/bin/command-not-found $argv[1]
|
|
end
|
|
|
|
Or the simple default handler::
|
|
|
|
function fish_command_not_found
|
|
__fish_default_command_not_found_handler $argv
|
|
end
|
|
|
|
Backwards compatibility
|
|
-----------------------
|
|
|
|
This command was introduced in fish 3.2.0. Previous versions of fish used the "fish_command_not_found" :ref:`event <event>` instead.
|
|
|
|
To define a handler that works in older versions of fish as well, define it the old way::
|
|
|
|
function __fish_command_not_found_handler --on-event fish_command_not_found
|
|
echo COMMAND WAS NOT FOUND MY FRIEND $argv[1]
|
|
end
|
|
|
|
in which case fish will define a ``fish_command_not_found`` that calls it,
|
|
or define a wrapper::
|
|
|
|
function fish_command_not_found
|
|
echo "G'day mate, could not find your command: $argv"
|
|
end
|
|
|
|
function __fish_command_not_found_handler --on-event fish_command_not_found
|
|
fish_command_not_found $argv
|
|
end
|