\section function function - create a function \subsection function-synopsis Synopsis \fish{synopsis} function NAME [OPTIONS]; BODY; end \endfish \subsection function-description Description `function` creates a new function `NAME` with the body `BODY`. A function is a list of commands that will be executed when the name of the function is given as a command. The following options are available: - `-a NAMES` or `--argument-names NAMES` assigns the value of successive command-line arguments to the names given in NAMES. - `-d DESCRIPTION` or `--description=DESCRIPTION` is a description of what the function does, suitable as a completion description. - `-w WRAPPED_COMMAND` or `--wraps=WRAPPED_COMMAND` causes the function to inherit completions from the given wrapped command. See the documentation for `complete` for more information. - `-e` or `--on-event EVENT_NAME` tells fish to run this function when the specified named event is emitted. Fish internally generates named events e.g. when showing the prompt. - `-v` or `--on-variable VARIABLE_NAME` tells fish to run this function when the variable VARIABLE_NAME changes value. - `-j PGID` or `--on-job-exit PGID` tells fish to run this function when the job with group ID PGID exits. Instead of PGID, the string 'caller' can be specified. This is only legal when in a command substitution, and will result in the handler being triggered by the exit of the job which created this command substitution. - `-p PID` or `--on-process-exit PID` tells fish to run this function when the fish child process with process ID PID exits. - `-s` or `--on-signal SIGSPEC` tells fish to run this function when the signal SIGSPEC is delivered. SIGSPEC can be a signal number, or the signal name, such as SIGHUP (or just HUP). - `-B` or `--shadow-builtin` must be specified if the function name is the same as a builtin. Specifying this flag indicates your acknowledgement that you are wrapping or replacing the builtin command. This is a safety feature to make it harder for people to inadvertently break the shell by doing things like `function test; return 0; end`. If the function name is not currently a builtin using this flag will produce an error. If you want to write a function that provides a builtin to an older version of fish you need to add something like `builtin --names | grep -q '^cmd$'; and return` to the top of the function script (where `cmd` is the name of the builtin/function). That will keep your script from replacing the builtin with your function on the newer fish version while allowing your function to provide similar functionality on older versions of fish. - `-S` or `--no-scope-shadowing` allows the function to access the variables of calling functions. Normally, any variables inside the function that have the same name as variables from the calling function are "shadowed", and their contents is independent of the calling function. - `-V` or `--inherit-variable NAME` snapshots the value of the variable `NAME` and defines a local variable with that same name and value when the function is executed. If the user enters any additional arguments after the function, they are inserted into the environment variable array `$argv`. If the `--argument-names` option is provided, the arguments are also assigned to names specified in that option. By using one of the event handler switches, a function can be made to run automatically at specific events. The user may generate new events using the emit builtin. Fish generates the following named events: - `fish_prompt`, which is emitted whenever a new fish prompt is about to be displayed. - `fish_command_not_found`, which is emitted whenever a command lookup failed. - `fish_preexec`, which is emitted right before executing an interactive command. The commandline is passed as the first parameter. Note: This event will be emitted even if the command is invalid. The commandline parameter includes the entire commandline verbatim, and may potentially include newlines. - `fish_postexec`, which is emitted right after executing an interactive command. The commandline is passed as the first parameter. Note: This event will be emitted even if the command is invalid. The commandline parameter includes the entire commandline verbatim, and may potentially include newlines. \subsection function-example Example \fish function ll ls -l $argv end \endfish will run the `ls` command, using the `-l` option, while passing on any additional files and switches to `ls`. \fish function mkdir -d "Create a directory and set CWD" command mkdir $argv if test $status = 0 switch $argv[(count $argv)] case '-*' case '*' cd $argv[(count $argv)] return end end end \endfish This will run the `mkdir` command, and if it is successful, change the current working directory to the one just created. \fish function notify set -l job (jobs -l -g) or begin; echo "There are no jobs" >&2; return 1; end function _notify_job_$job --on-job-exit $job --inherit-variable job echo -n \a # beep functions -e _notify_job_$job end end \endfish This will beep when the most recent job completes.