Provided by: fish-common_4.0.2-1_all bug

WHERE TO GO?

       If this is your first time using fish, see the tutorial.

       If  you  are  already familiar with other shells like bash and want to see the scripting differences, see
       Fish For Bash Users.

       For an overview of fish's scripting language, see The Fish Language. If it would be useful  in  a  script
       file, it's here.

       For  information  on  using  fish  interactively,  see Interactive use. If it's about key presses, syntax
       highlighting or anything else that needs an interactive terminal session, look here.

       If you need to install fish first, read on, the rest of this document will tell you how to  get,  install
       and configure fish.

INSTALLATION

       This section describes how to install, uninstall, start, and exit fish. It also explains how to make fish
       the default shell.

   Installation
       Up-to-date   instructions   for  installing  the  latest  version  of  fish  are  on  the  fish  homepage
       <https://fishshell.com/>.

       To install the  development  version  of  fish,  see  the  instructions  on  the  project's  GitHub  page
       <https://github.com/fish-shell/fish-shell>.

   Starting and Exiting
       Once fish has been installed, open a terminal. If fish is not the default shell:

       • Type fish to start a shell:

            > fish

       • Type exit to end the session:

            > exit

   Default Shell
       There are multiple ways to switch to fish (or any other shell) as your default.

       The  simplest  method  is  to  set  your  terminal  emulator (eg GNOME Terminal, Apple's Terminal.app, or
       Konsole)  to  start  fish  directly.  See  its  configuration  and  set   the   program   to   start   to
       /usr/local/bin/fish (if that's where fish is installed - substitute another location as appropriate).

       Alternatively,  you  can  set fish as your login shell so that it will be started by all terminal logins,
       including SSH.

       WARNING:
          Setting fish as your login shell may cause issues, such as an incorrect PATH. Some operating  systems,
          including a number of Linux distributions, require the login shell to be Bourne-compatible and to read
          configuration from /etc/profile. fish may not be suitable as a login shell on these systems.

       To change your login shell to fish:

       1. Add the shell to /etc/shells with:

             > echo /usr/local/bin/fish | sudo tee -a /etc/shells

       2. Change your default shell with:

             > chsh -s /usr/local/bin/fish

       Again,  substitute  the path to fish for /usr/local/bin/fish - see command -s fish inside fish. To change
       it back to another shell, just substitute /usr/local/bin/fish with /bin/bash, /bin/tcsh  or  /bin/zsh  as
       appropriate in the steps above.

   Uninstalling
       For uninstalling fish: see FAQ: Uninstalling fish.

   Shebang Line
       Because shell scripts are written in many different languages, they need to carry information about which
       interpreter should be used to execute them. For this, they are expected to have a first line, the shebang
       line, which names the interpreter executable.

       A script written in bash would need a first line like this:

          #!/bin/bash

       When the shell tells the kernel to execute the file, it will use the interpreter /bin/bash.

       For  a script written in another language, just replace /bin/bash with the interpreter for that language.
       For example: /usr/bin/python for a python script, or /usr/local/bin/fish for a fish script,  if  that  is
       where you have them installed.

       If  you  want to share your script with others, you might want to use env to allow for the interpreter to
       be installed in other locations. For example:

          #!/usr/bin/env fish
          echo Hello from fish $version

       This will call env, which then goes through PATH to find a program called "fish".  This  makes  it  work,
       whether  fish  is installed in (for example) /usr/local/bin/fish, /usr/bin/fish, or ~/.local/bin/fish, as
       long as that directory is in PATH.

       The shebang line is only used when scripts are executed without specifying the interpreter. For functions
       inside fish or when executing a script with fish /path/to/script, a  shebang  is  not  required  (but  it
       doesn't hurt!).

       When  executing files without an interpreter, fish, like other shells, tries your system shell, typically
       /bin/sh. This is needed because some scripts are shipped without a shebang line.

CONFIGURATION

       To store configuration write it to a file called ~/.config/fish/config.fish.

       .fish scripts in ~/.config/fish/conf.d/ are also automatically executed before config.fish.

       These files are read on the startup of every shell, whether interactive and/or if they're  login  shells.
       Use  status  --is-interactive  and  status  --is-login  to  do  things  only in interactive/login shells,
       respectively.

       This is the short version; for a full explanation, like for sysadmins or integration  for  developers  of
       other software, see Configuration files.

       If you want to see what you changed over fish's defaults, see fish_delta.

   Examples:
       To  add  ~/linux/bin  to  PATH  variable when using a login shell, add this to ~/.config/fish/config.fish
       file:

          if status --is-login
              set -gx PATH $PATH ~/linux/bin
          end

       This is just an example; using fish_add_path e.g. fish_add_path ~/linux/bin which only adds the  path  if
       it isn't included yet is easier.

       To run commands on exit, use an event handler that is triggered by the exit of the shell:

          function on_exit --on-event fish_exit
              echo fish is now exiting
          end

RESOURCES

       • The GitHub page <https://github.com/fish-shell/fish-shell/>

       • The official Gitter channel <https://gitter.im/fish-shell/fish-shell>

       • The          official          mailing         list         at         fish-users@lists.sourceforge.net
         <https://lists.sourceforge.net/lists/listinfo/fish-users>

       If you have an improvement for fish, you can submit it via the GitHub page.

OTHER HELP PAGES

   Frequently asked questions
   What is the equivalent to this thing from bash (or other shells)?
       See Fish for bash users

   How do I set or clear an environment variable?
       Use the set command:

          set -x key value # typically set -gx key value
          set -e key

       Since fish 3.1 you can set an environment variable for just one command using the key=value some  command
       syntax,  like  in  other shells.  The two lines below behave identically - unlike other shells, fish will
       output value both times:

          key=value echo $key
          begin; set -lx key value; echo $key; end

       Note that "exported" is not a scope, but an additional bit  of  state.  A  variable  can  be  global  and
       exported  or  local  and  exported  or  even  universal and exported. Typically it makes sense to make an
       exported variable global.

   How do I check whether a variable is defined?
       Use set -q var.  For example, if set -q var; echo variable defined; end.  To check multiple variables you
       can combine with and and or like so:

          if set -q var1; or set -q var2
              echo either variable defined
          end

       Keep in mind that a defined variable could also be empty, either by having no elements (if set  like  set
       var) or only empty elements (if set like set var ""). Read on for how to deal with those.

   How do I check whether a variable is not empty?
       Use  string length -q -- $var.  For example, if string length -q -- $var; echo not empty; end.  Note that
       string length will interpret a list of multiple variables as a disjunction (meaning any/or):

          if string length -q -- $var1 $var2 $var3
              echo at least one of these variables is not empty
          end

       Alternatively, use test -n "$var", but remember that the variable must be double-quoted.  For example, if
       test -n "$var"; echo not empty; end. The test command provides its own and (-a) and or (-o):

          if test -n "$var1" -o -n "$var2" -o -n "$var3"
              echo at least one of these variables is not empty
          end

       If you want to know if a variable has no elements, use set -q var[1].

   Why doesn't set -Ux (exported universal variables) seem to work?
       A global variable of the same name already exists.

       Environment variables such as EDITOR or TZ can be set universally using set -Ux.  However, if there is an
       environment variable already set before fish starts (such as by login scripts or system  administrators),
       it  is  imported  into fish as a global variable. The variable scopes are searched from the "inside out",
       which means that local variables are checked first, followed by global variables, and  finally  universal
       variables.

       This means that the global value takes precedence over the universal value.

       To  avoid this problem, consider changing the setting which fish inherits. If this is not possible, add a
       statement to your configuration file (usually ~/.config/fish/config.fish):

          set -gx EDITOR vim

   How do I run a command every login? What's fish's equivalent to .bashrc or .profile?
       Edit the file ~/.config/fish/config.fish [1], creating it if it does not exist (Note the leading period).

       Unlike .bashrc and .profile, this file is always read, even in non-interactive or login shells.

       To do something only in interactive shells, check status is-interactive like:

          if status is-interactive
              # use the coolbeans theme
              fish_config theme choose coolbeans
          end

       [1]  The "~/.config" part of this can be set via $XDG_CONFIG_HOME, that's just the default.

   How do I set my prompt?
       The    prompt    is     the     output     of     the     fish_prompt     function.     Put     it     in
       ~/.config/fish/functions/fish_prompt.fish. For example, a simple prompt is:

          function fish_prompt
              set_color $fish_color_cwd
              echo -n (prompt_pwd)
              set_color normal
              echo -n ' > '
          end

       You  can also use the Web configuration tool, fish_config, to preview and choose from a gallery of sample
       prompts.

       Or you can use fish_config from the commandline:

          > fish_config prompt show
          # displays all the prompts fish ships with
          > fish_config prompt choose disco
          # loads the disco prompt in the current shell
          > fish_config prompt save
          # makes the change permanent

       If you want to modify your existing prompt, you can use funced and funcsave like:

          >_ funced fish_prompt
          # This opens up your editor (set in $EDITOR).
          # Modify the function,
          # save the file and repeat to your liking.
          # Once you are happy with it:
          >_ funcsave fish_prompt

       This also applies to fish_right_prompt and fish_mode_prompt.

   Why does my prompt show a [I]?
       That's  the  fish_mode_prompt.  It  is  displayed  by  default  when  you've  activated  vi  mode   using
       fish_vi_key_bindings.

       If  you haven't activated vi mode on purpose, you might have installed a third-party theme or plugin that
       does it.

       If you want to change or disable this display, modify the fish_mode_prompt  function,  for  instance  via
       funced.

   How do I customize my syntax highlighting colors?
       Use the web configuration tool, fish_config, or alter the fish_color family of environment variables.

       You can also use fish_config on the commandline, like:

          > fish_config theme show
          # to demonstrate all the colorschemes
          > fish_config theme choose coolbeans
          # to load the "coolbeans" theme
          > fish_config theme save
          # to make the change permanent

   How do I change the greeting message?
       Change the value of the variable fish_greeting or create a fish_greeting function. For example, to remove
       the greeting use:

          set -U fish_greeting

       Or if you prefer not to use a universal variable, use:

          set -g fish_greeting

       in config.fish.

   How do I run a command from history?
       Type some part of the command, and then hit the up () or down () arrow keys to navigate through history
       matches, or press ctrl-r to open the history in a searchable pager. In this pager you can press ctrl-r or
       ctrl-s to move to older or younger history respectively.

       Additional default key bindings include ctrl-p (up) and ctrl-n (down). See Searchable command history for
       more information.

   Why doesn't history substitution ("!$" etc.) work?
       Because  history  substitution  is an awkward interface that was invented before interactive line editing
       was even possible. Instead of adding this pseudo-syntax, fish opts for nice history searching and  recall
       features.   Switching  requires  a  small change of habits: if you want to modify an old line/word, first
       recall it, then edit.

       As a special case, most of the time history substitution is used as sudo !!.  In  that  case  just  press
       alt-s,  and  it  will  recall  your  last  commandline with sudo prefixed (or toggle a sudo prefix on the
       current commandline if there is anything).

       In general, fish's history recall works like this:

       • Like other shells, the Up arrow, up recalls whole lines, starting  from  the  last  executed  line.  So
         instead of typing !!, you would just hit the up-arrow.

       • If  the  line  you  want is far back in the history, type any part of the line and then press Up one or
         more times.  This will filter the recalled lines to ones that include this text, and you  will  get  to
         the  line  you  want much faster.  This replaces "!vi", "!?bar.c" and the like. If you want to see more
         context, you can press ctrl-r to open the history in the pager.

       • alt-up recalls individual arguments, starting from the last argument in the last  executed  line.  This
         can be used instead of "!$".

       See documentation for more details about line editing in fish.

       That being said, you can use Abbreviations to implement history substitution. Here's just !!:

          function last_history_item; echo $history[1]; end
          abbr -a !! --position anywhere --function last_history_item

       Run  this  and  !! will be replaced with the last history entry, anywhere on the commandline. Put it into
       config.fish to keep it.

   How do I run a subcommand? The backtick doesn't work!
       fish uses parentheses for subcommands. For example:

          for i in (ls)
              echo $i
          end

       It also supports the familiar $() syntax, even in quotes. Backticks are not supported  because  they  are
       discouraged even in POSIX shells. They nest poorly and are hard to tell from single quotes ('').

   My command (pkg-config) gives its output as a single long string?
       Unlike  other  shells,  fish  splits  command  substitutions  only on newlines, not spaces or tabs or the
       characters in $IFS.

       That means if you run

          count (printf '%s ' a b c)

       It will print 1, because the "a b c " is used in one piece. But if you do

          count (printf '%s\n' a b c)

       it will print 3, because it gave count the arguments "a", "b" and "c" separately.

       In the overwhelming majority of cases, splitting on spaces is unwanted, so this is an  improvement.  This
       is why you hear about problems with filenames with spaces, after all.

       However sometimes, especially with pkg-config and related tools, splitting on spaces is needed.

       In these cases use string split -n " " like:

          g++ example_01.cpp (pkg-config --cflags --libs gtk+-2.0 | string split -n " ")

       The -n is so empty elements are removed like POSIX shells would do.

   How do I get the exit status of a command?
       Use the $status variable. This replaces the $? variable used in other shells.

          somecommand
          if test $status -eq 7
              echo "That's my lucky number!"
          end

       If you are just interested in success or failure, you can run the command directly as the if-condition:

          if somecommand
              echo "Command succeeded"
          else
              echo "Command failed"
          end

       Or if you just want to do one command in case the first succeeded or failed, use and or or:

          somecommand
          or someothercommand

       See the Conditions and the documentation for test and if for more information.

   My command prints "No matches for wildcard" but works in bash
       In short: quote or escape the wildcard:

          scp user@ip:/dir/"string-*"

       When  fish  sees an unquoted *, it performs wildcard expansion. That means it tries to match filenames to
       the given string.

       If the wildcard doesn't match any files, fish prints an error instead of running the command:

          > echo *this*does*not*exist
          fish: No matches for wildcard '*this*does*not*exist'. See `help expand`.
          echo *this*does*not*exist
               ^

       Now, bash also tries to match files in this case, but when it doesn't find a match, it passes  along  the
       literal wildcard string instead.

       That means that commands like the above

          scp user@ip:/dir/string-*

       or

          apt install postgres-*

       appear  to  work,  because most of the time the string doesn't match and so it passes along the string-*,
       which is then interpreted by the receiving program.

       But it also means that these commands can stop working at any moment once a matching file is  encountered
       (because  it  has  been created or the command is executed in a different working directory), and to deal
       with that bash needs workarounds like

          for f in ./*.mpg; do
                # We need to test if the file really exists because
                # the wildcard might have failed to match.
                test -f "$f" || continue
                mympgviewer "$f"
          done

       (from http://mywiki.wooledge.org/BashFAQ/004)

       For these reasons, fish does not do this, and instead expects asterisks to be quoted or escaped  if  they
       aren't supposed to be expanded.

       This is similar to bash's "failglob" option.

   Why won't SSH/SCP/rsync connect properly when fish is my login shell?
       This  problem  may  show  up  as  messages like "Received message too long", "open terminal failed: not a
       terminal",   "Bad   packet   length",    or    "Connection    refused"    with    strange    output    in
       ssh_exchange_identification messages in the debug log.

       This  usually happens because fish reads the user configuration file (~/.config/fish/config.fish) always,
       whether it's in an interactive or login or non-interactive or non-login shell.

       This simplifies matters, but it also means when config.fish generates output, it will  do  that  even  in
       non-interactive shells like the one ssh/scp/rsync start when they connect.

       Anything  in  config.fish  that  produces  output should be guarded with status is-interactive (or status
       is-login if you prefer):

          if status is-interactive
            ...
          end

       The same applies for example when you start tmux in  config.fish  without  guards,  which  will  cause  a
       message like sessions should be nested with care, unset $TMUX to force.

   I'm   getting  weird  graphical  glitches  (a  staircase  effect,  ghost  characters,  cursor  in  the  wrong
       position,...)?
       In a terminal, the application running inside it and the terminal itself need to agree on  the  width  of
       characters in order to handle cursor movement.

       This  is  more  important  to  fish  than  other  shells  because  features  like syntax highlighting and
       autosuggestions are implemented by moving the cursor.

       Sometimes, there is disagreement on the width. There are numerous causes and fixes for this:

       • It is possible the character is simply too new for your system to know -  in  this  case  you  need  to
         refrain from using it.

       • Fish or your terminal might not know about the character or handle it wrong - in this case fish or your
         terminal needs to be fixed, or you need to update to a fixed version.

       • The  character  has  an  "ambiguous"  width and fish thinks that means a width of X while your terminal
         thinks it's Y.  In  this  case  you  either  need  to  change  your  terminal's  configuration  or  set
         $fish_ambiguous_width to the correct value.

       • The  character  is  an  emoji  and  the  host system only supports Unicode 8, while you are running the
         terminal on a system that uses Unicode >= 9. In this case set $fish_emoji_width to 2.

       This also means that a few things are unsupportable:

       • Non-monospace fonts - there is no way for fish to figure out what width a specific character has as  it
         has no influence on the terminal's font rendering.

       • Different widths for multiple ambiguous width characters - there is no way for fish to know which width
         you assign to each character.

   Uninstalling fish
       If  you  want  to uninstall fish, first make sure fish is not set as your shell. Run chsh -s /bin/bash if
       you are not sure.

       If you installed it with a package manager, just use that package manager's uninstall  function.  If  you
       built fish yourself, assuming you installed it to /usr/local, do this:

          rm -Rf /usr/local/etc/fish /usr/local/share/fish ~/.config/fish
          rm /usr/local/share/man/man1/fish*.1
          cd /usr/local/bin
          rm -f fish fish_indent

   Interactive use
       Fish prides itself on being really nice to use interactively. That's down to a few features we'll explain
       in the next few sections.

       Fish is used by giving commands in the fish language, see The Fish Language for information on that.

   Help
       Fish  has an extensive help system. Use the help command to obtain help on a specific subject or command.
       For instance, writing help syntax displays the syntax section of this documentation.

       Fish also has man pages for its commands, and translates the help pages to man pages.  For  example,  man
       set will show the documentation for set as a man page.

       Help  on  a  specific builtin can also be obtained with the -h parameter. For instance, to obtain help on
       the fg builtin, either type fg -h or help fg.

       The main page can be viewed via help index (or just help) or man fish-doc. The  tutorial  can  be  viewed
       with help tutorial or man fish-tutorial.

   Autosuggestions
       fish  suggests  commands as you type, based on command history, completions, and valid file paths. As you
       type commands, you will see a suggestion offered after the cursor, in a muted gray color  (which  can  be
       changed with the fish_color_autosuggestion variable).

       To  accept the autosuggestion (replacing the command line contents), press right () or ctrl-f. To accept
       the first suggested word, press alt-right () or alt-f. If the autosuggestion is not what you want,  just
       ignore it: it won't execute unless you accept it.

       Autosuggestions are a powerful way to quickly summon frequently entered commands, by typing the first few
       characters. They are also an efficient technique for navigating through directory hierarchies.

       If you don't like autosuggestions, you can disable them by setting $fish_autosuggestion_enabled to 0:

          set -g fish_autosuggestion_enabled 0

   Tab Completion
       Tab  completion  is a time saving feature of any modern shell. When you type tab, fish tries to guess the
       rest of the word under the cursor. If it finds just one possibility, it inserts it. If it finds more,  it
       inserts  the  longest  unambiguous part and then opens a menu (the "pager") that you can navigate to find
       what you're looking for.

       The pager can be navigated with the arrow keys, pageup / pagedown, tab or shift-tab. Pressing ctrl-s (the
       pager-toggle-search binding - / in vi mode) opens up a search menu that you can use to filter the list.

       Fish provides some general purpose completions, like for commands, variable names, usernames or files.

       It also provides a large number of program specific scripted completions. Most of these  completions  are
       simple options like the -l option for ls, but a lot are more advanced. For example:

       • man and whatis show the installed manual pages as completions.

       • make uses targets in the Makefile in the current directory as completions.

       • mount uses mount points specified in fstab as completions.

       • apt, rpm and yum show installed or installable packages

       You  can also write your own completions or install some you got from someone else. For that, see Writing
       your own completions.

       Completion  scripts  are  loaded  on  demand,  just  like  functions   are.   The   difference   is   the
       $fish_complete_path  list  is used instead of $fish_function_path. Typically you can drop new completions
       in ~/.config/fish/completions/name-of-command.fish and fish will find them automatically.

   Syntax highlighting
       Fish interprets the command line as it is typed and uses syntax highlighting  to  provide  feedback.  The
       most important feedback is the detection of potential errors. By default, errors are marked red.

       Detected errors include:

       • Non-existing commands.

       • Reading from or appending to a non-existing file.

       • Incorrect use of output redirects

       • Mismatched parenthesis

       To  customize  the syntax highlighting, you can set the environment variables listed in the Variables for
       changing highlighting colors section.

       Fish also provides pre-made color themes you can pick with fish_config. Running just fish_config opens  a
       browser interface, or you can use fish_config theme in the terminal.

       For example, to disable nearly all coloring:

          fish_config theme choose None

       Or, to see all themes, right in your terminal:

          fish_config theme show

   Syntax highlighting variables
       The  colors  used  by  fish  for  syntax highlighting can be configured by changing the values of various
       variables. The value of these variables can be one of the colors accepted by the set_color  command.  The
       modifier switches accepted by set_color like --bold, --dim, --italics, --reverse and --underline are also
       accepted.

       Example: to make errors highlighted and red, use:

          set fish_color_error red --bold

       The following variables are available to change the highlighting colors in fish:
                    ┌───────────────────────────────────┬───────────────────────────────────────┐
                    │ Variable                          │ Meaning                               │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ default color                         │
                    │        fish_color_normal          │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ commands like echo                    │
                    │        fish_color_command         │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ keywords like if - this falls back on │
                    │        fish_color_keyword         │ the command color if unset            │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ quoted text like "abc"                │
                    │        fish_color_quote           │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ IO redirections like >/dev/null       │
                    │        fish_color_redirection     │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ process separators like ; and &       │
                    │        fish_color_end             │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ syntax errors                         │
                    │        fish_color_error           │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ ordinary command parameters           │
                    │        fish_color_param           │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ parameters that are filenames (if the │
                    │        fish_color_valid_path      │ file exists)                          │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ options  starting with "-", up to the │
                    │        fish_color_option          │ first "--" parameter                  │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ comments like '# important'           │
                    │        fish_color_comment         │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ selected text in vi visual mode       │
                    │        fish_color_selection       │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ parameter expansion operators like  * │
                    │        fish_color_operator        │ and ~                                 │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ character escapes like \n and \x70    │
                    │        fish_color_escape          │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ autosuggestions (the proposed rest of │
                    │        fish_color_autosuggestion  │ a command)                            │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ the  current working directory in the │
                    │        fish_color_cwd             │ default prompt                        │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ the current working directory in  the │
                    │        fish_color_cwd_root        │ default prompt for the root user      │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ the username in the default prompt    │
                    │        fish_color_user            │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ the hostname in the default prompt    │
                    │        fish_color_host            │                                       │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ the  hostname  in  the default prompt │
                    │        fish_color_host_remote     │ for remote sessions (like ssh)        │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ the last command's nonzero exit  code │
                    │        fish_color_status          │ in the default prompt                 │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ the  '^C'  indicator  on  a  canceled │
                    │        fish_color_cancel          │ command                               │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ history search matches  and  selected │
                    │        fish_color_search_match    │ pager items (background only)         │
                    ├───────────────────────────────────┼───────────────────────────────────────┤
                    │                                   │ the  current  position in the history │
                    │        fish_color_history_current │ for commands like dirh and cdh        │
                    └───────────────────────────────────┴───────────────────────────────────────┘

       If a variable isn't set or is empty, fish usually tries $fish_color_normal, except for:

       • $fish_color_keyword, where it tries $fish_color_command first.

       • $fish_color_option, where it tries $fish_color_param first.

       • For $fish_color_valid_path, if that doesn't have a color, but only modifiers,  it  adds  those  to  the
         color  that  would  otherwise be used, like $fish_color_param. But if valid paths have a color, it uses
         that and adds in modifiers from the other color.

   Pager color variables
       fish will sometimes present a list of choices in a table, called the pager.

       Example: to set the background of each pager row, use:

          set fish_pager_color_background --background=white

       To have black text on alternating white and gray backgrounds:

          set fish_pager_color_prefix black
          set fish_pager_color_completion black
          set fish_pager_color_description black
          set fish_pager_color_background --background=white
          set fish_pager_color_secondary_background --background=brwhite

       Variables affecting the pager colors:
              ┌───────────────────────────────────────────────┬───────────────────────────────────────┐
              │ Variable                                      │ Meaning                               │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ the progress bar at the  bottom  left │
              │        fish_pager_color_progress              │ corner                                │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ the background color of a line        │
              │        fish_pager_color_background            │                                       │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ the  prefix  string,  i.e. the string │
              │        fish_pager_color_prefix                │ that is to be completed               │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ the  completion  itself,   i.e.   the │
              │        fish_pager_color_completion            │ proposed rest of the string           │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ the completion description            │
              │        fish_pager_color_description           │                                       │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ background of the selected completion │
              │        fish_pager_color_selected_background   │                                       │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ prefix of the selected completion     │
              │        fish_pager_color_selected_prefix       │                                       │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ suffix of the selected completion     │
              │        fish_pager_color_selected_completion   │                                       │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ description     of    the    selected │
              │        fish_pager_color_selected_description  │ completion                            │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ background of every second unselected │
              │        fish_pager_color_secondary_background  │ completion                            │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ prefix  of  every  second  unselected │
              │        fish_pager_color_secondary_prefix      │ completion                            │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ suffix  of  every  second  unselected │
              │        fish_pager_color_secondary_completion  │ completion                            │
              ├───────────────────────────────────────────────┼───────────────────────────────────────┤
              │                                               │ description    of    every     second │
              │        fish_pager_color_secondary_description │ unselected completion                 │
              └───────────────────────────────────────────────┴───────────────────────────────────────┘

       When  the  secondary or selected variables aren't set or are empty, the normal variables are used, except
       for $fish_pager_color_selected_background, where the  background  of  $fish_color_search_match  is  tried
       first.

   Abbreviations
       To  avoid needless typing, a frequently-run command like git checkout can be abbreviated to gco using the
       abbr command.

          abbr -a gco git checkout

       After entering gco and pressing space or enter, a gco in command position will turn into git checkout  in
       the command line. If you want to use a literal gco sometimes, use ctrl-space [1].

       Abbreviations are a lot more powerful than just replacing literal strings. For example you can make going
       up a number of directories easier with this:

          function multicd
              echo cd (string repeat -n (math (string length -- $argv[1]) - 1) ../)
          end
          abbr --add dotdot --regex '^\.\.+$' --function multicd

       Now, .. transforms to cd ../, while ... turns into cd ../../ and .... expands to cd ../../../.

       The  advantage  over  aliases is that you can see the actual command before using it, add to it or change
       it, and the actual command will be stored in history.

       [1]  Any binding that executes the expand-abbr or execute bind function  will  expand  abbreviations.  By
            default ctrl-space is bound to just inserting a space.

   Programmable prompt
       When  it  is  fish's  turn  to ask for input (like after it started or the command ended), it will show a
       prompt. Often this looks something like:

          you@hostname ~>

       This prompt is determined by running the fish_prompt and fish_right_prompt functions.

       The output of the former is displayed on the left and the latter's  output  on  the  right  side  of  the
       terminal.  For vi mode, the output of fish_mode_prompt will be prepended on the left.

       Fish  ships  with  a  few prompts which you can see with fish_config. If you run just fish_config it will
       open a web interface [2] where you'll be shown the prompts and can pick which one you  want.  fish_config
       prompt show will show you the prompts right in your terminal.

       For  example  fish_config  prompt choose disco will temporarily select the "disco" prompt. If you like it
       and decide to keep it, run fish_config prompt save.

       You can also change these functions yourself by running funced fish_prompt and funcsave fish_prompt  once
       you are happy with the result (or fish_right_prompt if you want to change that).

       [2]  The web interface runs purely locally on your computer and requires python to be installed.

   Configurable greeting
       When it is started interactively, fish tries to run the fish_greeting function. The default fish_greeting
       prints  a  simple  message. You can change its text by changing the $fish_greeting variable, for instance
       using a universal variable:

          set -U fish_greeting

       or you can set it globally in config.fish:

          set -g fish_greeting 'Hey, stranger!'

       or you can script it by changing the function:

          function fish_greeting
              random choice "Hello!" "Hi" "G'day" "Howdy"
          end

       save this in config.fish or a function file. You can also use funced and funcsave to edit it easily.

   Programmable title
       When using most terminals, it is possible to set the text displayed  in  the  titlebar  of  the  terminal
       window.  Fish does this by running the fish_title function. It is executed before and after a command and
       the output is used as a titlebar message.

       The status current-command builtin will always return the name of the job to be put into  the  foreground
       (or fish if control is returning to the shell) when the fish_title function is called. The first argument
       will contain the most recently executed foreground command as a string.

       The  default  title  shows the hostname if connected via ssh, the currently running command (unless it is
       fish) and the current working directory. All of this is shortened to not make the tab too wide.

       Examples:

       To show the last command and working directory in the title:

          function fish_title
              # `prompt_pwd` shortens the title. This helps prevent tabs from becoming very wide.
              echo $argv[1] (prompt_pwd)
              pwd
          end

   Command line editor
       The fish editor features copy and paste, a searchable history and many editor functions that can be bound
       to special keyboard shortcuts.

       Like bash and other shells, fish includes two sets of keyboard shortcuts (or key bindings): one  inspired
       by  the  Emacs  text  editor,  and  one by the vi text editor. The default editing mode is Emacs. You can
       switch to vi mode by running fish_vi_key_bindings and switch back with fish_default_key_bindings. You can
       also make your own key bindings by creating a function and setting the fish_key_bindings variable to  its
       name. For example:

          function fish_hybrid_key_bindings --description \
          "Vi-style bindings that inherit emacs-style bindings in all modes"
              for mode in default insert visual
                  fish_default_key_bindings -M $mode
              end
              fish_vi_key_bindings --no-erase
          end
          set -g fish_key_bindings fish_hybrid_key_bindings

       While  the key bindings included with fish include many of the shortcuts popular from the respective text
       editors, they are not a complete implementation. They include a shortcut to open the current command line
       in your preferred editor (alt-e by default) if you need the full power of your editor.

   Shared bindings
       Some bindings are common across Emacs and vi mode, because they aren't text editing bindings, or  because
       what vi/Vim does for a particular key doesn't make sense for a shell.

       • tab  completes  the  current token. shift-tab completes the current token and starts the pager's search
         mode. tab is the same as ctrl-i.

       • left () and right () move the cursor left or right by one character. If the cursor is already at  the
         end of the line, and an autosuggestion is available, right () accepts the autosuggestion.

       • enter  executes  the current commandline or inserts a newline if it's not complete yet (e.g. a ) or end
         is missing).

       • alt-enter inserts a newline at the cursor position. This is useful to  add  a  line  to  a  commandline
         that's already complete.

       • alt-left () and alt-right () move the cursor one word left or right (to the next space or punctuation
         mark),  or  moves forward/backward in the directory history if the command line is empty. If the cursor
         is already at the end of the line, and an autosuggestion is available, alt-right () (or alt-f) accepts
         the first word in the suggestion.

       • ctrl-left () and ctrl-right () move the cursor one word left or right. These accept one word  of  the
         autosuggestion - the part they'd move over.

       • shift-left  ()  and  shift-right  ()  move  the  cursor  one  word left or right, without stopping on
         punctuation. These accept one big word of the autosuggestion.

       • up () and down () (or ctrl-p and ctrl-n for emacs aficionados) search the  command  history  for  the
         previous/next command containing the string that was specified on the commandline before the search was
         started.  If  the  commandline  was  empty when the search started, all commands match. See the history
         section for more information on history searching.

       • alt-up () and alt-down () search the command history for the previous/next token containing the token
         under the cursor before the search was started. If the commandline was not on a token when  the  search
         started, all tokens match. See the history section for more information on history searching.

       • ctrl-c interrupts/kills whatever is running (SIGINT).

       • ctrl-d deletes one character to the right of the cursor. If the command line is empty, ctrl-d will exit
         fish.

       • ctrl-u removes contents from the beginning of line to the cursor (moving it to the killring).

       • ctrl-l clears and repaints the screen.

       • ctrl-w  removes  the previous path component (everything up to the previous "/", ":" or "@") (moving it
         to the Copy and paste (Kill Ring)).

       • ctrl-x copies the current buffer to the system's clipboard, ctrl-v inserts the clipboard contents. (see
         fish_clipboard_copy and fish_clipboard_paste)

       • alt-d or ctrl-delete moves the next word to the Copy and paste (Kill Ring).

       • alt-d lists the directory history if the command line is empty.

       • alt-delete moves the next argument to the Copy and paste (Kill Ring).

       • shift-delete removes the current history item or autosuggestion from the command history.

       • alt-h (or f1) shows the manual page for the current command, if one exists.

       • alt-l lists the contents of the current directory, unless the cursor is over a directory  argument,  in
         which case the contents of that directory will be listed.

       • alt-o  opens the file at the cursor in a pager. If the cursor is in command position and the command is
         a script, it will instead open that script in  your  editor.  The  editor  is  chosen  from  the  first
         available of the $VISUAL or $EDITOR variables.

       • alt-p adds the string &| less; to the end of the job under the cursor. The result is that the output of
         the command will be paged.

       • alt-w prints a short description of the command under the cursor.

       • alt-e  edits  the  current  command  line  in  an  external editor. The editor is chosen from the first
         available of the $VISUAL or $EDITOR variables.

       • alt-v Same as alt-e.

       • alt-s Prepends sudo to the current commandline. If the commandline is empty, prepend sudo to  the  last
         commandline.

       • ctrl-space  Inserts  a  space  without  expanding  an  abbreviation.  For vi mode, this only applies to
         insert-mode.

   Emacs mode commands
       To enable emacs mode, use fish_default_key_bindings. This is also the default.

       • home or ctrl-a moves the cursor to the beginning of the line.

       • end or ctrl-e moves to the end of line. If the cursor is already  at  the  end  of  the  line,  and  an
         autosuggestion is available, end or ctrl-e accepts the autosuggestion.

       • ctrl-b,  ctrl-f  move the cursor one character left or right or accept the autosuggestion just like the
         left () and right () shared bindings (which are available as well).

       • alt-b, alt-f move the cursor one word left or right, or accept one word of the autosuggestion.  If  the
         command line is empty, moves forward/backward in the directory history instead.

       • ctrl-n, ctrl-p move the cursor up/down or through history, like the up and down arrow shared bindings.

       • delete or backspace or ctrl-h removes one character forwards or backwards respectively.

       • alt-backspace removes one word backwards. If supported by the terminal, ctrl-backspace does the same.

       • alt-< moves to the beginning of the commandline, alt-> moves to the end.

       • ctrl-k deletes from the cursor to the end of line (moving it to the Copy and paste (Kill Ring)).

       • escape and ctrl-g cancel the current operation. Immediately after an unambiguous completion this undoes
         it.

       • alt-c capitalizes the current word.

       • alt-u makes the current word uppercase.

       • ctrl-t transposes the last two characters.

       • alt-t transposes the last two words.

       • ctrl-z, ctrl-_ (ctrl-/ on some terminals) undo the most recent edit of the line.

       • alt-/ or ctrl-shift-z reverts the most recent undo.

       • ctrl-r  opens  the  history  in a pager. This will show history entries matching the search, a few at a
         time. Pressing ctrl-r again will search older entries, pressing ctrl-s (that  otherwise  toggles  pager
         search) will go to newer entries. The search bar will always be selected.

       You can change these key bindings using the bind builtin.

   Vi mode commands
       Vi  mode  allows  for the use of vi-like commands at the prompt. Initially, insert mode is active. escape
       enters command mode. The commands available in command, insert and visual mode are  described  below.  Vi
       mode shares some bindings with Emacs mode.

       To  enable  vi  mode, use fish_vi_key_bindings.  It is also possible to add all Emacs mode bindings to vi
       mode by using something like:

          function fish_user_key_bindings
              # Execute this once per mode that emacs bindings should be used in
              fish_default_key_bindings -M insert

              # Then execute the vi-bindings so they take precedence when there's a conflict.
              # Without --no-erase fish_vi_key_bindings will default to
              # resetting all bindings.
              # The argument specifies the initial mode (insert, "default" or visual).
              fish_vi_key_bindings --no-erase insert
          end

       When in vi mode, the fish_mode_prompt function will display a mode indicator to the left of  the  prompt.
       To  disable this feature, override it with an empty function. To display the mode elsewhere (like in your
       right prompt), use the output of the fish_default_mode_prompt function.

       When a binding switches the mode, it will repaint the mode-prompt if it  exists,  and  the  rest  of  the
       prompt  only  if  it  doesn't.  So  if  you  want a mode-indicator in your fish_prompt, you need to erase
       fish_mode_prompt  e.g.  by  adding  an  empty  file  at   ~/.config/fish/functions/fish_mode_prompt.fish.
       (Bindings that change the mode are supposed to call the repaint-mode bind function, see bind)

       The  fish_vi_cursor function will be used to change the cursor's shape depending on the mode in supported
       terminals. The following snippet can be used to manually configure cursors after enabling vi mode:

          # Emulates vim's cursor shape behavior
          # Set the normal and visual mode cursors to a block
          set fish_cursor_default block
          # Set the insert mode cursor to a line
          set fish_cursor_insert line
          # Set the replace mode cursors to an underscore
          set fish_cursor_replace_one underscore
          set fish_cursor_replace underscore
          # Set the external cursor to a line. The external cursor appears when a command is started.
          # The cursor shape takes the value of fish_cursor_default when fish_cursor_external is not specified.
          set fish_cursor_external line
          # The following variable can be used to configure cursor shape in
          # visual mode, but due to fish_cursor_default, is redundant here
          set fish_cursor_visual block

       Additionally, blink can be added after each of the cursor shape parameters to set a  blinking  cursor  in
       the specified shape.

       Fish knows the shapes "block", "line" and "underscore", other values will be ignored.

       If  the  cursor  shape does not appear to be changing after setting the above variables, it's likely your
       terminal emulator does not support the capabilities necessary to do this.

   Command mode
       Command mode is also known as normal mode.

       • h moves the cursor left.

       • l moves the cursor right.

       • k and j search the command history for  the  previous/next  command  containing  the  string  that  was
         specified  on  the  commandline  before  the  search was started. If the commandline was empty when the
         search started, all commands match. See the history section for more information on history  searching.
         In multi-line commands, they move the cursor up and down respectively.

       • i enters insert mode at the current cursor position.

       • I enters insert mode at the beginning of the line.

       • v enters visual mode at the current cursor position.

       • a enters insert mode after the current cursor position.

       • A enters insert mode at the end of the line.

       • o inserts a new line under the current one and enters insert modeO (capital-"o") inserts a new line above the current one and enters insert mode0 (zero) moves the cursor to beginning of line (remaining in command mode).

       • d,d deletes the current line and moves it to the Copy and paste (Kill Ring).

       • D deletes text after the current cursor position and moves it to the Copy and paste (Kill Ring).

       • p pastes text from the Copy and paste (Kill Ring).

       • u undoes the most recent edit of the command line.

       • ctrl-r redoes the most recent edit.

       • [  and  ]  search the command history for the previous/next token containing the token under the cursor
         before the search was started. See the history section for more information on history searching.

       • / opens the history in a pager. This will show history entries matching the search, a few  at  a  time.
         Pressing it again will search older entries, pressing ctrl-s (that otherwise toggles pager search) will
         go to newer entries. The search bar will always be selected.

       • backspace moves the cursor left.

       • g / G moves the cursor to the beginning/end of the commandline, respectively.

       • :,q exits fish.

   Insert modeescape enters command mode.

       • backspace removes one character to the left.

       • ctrl-n accepts the autosuggestion.

   Visual modeleft (``←`) and right`(``→`) extend the selection backward/forward by one character.

       • h moves the cursor left.

       • l moves the cursor right.

       • k moves the cursor up.

       • j moves the cursor down.

       • b and w extend the selection backward/forward by one word.

       • d and x move the selection to the Copy and paste (Kill Ring) and enter command mode.

       • escape and ctrl-c enter command mode.

       • c and s remove the selection and switch to insert mode.

       • X moves the entire line to the Copy and paste (Kill Ring), and enters command mode.

       • y copies the selection to the Copy and paste (Kill Ring), and enters command mode.

       • ~ toggles the case (upper/lower) on the selection, and enters command mode.

       • ",*,y copies the selection to the clipboard, and enters command mode.

   Custom bindings
       In addition to the standard bindings listed here, you can also define your own with bind:

          # Just clear the commandline on control-c
          bind ctrl-c 'commandline -r ""'

       Put bind statements into config.fish or a function called fish_user_key_bindings.

       If  you  change  your  mind  on  a binding and want to go back to fish's default, you can simply erase it
       again:

          bind --erase ctrl-c

       Fish remembers its preset bindings and so it will take effect  again.  This  saves  you  from  having  to
       remember what it was before and add it again yourself.

       If  you  use  vi bindings, note that bind will by default bind keys in command mode. To bind something in
       insert mode:

          bind --mode insert ctrl-c 'commandline -r ""'

   Key sequences
       To find out the name of a key, you can use fish_key_reader.

          > fish_key_reader # Press Alt + right-arrow
          Press a key:
          bind alt-right 'do something'

       Note that the historical way the terminal encodes keys and sends them to the application (fish,  in  this
       case)  makes  a lot of combinations indistinguishable or unbindable. In the usual encoding, ctrl-i is the
       same as the tab key, and shift cannot be detected when ctrl is also pressed.

       There are more powerful encoding schemes, and fish tries to tell the terminal to turn them on, but  there
       are  still many terminals that do not support them. When fish_key_reader prints the same sequence for two
       different keys, then that is because your terminal sends the same sequence  for  them,  and  there  isn't
       anything  fish  can  do  about  it. It is our hope that these schemes will become more widespread, making
       input more flexible.

       In the historical scheme, escape is the same thing as alt in a terminal. To distinguish between  pressing
       escape  and  then  another key, and pressing alt and that key (or an escape sequence the key sends), fish
       waits  for  a  certain  time  after  seeing  an  escape  character.  This   is   configurable   via   the
       fish_escape_delay_ms variable.

       If  you want to be able to press escape and then a character and have it count as alt+that character, set
       it to a higher value, e.g.:

          set -g fish_escape_delay_ms 100

       Similarly, to disambiguate other keypresses where you've bound a subsequence and a longer sequence,  fish
       has fish_sequence_key_delay_ms:

          # This binds the sequence j,k to switch to normal mode in vi mode.
          # If you kept it like that, every time you press "j",
          # fish would wait for a "k" or other key to disambiguate
          bind -M insert -m default j,k cancel repaint-mode

          # After setting this, fish only waits 200ms for the "k",
          # or decides to treat the "j" as a separate sequence, inserting it.
          set -g fish_sequence_key_delay_ms 200

   Copy and paste (Kill Ring)
       Fish  uses an Emacs-style kill ring for copy and paste functionality. For example, use ctrl-k (kill-line)
       to cut from the current cursor position to the end of the line. The string that is cut (a.k.a. killed  in
       emacs-ese)  is  inserted  into  a list of kills, called the kill ring. To paste the latest value from the
       kill ring (emacs calls this "yanking") use ctrl-y (the yank input function).  After  pasting,  use  alt-y
       (yank-pop) to rotate to the previous kill.

       Copy  and  paste  from  outside  are  also  supported,  both  via  the  ctrl-x  /  ctrl-v  bindings  (the
       fish_clipboard_copy and fish_clipboard_paste functions [3]) and via the terminal's  paste  function,  for
       which  fish  enables  "Bracketed  Paste  Mode",  so  it  can tell a paste from manually entered text.  In
       addition, when pasting inside single quotes, pasted  single  quotes  and  backslashes  are  automatically
       escaped  so  that  the result can be used as a single token simply by closing the quote after.  Kill ring
       entries are stored in fish_killring variable.

       The commands begin-selection and end-selection (unbound by default; used for selection in vi visual mode)
       control text selection together with cursor movement commands that extend  the  current  selection.   The
       variable  fish_cursor_selection_mode  can  be  used  to  configure  if  that selection should include the
       character under the cursor (inclusive) or not (exclusive). The default is  exclusive,  which  works  well
       with  any  cursor  shape. For vi mode, and particularly for the block or underscore cursor shapes you may
       prefer inclusive.

       [3]  These rely on external  tools.  Currently  xsel,  xclip,  wl-copy/wl-paste  and  pbcopy/pbpaste  are
            supported.

   Multiline editing
       The  fish commandline editor can be used to work on commands that are several lines long. There are three
       ways to make a command span more than a single line:

       • Pressing the enter key while a block of commands is unclosed, such as when one or more  block  commands
         such as for, begin or if do not have a corresponding end command.

       • Pressing alt-enter instead of pressing the enter key.

       • By inserting a backslash (\) character before pressing the enter key, escaping the newline.

       The  fish  commandline  editor  works exactly the same in single line mode and in multiline mode. To move
       between lines use the left and right arrow keys and other such keyboard shortcuts.

   Searchable command history
       After a command has been executed, it is remembered in the history list. Any duplicate history items  are
       automatically  removed.  By  pressing  the up and down keys, you can search forwards and backwards in the
       history. If the current command line is not empty when starting  a  history  search,  only  the  commands
       containing the string entered into the command line are shown.

       By pressing alt-up () and alt-down (), a history search is also performed, but instead of searching for
       a  complete  commandline,  each commandline is broken into separate elements just like it would be before
       execution, and the history is searched for an element matching that under the cursor.

       For more complicated searches, you can press ctrl-r to open  a  pager  that  allows  you  to  search  the
       history.  It  shows  a  limited number of entries in one page, press ctrl-r [4] again to move to the next
       page and ctrl-s [5] to move to the previous page. You can change the text to refine your search.

       History searches are case-insensitive unless the search string contains an uppercase character.  You  can
       stop a search to edit your search string by pressing escape or pagedown.

       Prefixing  the commandline with a space will prevent the entire line from being stored in the history. It
       will still be available for recall until the next command is executed, but will not be  stored  on  disk.
       This is to allow you to fix misspellings and such.

       The    command    history    is    stored    in    the    file    ~/.local/share/fish/fish_history    (or
       $XDG_DATA_HOME/fish/fish_history if  that  variable  is  set)  by  default.  However,  you  can  set  the
       fish_history   environment  variable  to  change  the  name  of  the  history  session  (resulting  in  a
       <session>_history file); both before starting the shell and while the shell is running.

       See the history command for other manipulations.

       Examples:

       To search for previous entries containing the word 'make', type make in the console and press the up key.

       If the commandline reads cd m, place the cursor over the m character and press alt-up () to  search  for
       previously typed words containing 'm'.

       [4]  Or another binding that triggers the history-pager input function. See bind for a list.

       [5]  Or another binding that triggers the pager-toggle-search input function.

   Private mode
       Fish  has  a  private  mode, in which command history will not be written to the history file on disk. To
       enable it, either set $fish_private_mode to a non-empty value, or launch with fish --private (or fish  -P
       for short).

       If  you  launch  fish  with  -P,  it both hides old history and prevents writing history to disk. This is
       useful to avoid leaking personal information (e.g.  for  screencasts)  or  when  dealing  with  sensitive
       information.

       You  can  query the variable fish_private_mode (if test -n "$fish_private_mode" ...) if you would like to
       respect the user's wish for privacy and alter the behavior of your own fish scripts.

   Navigating directories
       Navigating directories is usually done with the cd command, but fish offers  some  advanced  features  as
       well.

       The  current  working  directory  can  be  displayed  with the pwd command, or the $PWD special variable.
       Usually your prompt already does this.

   Directory history
       Fish automatically keeps a trail of the recent visited directories with cd by storing this history in the
       dirprev and dirnext variables.

       Several commands are provided to interact with this directory history:

       • dirh prints the history

       • cdh displays a prompt to quickly navigate the history

       • prevd moves backward through the history. It is bound to alt-left ()

       • nextd moves forward through the history. It is bound to alt-right ()

   Directory stack
       Another set of commands, usually also available in other shells like bash, deal with the directory stack.
       Stack handling is not automatic and needs explicit calls of the following commands:

       • dirs prints the stack

       • pushd adds a directory on top of the stack and makes it the current working directory

       • popd removes the directory on top of the stack and changes the current working directory

   The fish language
       This document is a comprehensive overview of fish's scripting language.

       For interactive features see Interactive use.

   Syntax overview
       Shells like fish are used by giving them commands. A command is executed  by  writing  the  name  of  the
       command followed by any arguments. For example:

          echo hello world

       echo command writes its arguments to the screen. In this example the output is hello world.

       Everything  in  fish is done with commands. There are commands for repeating other commands, commands for
       assigning variables, commands for treating a group of commands as a single command,  etc.  All  of  these
       commands follow the same basic syntax.

       Every program on your computer can be used as a command in fish. If the program file is located in one of
       the  PATH directories, you can just type the name of the program to use it. Otherwise the whole filename,
       including the directory (like /home/me/code/checkers/checkers or ../checkers) is required.

       Here is a list of some useful commands:

       • cd: Change the current directory

       • ls: List files and directories

       • man: Display a manual page - try man ls to get help on your "ls" command, or man mv to get  information
         about "mv".

       • mv: Move (rename) files

       • cp: Copy files

       • open: Open files with the default application associated with each filetype

       • less: Display the contents of files

       Commands and arguments are separated by the space character ' '. Every command ends with either a newline
       (by  pressing  the  return  key)  or  a semicolon ;. Multiple commands can be written on the same line by
       separating them with semicolons.

       A switch is a very common special type of argument. Switches almost always start with one or more hyphens
       - and alter the way a command operates. For example, the ls command usually lists the names of all  files
       and  directories  in the current working directory. By using the -l switch, the behavior of ls is changed
       to not only display the filename, but also the size, permissions, owner, and modification  time  of  each
       file.

       Switches  differ  between  commands and are usually documented on a command's manual page. There are some
       switches, however, that are common to most commands. For example, --help  will  usually  display  a  help
       text, --version will usually display the command version, and -i will often turn on interactive prompting
       before taking action. Try man your-command-here to get information on your command's switches.

       So  the basic idea of fish is the same as with other unix shells: It gets a commandline, runs expansions,
       and the result is then run as a command.

   Terminology
       Here we define some of the terms used on this page and throughout the rest of the fish documentation:

       • Argument: A parameter given to a command. In echo foo, the "foo" is an argument.

       • Builtin: A command that is implemented by the shell. Builtins are so closely tied to the  operation  of
         the  shell  that  it is impossible to implement them as external commands. In echo foo, the "echo" is a
         builtin.

       • Command: A program that the shell can run, or more specifically an external program that the shell runs
         in another process. External commands are provided on your system, as executable files. In echo foo the
         "echo" is a builtin command, in command echo foo the "echo" is an external command, provided by a  file
         like /bin/echo.

       • Function:  A block of commands that can be called as if they were a single command. By using functions,
         it is possible to string together multiple simple commands into one more advanced command.

       • Job: A running pipeline or command.

       • Pipeline: A set of commands strung together so that the output of one command is the input of the  next
         command. echo foo | grep foo is a pipeline.

       • Redirection: An operation that changes one of the input or output streams associated with a job.

       • Switch  or  Option:  A  special kind of argument that alters the behavior of a command. A switch almost
         always begins with one or two hyphens. In echo -n foo the "-n" is an option.

   Quotes
       Sometimes you want to give a command an argument that contains characters special to fish, like spaces or
       $ or *. To do that, you can use quotes:

          rm "my file.txt"

       to remove a file called my file.txt instead of trying to remove two files, my and file.txt.

       Fish understands two kinds of quotes: Single (') and double ("), and both work slightly differently.

       Between single quotes, fish performs no expansions. Between double quotes, fish  only  performs  variable
       expansion  and  command  substitution  in  the  $(command).  No  other kind of expansion (including brace
       expansion or parameter expansion) is performed, and escape  sequences  (for  example,  \n)  are  ignored.
       Within quotes, whitespace is not used to separate arguments, allowing quoted arguments to contain spaces.

       The  only meaningful escape sequences in single quotes are \', which escapes a single quote and \\, which
       escapes the backslash symbol. The only meaningful escapes in double quotes are \", which escapes a double
       quote, \$, which escapes a dollar character, \ followed by a newline, which deletes the backslash and the
       newline, and \\, which escapes the backslash symbol.

       Single quotes have no special meaning within double quotes and vice versa.

       More examples:

          grep 'enabled)$' foo.txt

       searches for lines ending in enabled) in foo.txt (the $ is special to grep: it matches  the  end  of  the
       line).

          apt install "postgres-*"

       installs  all  packages  with  a  name  starting with "postgres-", instead of looking through the current
       directory for files named "postgres-something".

   Escaping Characters
       Some characters cannot be written directly on the command line. For these  characters,  so-called  escape
       sequences are provided. These are:

       • \a represents the alert character.

       • \e represents the escape character.

       • \f represents the form feed character.

       • \n represents a newline character.

       • \r represents the carriage return character.

       • \t represents the tab character.

       • \v represents the vertical tab character.

       • \xHH or \XHH, where HH is a hexadecimal number, represents a byte of data with the specified value. For
         example,  \x9  is  the  tab character. If you are using a multibyte encoding, this can be used to enter
         invalid strings. Typically fish is run with the ASCII or UTF-8 encoding, so anything up to \X7f  is  an
         ASCII character.

       • \ooo,  where  ooo  is  an  octal  number,  represents the ASCII character with the specified value. For
         example, \011 is the tab character. The highest allowed value is \177.

       • \uXXXX, where XXXX is a hexadecimal number, represents the 16-bit Unicode character with the  specified
         value. For example, \u9 is the tab character.

       • \UXXXXXXXX,  where  XXXXXXXX  is a hexadecimal number, represents the 32-bit Unicode character with the
         specified value. For example, \U9 is the tab character. The highest allowed value is U10FFFF.

       • \cX, where X is a letter of the alphabet, represents the control sequence  generated  by  pressing  the
         control key and the specified letter. For example, \ci is the tab character

       Some  characters  have special meaning to the shell. For example, an apostrophe ' disables expansion (see
       Quotes). To tell the shell to treat these  characters  literally,  escape  them  with  a  backslash.  For
       example, the command:

          echo \'hello world\'

       outputs 'hello world' (including the apostrophes), while the command:

          echo 'hello world'

       outputs  hello  world  (without  the apostrophes). In the former case the shell treats the apostrophes as
       literal ' characters, while in the latter case it treats them as special expansion modifiers.

       The special characters and their escape sequences are:

       • \  (backslash space) escapes the space character. This keeps the shell from splitting arguments on  the
         escaped space.

       • \$ escapes the dollar character.

       • \\ escapes the backslash character.

       • \* escapes the star character.

       • \?  escapes  the  question  mark  character  (this is not necessary if the qmark-noglob feature flag is
         enabled).

       • \~ escapes the tilde character.

       • \# escapes the hash character.

       • \( escapes the left parenthesis character.

       • \) escapes the right parenthesis character.

       • \{ escapes the left curly bracket character.

       • \} escapes the right curly bracket character.

       • \[ escapes the left bracket character.

       • \] escapes the right bracket character.

       • \< escapes the less than character.

       • \> escapes the more than character.

       • \& escapes the ampersand character.

       • \| escapes the vertical bar character.

       • \; escapes the semicolon character.

       • \" escapes the quote character.

       • \' escapes the apostrophe character.

       As a special case, \ immediately followed by a literal new line is a "continuation"  and  tells  fish  to
       ignore  the line break and resume input at the start of the next line (without introducing any whitespace
       or terminating a token).

   Input/Output Redirection
       Most programs use three input/output (I/O) streams:

       • Standard input (stdin) for reading. Defaults to reading from the keyboard.

       • Standard output (stdout) for writing output. Defaults to writing to the screen.

       • Standard error (stderr) for writing errors and warnings. Defaults to writing to the screen.

       Each stream has a number called the file descriptor (FD): 0 for stdin, 1 for stdout, and 2 for stderr.

       The destination of a stream can be changed using something called redirection. For example, echo hello  >
       output.txt, redirects the standard output of the echo command to a text file.

       • To read standard input from a file, use <SOURCE_FILE.

       • To read standard input from a file or /dev/null if it can't be read, use <?SOURCE_FILE.

       • To write standard output to a file, use >DESTINATION.

       • To write standard error to a file, use 2>DESTINATION. [1]

       • To append standard output to a file, use >>DESTINATION_FILE.

       • To append standard error to a file, use 2>>DESTINATION_FILE.

       • To  not  overwrite  ("clobber") an existing file, use >?DESTINATION or 2>?DESTINATION. This is known as
         the "noclobber" redirection.

       DESTINATION can be one of the following:

       • A filename to write the output to. Often >/dev/null to silence output by  writing  it  to  the  special
         "sinkhole" file.

       • An  ampersand  (&)  followed  by  the number of another file descriptor like &2 for standard error. The
         output will be written to the destination descriptor.

       • An ampersand followed by a minus sign (&-). The file descriptor will be closed. Note:  This  may  cause
         the program to fail because its writes will be unsuccessful.

       As  a  convenience,  the  redirection  &>  can  be  used  to  direct  both  stdout and stderr to the same
       destination. For example, echo hello &> all_output.txt redirects both  stdout  and  stderr  to  the  file
       all_output.txt. This is equivalent to echo hello > all_output.txt 2>&1.

       Any  arbitrary  file  descriptor  can  be  used in a redirection by prefixing the redirection with the FD
       number.

       • To redirect the input of descriptor N, use N<DESTINATION.

       • To redirect the output of descriptor N, use N>DESTINATION.

       • To append the output of descriptor N to a file, use N>>DESTINATION_FILE.

       File descriptors cannot be used with a <? input redirection, only a regular < one.

       For example:

          # Write `foo`'s standard error (file descriptor 2)
          # to a file called "output.stderr":
          foo 2> output.stderr

          # if $num doesn't contain a number,
          # this test will be false and print an error,
          # so by ignoring the error we can be sure that we're dealing
          # with a number in the "if" block:
          if test "$num" -gt 2 2>/dev/null
              # do things with $num as a number greater than 2
          else
              # do things if $num is <= 2 or not a number
          end

          # Save `make`s output in a file:
          make &>/log

          # Redirections stack and can be used with blocks:
          begin
              echo stdout
              echo stderr >&2 # <- this goes to stderr!
          end >/dev/null # ignore stdout, so this prints "stderr"

          # print all lines that include "foo" from myfile, or nothing if it doesn't exist.
          string match '*foo*' <?myfile

       It is an error to redirect a builtin, function, or block to a file descriptor above 2.  However  this  is
       supported for external commands.

       [1]  Previous  versions  of  fish  also  allowed  specifying  this as ^DESTINATION, but that made another
            character special so it was deprecated and removed. See feature flags.

   Piping
       Another way to redirect streams is a pipe. A pipe connects streams with each other. Usually the  standard
       output  of  one  command  is  connected  with  the  standard input of another. This is done by separating
       commands with the pipe character |. For example:

          cat foo.txt | head

       The command cat foo.txt sends the contents of foo.txt to stdout. This output is provided as input for the
       head program, which prints the first 10 lines of its input.

       It is possible to pipe a different output file descriptor by prepending its  FD  number  and  the  output
       redirect symbol to the pipe. For example:

          make fish 2>| less

       will attempt to build fish, and any errors will be shown using the less pager. [2]

       As  a  convenience,  the  pipe &| redirects both stdout and stderr to the same process. This is different
       from bash, which uses |&.

       [2]  A "pager" here is a program that takes output and "paginates" it. less doesn't  just  do  pages,  it
            allows arbitrary scrolling (even back!).

   Combining pipes and redirections
       It  is  possible to use multiple redirections and a pipe at the same time. In that case, they are read in
       this order:

       1. First the pipe is set up.

       2. Then the redirections are evaluated from left-to-right.

       This is important when any redirections reference other file descriptors with the &N syntax. When you say
       >&2, that will redirect stdout to where stderr is pointing to at that time.

       Consider this helper function:

          # Just make a function that prints something to stdout and stderr
          function print
              echo out
              echo err >&2
          end

       Now let's see a few cases:

          # Redirect both stderr and stdout to less
          print 2>&1 | less
          # or
          print &| less

          # Show the "out" on stderr, silence the "err"
          print >&2 2>/dev/null

          # Silence both
          print >/dev/null 2>&1

   Job control
       When you start a job in fish, fish itself will pause, and give control of the  terminal  to  the  program
       just  started.  Sometimes,  you  want  to  continue  using  the  commandline, and have the job run in the
       background. To create a background job, append an & (ampersand) to your command. This will tell  fish  to
       run  the  job  in  the  background.  Background  jobs  are  very useful when running programs that have a
       graphical user interface.

       Example:

          emacs &

       will start the emacs text editor in the background. fg can be used to bring it into the foreground  again
       when needed.

       Most  programs allow you to suspend the program's execution and return control to fish by pressing ctrl-z
       (also referred to as ^Z). Once back at the fish commandline, you can start other programs and do anything
       you want. If you then want you can go back to the suspended command by using the fg (foreground) command.

       If you instead want to put a suspended job into the background, use the bg command.

       To get a listing of all currently started jobs, use the jobs command.  These listed jobs can  be  removed
       with the disown command.

       At  the  moment,  functions  cannot  be  started  in  the background. Functions that are stopped and then
       restarted in the background using the bg command will not execute correctly.

       If the & character is followed by a  non-separating  character,  it  is  not  interpreted  as  background
       operator. Separating characters are whitespace and the characters ;<>&|.

   Functions
       Functions  are  programs  written  in  the  fish  syntax.  They group together various commands and their
       arguments using a single name.

       For example, here's a simple function to list directories:

          function ll
              ls -l $argv
          end

       The first line tells fish to define a function by the name of ll, so it can be used by simply writing  ll
       on  the  commandline. The second line tells fish that the command ls -l $argv should be called when ll is
       invoked. $argv is a list variable, which always contains all arguments  sent  to  the  function.  In  the
       example  above,  these  are  simply  passed  on  to  the  ls  command. The end on the third line ends the
       definition.

       Calling this as ll /tmp/ will end up running ls -l /tmp/, which will list the contents of /tmp.

       This is a kind of function known as an alias.

       Fish's prompt is also defined in a function, called fish_prompt. It is run when the prompt is about to be
       displayed and its output forms the prompt:

          function fish_prompt
              # A simple prompt. Displays the current directory
              # (which fish stores in the $PWD variable)
              # and then a user symbol - a '►' for a normal user and a '#' for root.
              set -l user_char '►'
              if fish_is_root_user
                  set user_char '#'
              end

              echo (set_color yellow)$PWD (set_color purple)$user_char
          end

       To edit a function, you can use funced, and to save a function funcsave. This will store it in a function
       file that fish will autoload when needed.

       The functions builtin can show a function's current  definition  (and  type  will  also  do  if  given  a
       function).

       For more information on functions, see the documentation for the function builtin.

   Defining aliases
       One  of  the  most  common  uses  for  functions is to slightly alter the behavior of an already existing
       command. For example, one might want to redefine the ls command to display colors. The switch for turning
       on colors on GNU systems is --color=auto. An alias around ls might look like this:

          function ls
              command ls --color=auto $argv
          end

       There are a few important things that need to be noted about aliases:

       • Always take care to add the $argv variable to the list of parameters to the wrapped command. This makes
         sure that if the user specifies any additional parameters to the function, they are passed  on  to  the
         underlying command.

       • If  the alias has the same name as the aliased command, you need to prefix the call to the program with
         command to tell fish that the function should not call itself, but rather a command with the same name.
         If you forget to do so, the function would call itself until the end of time.  Usually  fish  is  smart
         enough to figure this out and will refrain from doing so (which is hopefully in your interest).

       To  easily  create a function of this form, you can use the alias command. Unlike other shells, this just
       makes functions - fish has no separate concept of an "alias", we just use the word for a simple  wrapping
       function like this. alias immediately creates a function. Consider using alias --save or funcsave to save
       the created function into an autoload file instead of recreating the alias each time.

       For an alternative, try abbreviations. These are words that are expanded while you type, instead of being
       actual functions inside the shell.

   Autoloading functions
       Functions  can  be  defined  on  the  commandline  or  in  a  configuration  file,  but  they can also be
       automatically loaded. This has some advantages:

       • An autoloaded function becomes available automatically to all running shells.

       • If the function definition is changed,  all  running  shells  will  automatically  reload  the  altered
         version, after a while.

       • Startup time and memory usage is improved, etc.

       When  fish  needs  to  load  a  function,  it  searches  through  any  directories  in  the list variable
       $fish_function_path for a file with a name consisting of the name of the function plus the  suffix  .fish
       and loads the first it finds.

       For  example  if  you  try  to  execute  something called banana, fish will go through all directories in
       $fish_function_path looking for a file called banana.fish and load the first one it finds.

       By default $fish_function_path contains the following:

       • A directory for users to keep their own functions, usually ~/.config/fish/functions (controlled by  the
         XDG_CONFIG_HOME environment variable).

       • A   directory  for  functions  for  all  users  on  the  system,  usually  /etc/fish/functions  (really
         $__fish_sysconfdir/functions).

       • Directories for other software to  put  their  own  functions.  These  are  in  the  directories  under
         $__fish_user_data_dir   (usually  ~/.local/share/fish,  controlled  by  the  XDG_DATA_HOME  environment
         variable)   and   in   the   XDG_DATA_DIRS   environment   variable,   in   a    subdirectory    called
         fish/vendor_functions.d.      The      default      value      for     XDG_DATA_DIRS     is     usually
         /usr/share/fish/vendor_functions.d and /usr/local/share/fish/vendor_functions.d.

       • The  functions  shipped   with   fish,   usually   installed   in   /usr/share/fish/functions   (really
         $__fish_data_dir/functions).

       If you are unsure, your functions probably belong in ~/.config/fish/functions.

       As  we've explained, autoload files are loaded by name, so, while you can put multiple functions into one
       file, the file will only be loaded automatically once you try to execute the one that shares the name.

       Autoloading also won't work for event handlers, since fish cannot know that a function is supposed to  be
       executed  when an event occurs when it hasn't yet loaded the function. See the event handlers section for
       more information.

       If a file of the right name doesn't define the function, fish will not read other autoload files, instead
       it will go on to try builtins and finally commands. This allows  masking  a  function  defined  later  in
       $fish_function_path,  e.g. if your administrator has put something into /etc/fish/functions that you want
       to skip.

       If you are developing another program and want to install fish functions for  it,  install  them  to  the
       "vendor"  functions  directory.  As  this  path  varies  from  system to system, you can use pkgconfig to
       discover it with the output of pkg-config --variable functionsdir fish. Your installation  system  should
       support a custom path to override the pkgconfig path, as other distributors may need to alter it easily.

   Comments
       Anything  after  a  #  until  the  end  of the line is a comment. That means it's purely for the reader's
       benefit, fish ignores it.

       This is useful to explain what and why you are doing something:

          function ls
              # The function is called ls,
              # so we have to explicitly call `command ls` to avoid calling ourselves.
              command ls --color=auto $argv
          end

       There are no multiline comments. If you want to make a comment span multiple  lines,  simply  start  each
       line with a #.

       Comments can also appear after a line like so:

          set -gx EDITOR emacs # I don't like vim.

   Conditions
       Fish has some builtins that let you execute commands only if a specific criterion is met: if, switch, and
       and or, and also the familiar &&/|| syntax.

   The if statement
       The if statement runs a block of commands if the condition was true.

       Like  other  shells,  but  unlike  typical  programming languages you might know, the condition here is a
       command. Fish runs it, and if it returns a true exit status (that's 0), the if-block is run. For example:

          if test -e /etc/os-release
              cat /etc/os-release
          end

       This uses the test command to see if the file /etc/os-release exists. If it  does,  it  runs  cat,  which
       prints it on the screen.

       Unlike  other  shells,  the  condition  command  just  ends  after  the first job, there is no then here.
       Combiners like and and or extend the condition.

       A more complicated example with a command substitution:

          if test "$(uname)" = Linux
              echo I like penguins
          end

       Because test can be used for many different tests,  it  is  important  to  quote  variables  and  command
       substitutions. If the $(uname) was not quoted, and uname printed nothing it would run test = Linux, which
       is an error.

       if  can  also  take  else if clauses with additional conditions and an  else clause that is executed when
       everything else was false:

          if test "$number" -gt 10
             echo Your number was greater than 10
          else if test "$number" -gt 5
             echo Your number was greater than 5
          else if test "$number" -gt 1
             echo Your number was greater than 1
          else
             echo Your number was smaller or equal to 1
          end

       The not keyword can be used to invert the status:

          # Just see if the file contains the string "fish" anywhere.
          # This executes the `grep` command, which searches for a string,
          # and if it finds it returns a status of 0.
          # The `not` then turns 0 into 1 or anything else into 0.
          # The `-q` switch stops it from printing any matches.
          if not grep -q fish myanimals
              echo "You don't have fish!"
          else
              echo "You have fish!"
          end

       Other things commonly used in if-conditions:

       • contains - to see if a list contains a specific element (if contains -- /usr/bin $PATH)

       • string - to e.g. match strings (if string match -q -- '*-' $arg)

       • path - to check if paths of some criteria exist (if path is -rf -- ~/.config/fish/config.fish)

       • type - to see if a command, function or builtin exists (if type -q git)

   The switch statement
       The switch command is used to execute one of possibly many blocks of commands depending on the value of a
       string. It can take multiple case blocks that are  executed  when  the  string  matches.  They  can  take
       wildcards. For example:

          switch (uname)
          case Linux
              echo Hi Tux!
          case Darwin
              echo Hi Hexley!
          case DragonFly '*BSD'
              echo Hi Beastie! # this also works for FreeBSD and NetBSD
          case '*'
              echo Hi, stranger!
          end

       Unlike  other shells or programming languages, there is no fallthrough - the first matching case block is
       executed and then control jumps out of the switch.

   Combiners (and / or / && / ||)
       For simple checks, you can use combiners. and or && run the second command if the first succeeded,  while
       or or || run it if the first failed. For example:

          # $XDG_CONFIG_HOME is a standard place to store configuration.
          # If it's not set applications should use ~/.config.
          set -q XDG_CONFIG_HOME; and set -l configdir $XDG_CONFIG_HOME
          or set -l configdir ~/.config

       Note that combiners are lazy - only the part that is necessary to determine the final status is run.

       Compare:

          if sleep 2; and false
              echo 'How did I get here? This should be impossible'
          end

       and:

          if false; and sleep 2
              echo 'How did I get here? This should be impossible'
          end

       These do essentially the same thing, but the former takes 2 seconds longer because the sleep always needs
       to run.

       Or you can have a case where it is necessary to stop early:

          if command -sq foo; and foo

       If  this  went  on  after  seeing that the command "foo" doesn't exist, it would try to run foo and error
       because it wasn't found!

       Combiners really just execute step-by-step, so it isn't  recommended  to  build  longer  chains  of  them
       because they might do something you don't want. Consider:

          test -e /etc/my.config
          or echo "OH NO WE NEED A CONFIG FILE"
          and return 1

       This  will execute return 1 also if the test succeeded. This is because fish runs test -e /etc/my.config,
       sets $status to 0, then skips the echo, keeps $status at 0,  and  then  executes  the  return  1  because
       $status is still 0.

       So  if  you  have more complex conditions or want to run multiple things after something failed, consider
       using an if. Here that would be:

          if not test -e /etc/my.config
              echo "OH NO WE NEED A CONFIG FILE"
              return 1
          end

   Loops and blocks
       Like most programming language, fish also has the familiar while and for loops.

       while works like a repeated if:

          while true
              echo Still running
              sleep 1
          end

       will print "Still running" once a second. You can abort it with ctrl-c.

       for loops work like in other shells, which is more like python's for-loops than e.g. C's:

          for file in *
              echo file: $file
          end

       will print each file in the current directory. The part after the in is just a list of arguments, so  you
       can use any expansions there:

          set moreanimals bird fox
          for animal in {cat,}fish dog $moreanimals
             echo I like the $animal
          end

       If you need a list of numbers, you can use the seq command to create one:

          for i in (seq 1 5)
              echo $i
          end

       break is available to break out of a loop, and continue to jump to the next iteration.

       Input and output redirections (including pipes) can also be applied to loops:

          while read -l line
              echo line: $line
          end < file

       In  addition  there's  a begin block that just groups commands together so you can redirect to a block or
       use a new variable scope without any repetition:

          begin
             set -l foo bar # this variable will only be available in this block!
          end

   Parameter expansion
       When fish is given a commandline, it expands the parameters before sending them to the command. There are
       multiple different kinds of expansions:

       • Wildcards, to create filenames from patterns - *.jpgVariable expansion, to use the value of a variable - $HOMECommand substitution, to use the output of another command - $(cat /path/to/file)Brace expansion, to write lists with common pre- or suffixes in a shorter way {/usr,}/binTilde expansion, to turn the ~ at the beginning of paths into the path to the home directory ~/bin

       Parameter expansion is limited to 524288 items. There is a limit to  how  many  arguments  the  operating
       system  allows  for  any  command,  and  524288 is far above it. This is a measure to stop the shell from
       hanging doing useless computation.

   Wildcards ("Globbing")
       When a parameter includes an unquoted * star (or "asterisk") or a ? question mark,  fish  uses  it  as  a
       wildcard to match files.

       • * matches any number of characters (including zero) in a file name, not including /.

       • ** matches any number of characters (including zero), and also descends into subdirectories. If ** is a
         segment by itself, that segment may match zero times, for compatibility with other shells.

       • ?  can match any single character except /. This is deprecated and can be disabled via the qmark-noglob
         feature flag, so ? will just be an ordinary character.

       Wildcard matches are sorted case  insensitively.  When  sorting  matches  containing  numbers,  they  are
       naturally sorted, so that the strings '1' '5' and '12' would be sorted like 1, 5, 12.

       Hidden  files  (where the name begins with a dot) are not considered when wildcarding unless the wildcard
       string has a dot in that place.

       Examples:

       • a* matches any files beginning with an 'a' in the current directory.

       • ** matches any files and directories in the current directory and all of its subdirectories.

       • ~/.* matches all hidden files (also known as "dotfiles") and directories in your home directory.

       For most commands, if any wildcard fails to expand, the command  is  not  executed,  $status  is  set  to
       nonzero, and a warning is printed. This behavior is like what bash does with shopt -s failglob. There are
       exceptions,  namely  set  and  path,  overriding  variables in overrides, count and for. Their globs will
       instead expand to zero arguments (so the command won't see them at all), like with shopt -s  nullglob  in
       bash.

       Examples:

          # List the .foo files, or warns if there aren't any.
          ls *.foo

          # List the .foo files, if any.
          set foos *.foo
          if count $foos >/dev/null
              ls $foos
          end

       Unlike  bash (by default), fish will not pass on the literal glob character if no match was found, so for
       a command like apt install that does the matching itself, you need to add quotes:

          apt install "ncurses-*"

   Variable expansion
       One of the most important expansions in fish is the "variable expansion". This  is  the  replacing  of  a
       dollar sign ($) followed by a variable name with the _value_ of that variable.

       In the simplest case, this is just something like:

          echo $HOME

       which  will  replace  $HOME  with the home directory of the current user, and pass it to echo, which will
       then print it.

       Some variables like $HOME are already set because fish sets them by  default  or  because  fish's  parent
       process  passed  them  to fish when it started it. You can define your own variables by setting them with
       set:

          set my_directory /home/cooluser/mystuff
          ls $my_directory
          # shows the contents of /home/cooluser/mystuff

       For more on how setting variables works, see Shell variables and the following sections.

       Sometimes a variable has no value because it is undefined or empty, and it expands to nothing:

          echo $nonexistentvariable
          # Prints no output.

       To separate a variable name from text you can encase the variable within double-quotes or braces:

          set WORD cat
          echo The plural of $WORD is "$WORD"s
          # Prints "The plural of cat is cats" because $WORD is set to "cat".
          echo The plural of $WORD is {$WORD}s
          # ditto

       Without the quotes or braces, fish will try to expand a variable called $WORDs, which may not exist.

       The latter syntax {$WORD} is a special case of brace expansion.

       If $WORD here is undefined or an empty list, the "s" is not printed. However, it is printed if  $WORD  is
       the empty string (like after set WORD "").

       For more on shell variables, read the Shell variables section.

   Quoting variables
       Variable  expansion also happens in double quoted strings. Inside double quotes ("these"), variables will
       always expand to exactly one argument. If they are empty or undefined, it will result in an empty string.
       If they have one element, they'll expand to that element. If they have more than that, the elements  will
       be  joined  with  spaces,  unless  the variable is a path variable - in that case it will use a colon (:)
       instead [3].

       Fish variables are all lists, and they are split into elements when they are  set  -  that  means  it  is
       important to decide whether to use quotes or not with set:

          set foo 1 2 3 # a variable with three elements
          rm $foo # runs the equivalent of `rm 1 2 3` - trying to delete three files: 1, 2 and 3.
          rm "$foo" # runs `rm '1 2 3'` - trying to delete one file called '1 2 3'

          set foo # an empty variable
          rm $foo # runs `rm` without arguments
          rm "$foo" # runs the equivalent of `rm ''`

          set foo "1 2 3"
          rm $foo # runs the equivalent of `rm '1 2 3'` - trying to delete one file
          rm "$foo" # same thing

       This  is  unlike  other shells, which do what is known as "Word Splitting", where they split the variable
       when it is used in an expansion. E.g. in bash:

          foo="1 2 3"
          rm $foo # runs the equivalent of `rm 1 2 3`
          rm "$foo" # runs the equivalent of `rm '1 2 3'`

       This is the cause of very common problems with filenames with spaces in bash scripts.

       In fish, unquoted variables will expand to as many arguments as they have elements. That means  an  empty
       list will expand to nothing, a variable with one element will expand to that element, and a variable with
       multiple elements will expand to each of those elements separately.

       If  a variable expands to nothing, it will cancel out any other strings attached to it. See the Combining
       Lists section for more information.

       Most of the time, not quoting a variable is correct. The exception is when you need to  ensure  that  the
       variable  is  passed  as  one  element, even if it might be unset or have multiple elements. This happens
       often with test:

          set -l foo one two three
          test -n $foo
          # prints an error that it got too many arguments, because it was executed like
          test -n one two three

          test -n "$foo"
          # works, because it was executed like
          test -n "one two three"

       [3]  Unlike bash or zsh, which will join with the first character of $IFS (which usually is space).

   Dereferencing variables
       The $ symbol can also be used multiple times, as a kind of "dereference" operator (the * in  C  or  C++),
       like in the following code:

          set foo a b c
          set a 10; set b 20; set c 30
          for i in (seq (count $$foo))
              echo $$foo[$i]
          end

          # Output is:
          # 10
          # 20
          # 30

       $$foo[$i] is "the value of the variable named by $foo[$i]".

       This can also be used to give a variable name to a function:

          function print_var
              for arg in $argv
                  echo Variable $arg is $$arg
              end
          end

          set -g foo 1 2 3
          set -g bar a b c

          print_var foo bar
          # prints "Variable foo is 1 2 3" and "Variable bar is a b c"

       Of  course  the variable will have to be accessible from the function, so it needs to be global/universal
       or exported. It also can't clash with a variable name used inside the function. So if we  had  made  $foo
       there a local variable, or if we had named it "arg" instead, it would not have worked.

       When  using this feature together with slices, the slices will be used from the inside out. $$foo[5] will
       use the fifth element of $foo as a variable name,  instead  of  giving  the  fifth  element  of  all  the
       variables  $foo refers to. That would instead be expressed as $$foo[1..-1][5] (take all elements of $foo,
       use them as variable names, then give the fifth element of those).

       Some more examples:

          set listone 1 2 3
          set listtwo 4 5 6
          set var listone listtwo

          echo $$var
          # Output is 1 2 3 4 5 6

          echo $$var[1]
          # Output is 1 2 3

          echo $$var[2][3]
          # $var[1] is listtwo, third element of that is 6, output is 6

          echo $$var[..][2]
          # The second element of every variable, so output is
          # 2 5

   Variables as command
       Like other shells, you can run the value of a variable as a command.

          > set -g EDITOR emacs
          > $EDITOR foo # opens emacs, possibly the GUI version

       If you want to give the command an argument inside the variable it needs to be a separate element:

          > set EDITOR emacs -nw
          > $EDITOR foo # opens emacs in the terminal even if the GUI is installed
          > set EDITOR "emacs -nw"
          > $EDITOR foo # tries to find a command called "emacs -nw"

       Also like other shells, this only works with commands, builtins and functions - it  will  not  work  with
       keywords because they have syntactical importance.

       For  instance  set if $if won't allow you to make an if-block, and set cmd command won't allow you to use
       the command decorator, but only uses like $cmd -q foo.

   Command substitution
       A command substitution is an expansion that uses the output of a command as the arguments to another. For
       example:

          echo $(pwd)

       This executes the pwd command, takes its output (more specifically what it wrote to the  standard  output
       "stdout" stream) and uses it as arguments to echo. So the inner command (the pwd) is run first and has to
       complete before the outer command can even be started.

       If  the  inner  command prints multiple lines, fish will use each separate line as a separate argument to
       the outer command. Unlike other shells, the value of $IFS is not used [4], fish splits on newlines.

       Command substitutions can also be double-quoted:

          echo "$(pwd)"

       When using double quotes, the command output is not split up by lines, but trailing empty lines are still
       removed.

       If the output is piped to string split or string split0 as the last step, those splits are used  as  they
       appear instead of splitting lines.

       Fish  also  allows  spelling command substitutions without the dollar, like echo (pwd). This variant will
       not be expanded in double-quotes (echo "(pwd)" will print (pwd)).

       The exit status of the last run  command  substitution  is  available  in  the  status  variable  if  the
       substitution  happens  in  the  context  of  a  set command (so if set -l (something) checks if something
       returned true).

       To use only some lines of the output, refer to slices.

       Examples:

          # Outputs 'image.png'.
          echo (basename image.jpg .jpg).png

          # Convert all JPEG files in the current directory to the
          # PNG format using the 'convert' program.
          for i in *.jpg; convert $i (basename $i .jpg).png; end

          # Set the ``data`` variable to the contents of 'data.txt'
          # without splitting it into a list.
          set data "$(cat data.txt)"

          # Set ``$data`` to the contents of data, splitting on NUL-bytes.
          set data (cat data | string split0)

       Sometimes you want to pass the output of a command to another command that only accepts  files.  If  it's
       just one file, you can usually just pass it via a pipe, like:

          grep fish myanimallist1 | wc -l

       but  if  you  need  multiple  or  the command doesn't read from standard input, "process substitution" is
       useful. Other shells allow this via foo <(bar) <(baz), and fish uses the psub command:

          # Compare just the lines containing "fish" in two files:
          diff -u (grep fish myanimallist1 | psub) (grep fish myanimallist2 | psub)

       This creates a temporary file, stores the output of the command in that file and prints the filename,  so
       it is given to the outer command.

       Fish  has a default limit of 100 MiB on the data it will read in a command substitution. If that limit is
       reached the command (all of it, not just the command substitution - the outer command won't  be  executed
       at  all)  fails  and $status is set to 122. This is so command substitutions can't cause the system to go
       out of memory, because typically your operating system has a much lower limit, so reading more than  that
       would  be useless and harmful. This limit can be adjusted with the fish_read_limit variable (0 meaning no
       limit). This limit also affects the read command.

       [4]  One exception: Setting $IFS to empty will disable line splitting. This  is  deprecated,  use  string
            split instead.

   Brace expansion
       Curly braces can be used to write comma-separated lists. They will be expanded with each element becoming
       a  new parameter, with the surrounding string attached. This is useful to save on typing, and to separate
       a variable name from surrounding text.

       Examples:

          > echo input.{c,h,txt}
          input.c input.h input.txt

          # Move all files with the suffix '.c' or '.h' to the subdirectory src.
          > mv *.{c,h} src/

          # Make a copy of `file` at `file.bak`.
          > cp file{,.bak}

          > set -l dogs hot cool cute "good "
          > echo {$dogs}dog
          hotdog cooldog cutedog good dog

       If there is no "," or variable expansion between the curly braces, they will not be expanded:

          # This {} isn't special
          > echo foo-{}
          foo-{}
          # This passes "HEAD@{2}" to git
          > git reset --hard HEAD@{2}
          > echo {{a,b}}
          {a} {b} # because the inner brace pair is expanded, but the outer isn't.

       If after expansion there is nothing between the braces, the argument will be removed (see  the  Combining
       Lists section):

          > echo foo-{$undefinedvar}
          # Output is an empty line, just like a bare `echo`.

       If there is nothing between a brace and a comma or two commas, it's interpreted as an empty element:

          > echo {,,/usr}/bin
          /bin /bin /usr/bin

       To use a "," as an element, quote or escape it.

   Combining lists
       Fish expands lists like brace expansions:

          >_ set -l foo x y z
          >_ echo 1$foo
          # Any element of $foo is combined with the "1":
          1x 1y 1z

          >_ echo {good,bad}" apples"
          # Any element of the {} is combined with the " apples":
          good apples bad apples

          # Or we can mix the two:
          >_ echo {good,bad}" "$foo
          good x bad x good y bad y good z bad z

       Any string attached to a list will be concatenated to each element.

       Two  lists  will  be expanded in all combinations  - every element of the first with every element of the
       second:

          >_ set -l a x y z; set -l b 1 2 3
          >_ echo $a$b # same as {x,y,z}{1,2,3}
          x1 y1 z1 x2 y2 z2 x3 y3 z3

       A result of this is that, if a list has no elements, this combines the string  with  no  elements,  which
       means the entire token is removed!

          >_ set -l c # <- this list is empty!
          >_ echo {$c}word
          # Output is an empty line - the "word" part is gone

       This  can be quite useful. For example, if you want to go through all the files in all the directories in
       PATH, use

          for file in $PATH/*

       Because PATH is a list, this expands to all the files in all the directories in it. And if there  are  no
       directories in PATH, the right answer here is to expand to no files.

       Sometimes this may be unwanted, especially that tokens can disappear after expansion. In those cases, you
       should double-quote variables - echo "$c"word.

       This  also happens after command substitution. To avoid tokens disappearing there, make the inner command
       return a trailing newline, or double-quote it:

          >_ set b 1 2 3
          >_ echo (echo x)$b
          x1 x2 x3
          >_ echo (printf '%s' '')banana
          # the printf prints nothing, so this is nothing times "banana",
          # which is nothing.
          >_ echo (printf '%s\n' '')banana
          # the printf prints a newline,
          # so the command substitution expands to an empty string,
          # so this is `''banana`
          banana
          >_ echo "$(printf '%s' '')"banana
          # quotes mean this is one argument, the banana stays

   Slices
       Sometimes it's necessary to access only some of the elements of a list (all fish variables are lists), or
       some of the lines a command substitution outputs. Both are possible in fish by writing a set  of  indices
       in brackets, like:

          # Make $var a list of four elements
          set var one two three four
          # Print the second:
          echo $var[2]
          # prints "two"
          # or print the first three:
          echo $var[1..3]
          # prints "one two three"

       In  index  brackets,  fish  understands  ranges  written  like a..b ('a' and 'b' being indices). They are
       expanded into a sequence of indices from a to b (so a a+1 a+2 ... b), going up if b is larger  and  going
       down  if  a is larger. Negative indices can also be used - they are taken from the end of the list, so -1
       is the last element, and -2 the one before it. If an index doesn't exist the range is clamped to the next
       possible index.

       If a list has 5 elements the indices go from 1 to 5, so a range of 2..16 will only go from element  2  to
       element 5.

       If  the  end is negative the range always goes up, so 2..-2 will go from element 2 to 4, and 2..-16 won't
       go anywhere because there is no way to go from the second element to one that doesn't exist, while  going
       up.   If  the  start  is  negative  the range always goes down, so -2..1 will go from element 4 to 1, and
       -16..2 won't go anywhere because there is no way to go from an element that doesn't exist to  the  second
       element, while going down.

       A  missing  starting  index  in  a  range  defaults to 1. This is allowed if the range is the first index
       expression of the sequence. Similarly, a missing ending index, defaulting to -1 is allowed for  the  last
       index in the sequence.

       Multiple ranges are also possible, separated with a space.

       Some examples:

          echo (seq 10)[1 2 3]
          # Prints: 1 2 3

          # Limit the command substitution output
          echo (seq 10)[2..5]
          # Uses elements from 2 to 5
          # Output is: 2 3 4 5

          echo (seq 10)[7..]
          # Prints: 7 8 9 10

          # Use overlapping ranges:
          echo (seq 10)[2..5 1..3]
          # Takes elements from 2 to 5 and then elements from 1 to 3
          # Output is: 2 3 4 5 1 2 3

          # Reverse output
          echo (seq 10)[-1..1]
          # Uses elements from the last output line to
          # the first one in reverse direction
          # Output is: 10 9 8 7 6 5 4 3 2 1

          # The command substitution has only one line,
          # so these will result in empty output:
          echo (echo one)[2..-1]
          echo (echo one)[-3..1]

       The same works when setting or expanding variables:

          # Reverse path variable
          set PATH $PATH[-1..1]
          # or
          set PATH[-1..1] $PATH

          # Use only n last items of the PATH
          set n -3
          echo $PATH[$n..-1]

       Variables can be used as indices for expansion of variables, like so:

          set index 2
          set letters a b c d
          echo $letters[$index] # returns 'b'

       However using variables as indices for command substitution is currently not supported, so:

          echo (seq 5)[$index] # This won't work

          set sequence (seq 5) # It needs to be written on two lines like this.
          echo $sequence[$index] # returns '2'

       When  using  indirect variable expansion with multiple $ ($$name), you have to give all indices up to the
       variable you want to slice:

          > set -l list 1 2 3 4 5
          > set -l name list
          > echo $$name[1]
          1 2 3 4 5
          > echo $$name[1..-1][1..3] # or $$name[1][1..3], since $name only has one element.
          1 2 3

   Home directory expansion
       The ~ (tilde) character at the beginning of a parameter, followed by a username,  is  expanded  into  the
       home  directory  of  the  specified user. A lone ~, or a ~ followed by a slash, is expanded into the home
       directory of the process owner:

          ls ~/Music # lists my music directory

          echo ~root # prints root's home directory, probably "/root"

   Combining different expansions
       All of the above expansions can be combined. If several expansions result in more than one parameter, all
       possible combinations are created.

       When combining multiple parameter expansions, expansions are performed in the following order:

       • Command substitutions

       • Variable expansions

       • Bracket expansion

       • Wildcard expansion

       Expansions are performed from right to left, nested bracket  expansions  and  command  substitutions  are
       performed from the inside and out.

       Example:

       If  the  current  directory contains the files 'foo' and 'bar', the command echo a(ls){1,2,3} will output
       abar1 abar2 abar3 afoo1 afoo2 afoo3.

   Table Of Operators
       Putting it together, here is a quick reference to fish's operators, all of the special symbols it uses:
                     ┌────────────┬──────────────────────────────┬──────────────────────────────┐
                     │ Symbol     │ Meaning                      │ Example                      │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ $Variable expansionecho $foo                    │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ $() and ()Command substitutioncat (grep foo  bar)  or  cat │
                     │            │                              │ $(grep foo bar)              │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ < and >Redirection,  like command >git  shortlog   -nse   .   > │
                     │            │ fileauthors                      │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ |Pipe,  connect  two  or more │ foo | grep bar | grep baz    │
                     │            │ commands                     │                              │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ ;          │ End of the command,  instead │ command1; command2           │
                     │            │ of a newline                 │                              │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ &Backgroundingsleep 5m &                   │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ {}Brace expansionls {/usr,}/bin               │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ && and ||Combinersmkdir  foo  &&  cd foo or rm │
                     │            │                              │ foo || exit                  │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ * and **Wildcardscat *.fish or count **.jpg   │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ \\Escapingecho foo\nbar or echo \$foo  │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ '' and ""Quotingrm  "file  with  spaces"  or │
                     │            │                              │ echo '$foo'                  │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ ~Home directory expansionls ~/ or ls ~root/           │
                     ├────────────┼──────────────────────────────┼──────────────────────────────┤
                     │ #Commentsecho   Hello  #  this  isn't │
                     │            │                              │ printed                      │
                     └────────────┴──────────────────────────────┴──────────────────────────────┘

   Shell variables
       Variables are a way to save data and pass it around. They can be used just by the shell, or they  can  be
       "exported",  so  that  a  copy  of the variable is available to any external command the shell starts. An
       exported variable is referred to as an "environment variable".

       To set a variable value, use the set command. A variable name can not  be  empty  and  can  contain  only
       letters, digits, and underscores. It may begin and end with any of those characters.

       Example:

       To set the variable smurf_color to the value blue, use the command set smurf_color blue.

       After  a  variable  has  been  set,  you  can  use  the value of a variable in the shell through variable
       expansion.

       Example:

          set smurf_color blue
          echo Smurfs are usually $smurf_color
          set pants_color red
          echo Papa smurf, who is $smurf_color, wears $pants_color pants

       So you set a variable with set, and use it with a $ and the name.

   Variable Scope
       All variables in fish have a scope. For example they can be global or local to a function or block:

          # This variable is global, we can use it everywhere.
          set --global name Patrick
          # This variable is local, it will not be visible in a function we call from here.
          set --local place "at the Krusty Krab"

          function local
              # This can find $name, but not $place
              echo Hello this is $name $place

              # This variable is local, it will not be available
              # outside of this function
              set --local instrument mayonnaise
              echo My favorite instrument is $instrument
              # This creates a local $name, and won't touch the global one
              set --local name Spongebob
              echo My best friend is $name
          end

          local
          # Will print:
          # Hello this is Patrick
          # My favorite instrument is mayonnaise
          # My best friend is Spongebob

          echo $name, I am $place and my instrument is $instrument
          # Will print:
          # Patrick, I am at the Krusty Krab and my instrument is

       There are four kinds of variable scopes in fish: universal, global, function and local variables.

       • Universal variables are shared between all fish sessions a user is running on one  computer.  They  are
         stored on disk and persist even after reboot.

       • Global  variables are specific to the current fish session. They can be erased by explicitly requesting
         set -e.

       • Function variables are specific to the currently executing  function.  They  are  erased  ("go  out  of
         scope") when the current function ends. Outside of a function, they don't go out of scope.

       • Local variables are specific to the current block of commands, and automatically erased when a specific
         block  goes  out  of  scope.  A  block  of commands is a series of commands that begins with one of the
         commands for, while , if, function, begin or switch, and ends with the command end. Outside of a block,
         this is the same as the function scope.

       Variables can be explicitly set to be universal with the -U or --universal  switch,  global  with  -g  or
       --global,  function-scoped  with -f or --function and local to the current block with -l or --local.  The
       scoping rules when creating or updating a variable are:

       • When a scope is explicitly given, it will be used. If a variable of the same name exists in a different
         scope, that variable will not be changed.

       • When no scope is given, but a variable of that name exists, the variable of the smallest scope will  be
         modified. The scope will not be changed.

       • When  no  scope is given and no variable of that name exists, the variable is created in function scope
         if inside a function, or global scope if no function is executing.

       There can be many variables with the same name, but different  scopes.  When  you  use  a  variable,  the
       smallest  scoped  variable of that name will be used. If a local variable exists, it will be used instead
       of the global or universal variable of the same name.

       Example:

       There are a few possible uses for different scopes.

       Typically inside functions you should use local scope:

          function something
              set -l file /path/to/my/file
              if not test -e "$file"
                  set file /path/to/my/otherfile
              end
          end

          # or

          function something
              if test -e /path/to/my/file
                  set -f file /path/to/my/file
              else
                  set -f file /path/to/my/otherfile
              end
          end

       If you want to set something in config.fish, or set something in a function and have it available for the
       rest of the session, global scope is a good choice:

          # Don't shorten the working directory in the prompt
          set -g fish_prompt_pwd_dir_length 0

          # Set my preferred cursor style:
          function setcursors
             set -g fish_cursor_default block
             set -g fish_cursor_insert line
             set -g fish_cursor_visual underscore
          end

          # Set my language
          set -gx LANG de_DE.UTF-8

       If you want to set some personal customization, universal variables are nice:

          # Typically you'd run this interactively, fish takes care of keeping it.
          set -U fish_color_autosuggestion 555

       Here is an example of local vs function-scoped variables:

          function test-scopes
              begin
                  # This is a nice local scope where all variables will die
                  set -l pirate 'There be treasure in them thar hills'
                  set -f captain Space, the final frontier
                  # If no variable of that name was defined, it is function-local.
                  set gnu "In the beginning there was nothing, which exploded"
              end

              # This will not output anything, since the pirate was local
              echo $pirate
              # This will output the good Captain's speech
              # since $captain had function-scope.
              echo $captain
              # This will output Sir Terry's wisdom.
              echo $gnu
          end

       When a function calls another, local variables aren't visible:

          function shiver
              set phrase 'Shiver me timbers'
          end

          function avast
              set --local phrase 'Avast, mateys'
              # Calling the shiver function here can not
              # change any variables in the local scope
              # so phrase remains as we set it here.
              shiver
              echo $phrase
          end
          avast

          # Outputs "Avast, mateys"

       When in doubt, use function-scoped variables. When you need to make  a  variable  accessible  everywhere,
       make  it  global.  When you need to persistently store configuration, make it universal. When you want to
       use a variable only in a short block, make it local.

   Overriding variables for a single command
       If you want to override a variable for a single command, you can  use  "var=val"  statements  before  the
       command:

          # Call git status on another directory
          # (can also be done via `git -C somerepo status`)
          GIT_DIR=somerepo git status

       Unlike other shells, fish will first set the variable and then perform other expansions on the line, so:

          set foo banana
          foo=gagaga echo $foo
          # prints gagaga, while in other shells it might print "banana"

       Multiple elements can be given in a brace expansion:

          # Call bash with a reasonable default path.
          PATH={/usr,}/{s,}bin bash

       Or with a glob:

          # Run vlc on all mp3 files in the current directory
          # If no file exists it will still be run with no arguments
          mp3s=*.mp3 vlc $mp3s

       Unlike  other  shells,  this  does  not  inhibit any lookup (aliases or similar). Calling a command after
       setting a variable override will result in the exact same command being run.

       This syntax is supported since fish 3.1.

   Universal Variables
       Universal variables are variables that are shared between all the user's fish sessions on  the  computer.
       Fish  stores many of its configuration options as universal variables. This means that in order to change
       fish settings, all you have to do is change the variable value once, and it will be automatically updated
       for all sessions, and preserved across computer reboots and login/logout.

       To see universal variables in action, start two fish sessions side  by  side,  and  issue  the  following
       command  in  one of them set fish_color_cwd blue. Since fish_color_cwd is a universal variable, the color
       of the current working directory listing in the prompt will instantly change to blue on both terminals.

       Universal variables are stored in the file .config/fish/fish_variables. Do not edit this  file  directly,
       as  your edits may be overwritten. Edit the variables through fish scripts or by using fish interactively
       instead.

       Do not append to universal variables in config.fish, because these variables will then  get  longer  with
       each new shell instance. Instead, simply set them once at the command line.

   Exporting variables
       Variables  in  fish  can  be  exported,  so  they  will  be inherited by any commands started by fish. In
       particular, this is necessary for variables used to configure external commands like PAGER or GOPATH, but
       also for variables that contain general system settings like PATH or LANGUAGE.  If  an  external  command
       needs  to know a variable, it needs to be exported. Exported variables are also often called "environment
       variables".

       This also applies to fish - when it starts up, it receives environment variables from its parent (usually
       the terminal). These typically include system configuration like PATH and locale variables.

       Variables can be explicitly set to be exported with the -x or --export switch, or not exported  with  the
       -u  or  --unexport  switch.  The exporting rules when setting a variable are similar to the scoping rules
       for variables - when an option is passed it is respected, otherwise  the  variable's  existing  state  is
       used. If no option is passed and the variable didn't exist yet it is not exported.

       As a naming convention, exported variables are in uppercase and unexported variables are in lowercase.

       For example:

          set -gx ANDROID_HOME ~/.android # /opt/android-sdk
          set -gx CDPATH . ~ (test -e ~/Videos; and echo ~/Videos)
          set -gx EDITOR emacs -nw
          set -gx GOPATH ~/dev/go
          set -gx GTK2_RC_FILES "$XDG_CONFIG_HOME/gtk-2.0/gtkrc"
          set -gx LESSHISTFILE "-"

       Note:  Exporting  is  not  a  scope,  but  an additional state. It typically makes sense to make exported
       variables global as well, but local-exported variables can be useful if you need something more  specific
       than  Overrides.  They  are  copied  to  functions  so  the  function can't alter them outside, and still
       available to commands. Global variables are accessible to functions whether they are exported or not.

   Lists
       Fish can store a list (or an "array" if you wish) of multiple strings inside of a variable:

          > set mylist first second third
          > printf '%s\n' $mylist # prints each element on its own line
          first
          second
          third

       To access one element of a list, use the index of the element inside of square brackets, like this:

          echo $PATH[3]

       List indices start at 1 in fish, not 0 like  in  other  languages.  This  is  because  it  requires  less
       subtracting  of  1 and many common Unix tools like seq work better with it (seq 5 prints 1 to 5, not 0 to
       5). An invalid index is silently ignored resulting in no  value  (not  even  an  empty  string,  just  no
       argument at all).

       If  you  don't  use  any brackets, all the elements of the list will be passed to the command as separate
       items. This means you can iterate over a list with for:

          for i in $PATH
              echo $i is in the path
          end

       This goes over every directory in PATH separately and prints a line saying it is in the path.

       To create a variable smurf, containing the items blue and small, simply write:

          set smurf blue small

       It is also possible to set or erase individual elements of a list:

          # Set smurf to be a list with the elements 'blue' and 'small'
          set smurf blue small

          # Change the second element of smurf to 'evil'
          set smurf[2] evil

          # Erase the first element
          set -e smurf[1]

          # Output 'evil'
          echo $smurf

       If you specify a negative index when expanding or assigning to a list variable, the index will  be  taken
       from the end of the list. For example, the index -1 is the last element of the list:

          > set fruit apple orange banana
          > echo $fruit[-1]
          banana

          > echo $fruit[-2..-1]
          orange
          banana

          > echo $fruit[-1..1] # reverses the list
          banana
          orange
          apple

       As you see, you can use a range of indices, see slices for details.

       All lists are one-dimensional and can't contain other lists, although it is possible to fake nested lists
       using dereferencing - see variable expansion.

       When  a  list is exported as an environment variable, it is either space or colon delimited, depending on
       whether it is a path variable:

          > set -x smurf blue small
          > set -x smurf_PATH forest mushroom
          > env | grep smurf
          smurf=blue small
          smurf_PATH=forest:mushroom

       Fish automatically creates lists from all environment variables whose  name  ends  in  PATH  (like  PATH,
       CDPATH or MANPATH), by splitting them on colons. Other variables are not automatically split.

       Lists can be inspected with the count or the contains commands:

          > count $smurf
          2

          > contains blue $smurf
          # blue was found, so it exits with status 0
          # (without printing anything)

          > echo $status
          0

          > contains -i blue $smurf
          1

       A  nice thing about lists is that they are passed to commands one element as one argument, so once you've
       set your list, you can just pass it:

          set -l grep_args -r "my string"
          grep $grep_args . # will run the same as `grep -r "my string"` .

       Unlike other shells, fish does not do "word splitting" - elements in a list stay as  they  are,  even  if
       they contain spaces or tabs.

   Argument Handling
       An important list is $argv, which contains the arguments to a function or script. For example:

          function myfunction
              echo $argv[1]
              echo $argv[3]
          end

       This function takes whatever arguments it gets and prints the first and third:

          > myfunction first second third
          first
          third

          > myfunction apple cucumber banana
          apple
          banana

       That  covers  the  positional  arguments,  but commandline tools often get various options and flags, and
       $argv would contain them intermingled with the  positional  arguments.  Typical  unix  argument  handling
       allows  short  options (-h, also grouped like in ls -lah), long options (--help) and allows those options
       to take arguments (--color=auto or --position anywhere or complete -C"git ") as well as a -- separator to
       signal the end of options. Handling all of these manually is tricky and error-prone.

       A more robust approach to option handling is argparse, which checks the defined  options  and  puts  them
       into various variables, leaving only the positional arguments in $argv. Here's a simple example:

          function mybetterfunction
              # We tell argparse about -h/--help and -s/--second
              # - these are short and long forms of the same option.
              # The "--" here is mandatory,
              # it tells it from where to read the arguments.
              argparse h/help s/second -- $argv
              # exit if argparse failed because
              # it found an option it didn't recognize
              # - it will print an error
              or return

              # If -h or --help is given, we print a little help text and return
              if set -ql _flag_help
                  echo "mybetterfunction [-h|--help] [-s|--second] [ARGUMENT ...]"
                  return 0
              end

              # If -s or --second is given, we print the second argument,
              # not the first and third.
              # (this is also available as _flag_s because of the short version)
              if set -ql _flag_second
                  echo $argv[2]
              else
                  echo $argv[1]
                  echo $argv[3]
              end
          end

       The options will be removed from $argv, so $argv[2] is the second positional argument now:

          > mybetterfunction first -s second third
          second

       For more information on argparse, like how to handle option arguments, see the argparse documentation.

   PATH variables
       Path  variables are a special kind of variable used to support colon-delimited path lists including PATH,
       CDPATH, MANPATH, PYTHONPATH, etc. All variables that end in "PATH" (case-sensitive) become PATH variables
       by default.

       PATH variables act as normal lists, except they are implicitly joined and split on colons.

          set MYPATH 1 2 3
          echo "$MYPATH"
          # 1:2:3
          set MYPATH "$MYPATH:4:5"
          echo $MYPATH
          # 1 2 3 4 5
          echo "$MYPATH"
          # 1:2:3:4:5

       Path variables will also be exported in the colon form, so set  -x  MYPATH  1  2  3  will  have  external
       commands see it as 1:2:3.

          > set -gx MYPATH /bin /usr/bin /sbin
          > env | grep MYPATH
          MYPATH=/bin:/usr/bin:/sbin

       This  is  for  compatibility  with  other  tools. Unix doesn't have variables with multiple elements, the
       closest thing it has are colon-lists like PATH. For obvious reasons this means no element can  contain  a
       :.

       Variables can be marked or unmarked as PATH variables via the --path and --unpath options to set.

   Special variables
       You can change the settings of fish by changing the values of certain variables.

       PATH   A list of directories in which to search for commands. This is a common unix variable also used by
              other tools.

       CDPATH A list of directories in which the cd builtin looks for a new directory.

       Locale Variables
              The locale variables LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, and
              LANG  set  the language option for the shell and subprograms. See the section Locale variables for
              more information.

       Color variables
              A number of variable starting with the prefixes fish_color and fish_pager_color. See Variables for
              changing highlighting colors for more information.

       fish_term24bit
              If this is set to 1, fish will assume the terminal understands 24-bit  RGB  color  sequences,  and
              won't translate them to the 256 or 16 color palette.  This is often detected automatically.

       fish_term256
              If  this  is  set  to 1, fish will assume the terminal understands 256 colors, and won't translate
              matching colors down to the 16 color palette.  This is usually autodetected.

       fish_ambiguous_width
              controls the computed width of ambiguous-width characters.  This  should  be  set  to  1  if  your
              terminal renders these characters as single-width (typical), or 2 if double-width.

       fish_emoji_width
              controls  whether  fish  assumes emoji render as 2 cells or 1 cell wide. This is necessary because
              the correct value changed from 1 to 2 in Unicode 9, and some terminals may not be aware. Set  this
              if you see graphical glitching related to emoji (or other "special" characters). It should usually
              be auto-detected.

       fish_autosuggestion_enabled
              controls  if  Autosuggestions  are  enabled.  Set  it to 0 to disable, anything else to enable. By
              default they are on.

       fish_handle_reflow
              determines whether fish should try to repaint  the  commandline  when  the  terminal  resizes.  In
              terminals  that  reflow  text  this  should  be  disabled. Set it to 1 to enable, anything else to
              disable.

       fish_key_bindings
              the name of the function that sets up the keyboard shortcuts for the command-line editor.

       fish_escape_delay_ms
              sets how long fish waits for another key after seeing  an  escape,  to  distinguish  pressing  the
              escape  key from the start of an escape sequence. The default is 30ms. Increasing it increases the
              latency  but  allows  pressing  escape  instead  of  alt  for  alt+character  bindings.  For  more
              information, see the chapter in the bind documentation.

       fish_sequence_key_delay_ms
              sets  how long fish waits for another key after seeing a key that is part of a longer sequence, to
              disambiguate. For instance if you had bound \cx\ce to open an editor, fish  would  wait  for  this
              long  in  milliseconds to see a ctrl-e after a ctrl-x. If the time elapses, it will handle it as a
              ctrl-x (by default this would copy the  current  commandline  to  the  clipboard).  See  also  Key
              sequences.

       fish_complete_path
              determines  where fish looks for completion. When trying to complete for a command, fish looks for
              files in the directories in this variable.

       fish_cursor_selection_mode
              controls whether the selection is inclusive or exclusive of the character under  the  cursor  (see
              Copy and Paste).

       fish_function_path
              determines  where fish looks for functions. When fish autoloads a function, it will look for files
              in these directories.

       fish_greeting
              the greeting message printed on startup. This is printed by a function of the same name  that  can
              be overridden for more complicated changes (see funced)

       fish_history
              the  current  history  session  name.  If  set, all subsequent commands within an interactive fish
              session will be logged to a separate file identified by the value of the variable. If  unset,  the
              default  session name "fish" is used. If set to an empty string, history is not saved to disk (but
              is still available within the interactive session).

       fish_trace
              if set and not empty, will cause fish to print commands before they execute, similar to set -x  in
              bash.  The  trace  is  printed  to  the  path  given  by  the --debug-output option to fish or the
              FISH_DEBUG_OUTPUT variable. It goes to stderr by default.

       FISH_DEBUG
              Controls which debug categories fish enables for output, analogous to the --debug option.

       FISH_DEBUG_OUTPUT
              Specifies a file to direct debug output to.

       fish_user_paths
              a list of directories that are prepended to PATH. This can be a universal variable.

       umask  the current file creation mask. The preferred way to change the  umask  variable  is  through  the
              umask function. An attempt to set umask to an invalid value will always fail.

       BROWSER
              your  preferred  web browser. If this variable is set, fish will use the specified browser instead
              of the system default browser to display the fish documentation.

       Fish also provides additional information through the values of certain environment  variables.  Most  of
       these variables are read-only and their value can't be changed with set.

       _      the  name  of  the  currently  running  command  (though this is deprecated, and the use of status
              current-command is preferred).

       argv   a list of arguments to the shell or function. argv is only defined when inside a function call, or
              if fish was invoked with a list of arguments, like fish myscript.fish foo bar. This  variable  can
              be changed.

       CMD_DURATION
              the runtime of the last command in milliseconds.

       COLUMNS and LINES
              the  current  size  of the terminal in height and width. These values are only used by fish if the
              operating system does not report the size of the terminal. Both variables must be set in that case
              otherwise a default of 80x24 will be used. They are updated when the window size changes.

       fish_kill_signal
              the signal that terminated the last foreground job, or 0 if the job exited normally.

       fish_killring
              a list of entries in fish's kill ring of cut text.

       fish_read_limit
              how many bytes fish will process with read or in a command substitution.

       fish_pid
              the process ID (PID) of the shell.

       history
              a list containing the last commands that were entered.

       HOME   the user's home directory. This variable can be changed.

       hostname
              the machine's hostname.

       IFS    the internal field separator that is used for word splitting with the read builtin.  Setting  this
              to the empty string will also disable line splitting in command substitution. This variable can be
              changed.

       last_pid
              the process ID (PID) of the last background process.

       PWD    the current working directory.

       pipestatus
              a list of exit statuses of all processes that made up the last executed pipe. See exit status.

       SHLVL  the  level  of  nesting of shells. Fish increments this in interactive shells, otherwise it simply
              passes it along.

       status the exit status of the last foreground job to exit. If the job was terminated  through  a  signal,
              the exit status will be 128 plus the signal number.

       status_generation
              the  "generation"  count  of  $status.  This  will  be  incremented only when the previous command
              produced an explicit status. (For example, background jobs will not increment this).

       TERM   the type of the current terminal. When fish tries to determine how the terminal works -  how  many
              colors  it supports, what sequences it sends for keys and other things - it looks at this variable
              and the corresponding information in the terminfo database (see man terminfo).

              Note: Typically this should not be changed as the terminal sets it to the correct value.

       USER   the current username. This variable can be changed.

       EUID   the current effective user id, set by fish at startup. This variable can be changed.

       version
              the  version  of  the  currently  running  fish  (also  available  as  FISH_VERSION  for  backward
              compatibility).

       As  a convention, an uppercase name is usually used for exported variables, while lowercase variables are
       not exported. (CMD_DURATION is an exception for historical reasons). This rule is not enforced  by  fish,
       but it is good coding practice to use casing to distinguish between exported and unexported variables.

       Fish also uses some variables internally, their name usually starting with __fish. These are internal and
       should not typically be modified directly.

   The status variable
       Whenever  a process exits, an exit status is returned to the program that started it (usually the shell).
       This exit status is an integer number, which tells the calling  application  how  the  execution  of  the
       command  went.  In  general,  a  zero  exit status means that the command executed without problem, but a
       non-zero exit status means there was some form of problem.

       Fish stores the exit status of the last process in the last job to exit in the status variable.

       If fish encounters a problem while executing a command, the status variable may also be set to a specific
       value:

       • 0 is generally the exit status of commands if they successfully performed the requested operation.

       • 1 is generally the exit status of commands if they failed to perform the requested operation.

       • 121 is generally the exit status of commands if they were supplied with invalid arguments.

       • 123 means that the command was not executed because the command name contained invalid characters.

       • 124 means that the command was not executed because none of the wildcards in the command  produced  any
         matches.

       • 125  means that while an executable with the specified name was located, the operating system could not
         actually execute the command.

       • 126 means that while a file with the specified name was located, it was not executable.

       • 127 means that no function, builtin or command with the given name could be located.

       If a process exits through a signal, the exit status will be 128 plus the number of the signal.

       The status can be negated with not (or !), which is useful in a condition. This turns a status of 0  into
       1 and any non-zero status into 0.

       There is also $pipestatus, which is a list of all status values of processes in a pipe. One difference is
       that not applies to $status, but not $pipestatus, because it loses information.

       For example:

          not cat file | grep -q fish
          echo status is: $status pipestatus is $pipestatus

       Here  $status  reflects the status of grep, which returns 0 if it found something, negated with not (so 1
       if it found something, 0 otherwise). $pipestatus reflects the status of cat (which returns  non-zero  for
       example when it couldn't find the file) and grep, without the negation.

       So  if both cat and grep succeeded, $status would be 1 because of the not, and $pipestatus would be 0 and
       0.

       It's possible for the first command to fail while the second succeeds. One common  example  is  when  the
       second program quits early.

       For example, if you have a pipeline like:

          cat file1 file2 | head -n 50

       This  will  tell cat to print two files, "file1" and "file2", one after the other, and the head will then
       only print the first 50 lines. In this case you might often see this constellation:

          > cat file1 file2 | head -n 50
          # 50 lines of output
          > echo $pipestatus
          141 0

       Here, the "141" signifies that cat was killed by signal number 13 (128 + 13 == 141) - a SIGPIPE. You  can
       also  use  fish_kill_signal to see the signal number. This happens because it was still working, and then
       head closed the pipe, so cat received a signal that it didn't ignore and so it died.

       Whether cat here will see a SIGPIPE depends on how long the file is and how much it writes  at  once,  so
       you  might  see  a pipestatus of "0 0", depending on the implementation. This is a general unix issue and
       not specific to fish. Some shells feature a "pipefail" feature that will call a pipeline failed if one of
       the processes in it failed, and this is a big problem with it.

   Locale Variables
       The "locale" of a program is its set of language and  regional  settings  that  depend  on  language  and
       cultural convention. In UNIX, these are made up of several categories. The categories are:

       LANG   This  is the typical environment variable for specifying a locale. A user may set this variable to
              express the language they speak, their region, and a character encoding.  The  actual  values  are
              specific to their platform, except for special values like C or POSIX.

              The  value  of  LANG  is  used  for each category unless the variable for that category was set or
              LC_ALL is set. So typically you only need to set LANG.

              An example value might be en_US.UTF-8 for the american version of english and the UTF-8  encoding,
              or  de_AT.UTF-8  for the austrian version of german and the UTF-8 encoding.  Your operating system
              might have a locale command that you can call as locale -a to see a list of defined locales.

              A UTF-8 encoding is recommended.

       LC_ALL Overrides the LANG environment variable and the values of the other LC_*  variables.  If  this  is
              set, none of the other variables are used for anything.

              Usually  the  other  variables  should  be used instead. Use LC_ALL only when you need to override
              something.

       LC_COLLATE
              This determines the rules about equivalence of cases and alphabetical ordering: collation.

       LC_CTYPE
              This determines classification rules, like if the type of character is an alpha, digit, and so on.
              Most importantly, it defines the text encoding - which numbers map to which characters. On  modern
              systems, this should typically be something ending in "UTF-8".

       LC_MESSAGES
              LC_MESSAGES determines the language in which messages are diisplayed.

       LC_MONETARY
              Determines currency, how it is formatted, and the symbols used.

       LC_NUMERIC
              Sets the locale for formatting numbers.

       LC_TIME
              Sets the locale for formatting dates and times.

   Builtin commands
       Fish includes a number of commands in the shell directly. We call these "builtins". These include:

       • Builtins that manipulate the shell state - cd changes directory, set sets variables

       • Builtins  for dealing with data, like string for strings and math for numbers, count for counting lines
         or arguments, path for dealing with path

       • status for asking about the shell's status

       • printf and echo for creating output

       • test for checking conditions

       • argparse for parsing function arguments

       • source to read a script in the current shell (so changes to variables  stay)  and  eval  to  execute  a
         string as script

       • random to get random numbers or pick a random element from a list

       • read for reading from a pipe or the terminal

       For a list of all builtins, use builtin -n.

       For  a  list  of  all  builtins,  functions and commands shipped with fish, see the list of commands. The
       documentation is also available by using the --help switch.

   Command lookup
       When fish is told to run something, it goes through multiple steps to find it.

       If it contains a /, fish tries to execute the given file, from the current directory on.

       If it doesn't contain a /, it could be a function, builtin, or external command, and so fish goes through
       the full lookup.

       In order:

       1. It tries to resolve it as a function.

          • If the function is already known, it uses that

          • If there is a file of the name with a ".fish" suffix in fish_function_path, it loads that. (If there
            is more than one file only the first is used)

          • If the function is now defined it uses that

       2. It tries to resolve it as a builtin.

       3. It tries to find an executable file in PATH.

          • If it finds a file, it tells the kernel to run it.

          • If the kernel knows how to run the file (e.g. via a #! line - #!/bin/sh  or  #!/usr/bin/python),  it
            does it.

          • If  the kernel reports that it couldn't run it because of a missing interpreter, and the file passes
            a rudimentary check, fish tells /bin/sh to run it.

       If none of these work, fish runs the function fish_command_not_found and sets status to 127.

       You can use type to see how fish resolved something:

          > type --short --all echo
          echo is a builtin
          echo is /usr/bin/echo

   Querying for user input
       Sometimes, you want to ask the user for input, for instance to confirm something. This can be  done  with
       the read builtin.

       Let's  make up an example. This function will glob the files in all the directories it gets as arguments,
       and if there are more than five it will ask the user if it is supposed to show them, but only  if  it  is
       connected to a terminal:

          function show_files
              # This will glob on all arguments. Any non-directories will be ignored.
              set -l files $argv/*

              # If there are more than 5 files
              if test (count $files) -gt 5
                  # and both stdin (for reading input)
                  # and stdout (for writing the prompt)
                  # are terminals
                  and isatty stdin
                  and isatty stdout
                  # Keep asking until we get a valid response
                  while read --nchars 1 -l response --prompt-str="Are you sure? (y/n)"
                        or return 1 # if the read was aborted with ctrl-c/ctrl-d
                      switch $response
                          case y Y
                              echo Okay
                              # We break out of the while and go on with the function
                              break
                          case n N
                              # We return from the function without printing
                              echo Not showing
                              return 1
                          case '*'
                              # We go through the while loop and ask again
                              echo Not valid input
                              continue
                      end
                  end
              end

              # And now we print the files
              printf '%s\n' $files
          end

       If  you run this as show_files /, it will most likely ask you until you press Y/y or N/n. If you run this
       as show_files / | cat, it will print the files without asking. If you run this as show_files ., it  might
       just print something without asking because there are fewer than five files.

   Shell variable and function names
       The names given to variables and functions (so-called "identifiers") have to follow certain rules:

       • A variable name cannot be empty. It can contain only letters, digits, and underscores. It may begin and
         end with any of those characters.

       • A  function  name  cannot  be  empty.  It may not begin with a hyphen ("-") and may not contain a slash
         ("/"). All other characters, including a space, are valid. A function name also can't be the same as  a
         reserved keyword or essential builtin like if or set.

       • A bind mode name (e.g., bind -m abc ...) must be a valid variable name.

       Other things have other restrictions. For instance what is allowed for file names depends on your system,
       but  at  the  very  least  they  cannot  contain  a "/" (because that is the path separator) or NULL byte
       (because that is how UNIX ends strings).

   Configuration files
       When fish is started, it reads and runs its  configuration  files.  Where  these  are  depends  on  build
       configuration and environment variables.

       The main file is ~/.config/fish/config.fish (or more precisely $XDG_CONFIG_HOME/fish/config.fish).

       Configuration files are run in the following order:

       • Configuration snippets (named *.fish) in the directories:

         • $__fish_config_dir/conf.d (by default, ~/.config/fish/conf.d/)

         • $__fish_sysconf_dir/conf.d (by default, /etc/fish/conf.d/)

         • Directories for others to ship configuration snippets for their software:

           • the  directories  under  $__fish_user_data_dir  (usually  ~/.local/share/fish,  controlled  by  the
             XDG_DATA_HOME environment variable)

           • a  fish/vendor_conf.d  directory   in   the   directories   listed   in   $XDG_DATA_DIRS   (default
             /usr/share/fish/vendor_conf.d and /usr/local/share/fish/vendor_conf.d)

           These  directories  are  also  accessible  in  $__fish_vendor_confdirs.  Note that changing that in a
           running fish won't do anything as by that point the directories have already been read.

         If there are multiple files with the same name in these directories, only the first will  be  executed.
         They  are  executed in order of their filename, sorted (like globs) in a natural order (i.e. "01" sorts
         before "2").

       • System-wide configuration files, where administrators can include initialization for all users  on  the
         system   -   similar   to  /etc/profile  for  POSIX-style  shells  -  in  $__fish_sysconf_dir  (usually
         /etc/fish/config.fish).

       • User  configuration,  usually  in  ~/.config/fish/config.fish  (controlled   by   the   XDG_CONFIG_HOME
         environment variable, and accessible as $__fish_config_dir).

       ~/.config/fish/config.fish  is  sourced after the snippets. This is so you can copy snippets and override
       some of their behavior.

       These files are all executed on the startup of every shell. If you want to run a command only on starting
       an interactive shell, use the exit status of the command status  --is-interactive  to  determine  if  the
       shell  is  interactive. If you want to run a command only when using a login shell, use status --is-login
       instead. This will speed up the starting of non-interactive or non-login shells.

       If you are developing another program, you may want to add configuration for  all  users  of  fish  on  a
       system.  This is discouraged; if not carefully written, they may have side-effects or slow the startup of
       the shell. Additionally, users of other  shells  won't  benefit  from  the  fish-specific  configuration.
       However, if they are required, you can install them to the "vendor" configuration directory. As this path
       may  vary  from system to system, pkg-config should be used to discover it: pkg-config --variable confdir
       fish.

       For system integration, fish also ships a file called __fish_build_paths.fish.  This  can  be  customized
       during build, for instance because your system requires special paths to be used.

   Future feature flags
       Feature  flags  are  how fish stages changes that might break scripts. Breaking changes are introduced as
       opt-in, in a few releases they become opt-out, and eventually the old behavior is removed.

       You can see the current list of features via status features:

          > status features
          stderr-nocaret          on  3.0 ^ no longer redirects stderr
          qmark-noglob            on  3.0 ? no longer globs
          regex-easyesc           on  3.1 string replace -r needs fewer \\'s
          ampersand-nobg-in-token on  3.4 & only backgrounds if followed by a separating character
          remove-percent-self     off 4.0 %self is no longer expanded (use $fish_pid)
          test-require-arg        off 4.0 builtin test requires an argument
          keyboard-protocols      on  4.0 Use keyboard protocols (kitty, xterm's modifyotherkeys

       Here is what they mean:

       • stderr-nocaret was introduced in fish 3.0 and cannot be turned off since fish  3.5.  It  can  still  be
         tested  for  compatibility,  but  a  no-stderr-nocaret value will simply be ignored. The flag made ^ an
         ordinary character instead of denoting an stderr redirection. Use 2> instead.

       • qmark-noglob was also introduced in fish 3.0 (and made the default in 4.0).  It  makes  ?  an  ordinary
         character instead of a single-character glob. Use a * instead (which will match multiple characters) or
         find other ways to match files like find.

       • regex-easyesc  was  introduced  in  3.1  (and  made the default in 3.5). It makes it so the replacement
         expression in string replace -r does one fewer round of escaping. Before, to  escape  a  backslash  you
         would  have to use string replace -ra '([ab])' '\\\\\\\\$1'. After, just '\\\\$1' is enough. Check your
         string replace calls if you use this anywhere.

       • ampersand-nobg-in-token was introduced in fish 3.4 (and made the default in 3.5). It makes it so a &  i
         no  longer  interpreted  as  the  backgrounding operator in the middle of a token, so dealing with URLs
         becomes easier. Either put spaces or a semicolon after the &. This is  recommended  formatting  anyway,
         and fish_indent will have done it for you already.

       • remove-percent-self turns off the special %self expansion. It was introduced in 4.0. To get fish's pid,
         you can use the fish_pid variable.

       • test-require-arg  removes builtin test's one-argument form (test "string". It was introduced in 4.0. To
         test if a string is non-empty, use test -n "string". If disabled, any call to test  that  would  change
         sends a debug message of category "deprecated-test", so starting fish with fish --debug=deprecated-test
         can be used to find offending calls.

       • keyboard-protocols  lets fish turn on various keyboard protocols including the kitty keyboard protocol.
         It was introduced in 4.0 and is on by default.  Disable it with no-keyboard-protocols  to  work  around
         bugs in your terminal.

       These changes are introduced off by default. They can be enabled on a per session basis:

          > fish --features qmark-noglob,regex-easyesc

       or opted into globally for a user:

          > set -U fish_features regex-easyesc qmark-noglob

       Features  will  only  be  set  on  startup,  so this variable will only take effect if it is universal or
       exported.

       You can also use the version as a group, so 3.0 is equivalent  to  "stderr-nocaret"  and  "qmark-noglob".
       Instead of a version, the special group all enables all features.

       Prefixing a feature with no- turns it off instead. E.g. to reenable the ? single-character glob:

          set -Ua fish_features no-qmark-noglob

   Event handlers
       When  defining  a  new function in fish, it is possible to make it into an event handler, i.e. a function
       that is automatically run when a specific event takes place. Events that can trigger a handler  currently
       are:

       • When a signal is delivered

       • When a job exits

       • When the value of a variable is updated

       • When the prompt is about to be shown

       Example:

       To specify a signal handler for the WINCH signal, write:

          function my_signal_handler --on-signal WINCH
              echo Got WINCH signal!
          end

       Fish already has the following named events for the --on-event switch:

       • fish_prompt is emitted whenever a new fish prompt is about to be displayed.

       • fish_preexec is emitted right before executing an interactive command. The commandline is passed as the
         first parameter. Not emitted if command is empty.

       • fish_posterror is emitted right after executing a command with syntax errors. The commandline is passed
         as the first parameter.

       • fish_postexec is emitted right after executing an interactive command. The commandline is passed as the
         first parameter. Not emitted if command is empty.

       • fish_exit is emitted right before fish exits.

       • fish_cancel is emitted when a commandline is cleared.

       • fish_focus_in is emitted when fish's terminal gains focus.

       • fish_focus_out is emitted when fish's terminal loses focus.

       Events  can  be fired with the emit command, and do not have to be defined before. The names just need to
       match. For example:

          function handler --on-event imdone
              echo generator is done $argv
          end

          function generator
              sleep 1
              # The "imdone" is the name of the event
              # the rest is the arguments to pass to the handler
              emit imdone with $argv
          end

       If there are multiple handlers for an event, they will all be run, but the  order  might  change  between
       fish releases, so you should not rely on it.

       Please  note  that  event  handlers only become active when a function is loaded, which means you need to
       otherwise source or execute a function instead of relying on autoloading. One approach is to put it  into
       your configuration file.

       For more information on how to define new event handlers, see the documentation for the function command.

   Debugging fish scripts
       Fish  includes  basic  built-in  debugging  facilities that allow you to stop execution of a script at an
       arbitrary point. When this happens you are presented with an interactive prompt where you can execute any
       fish command to inspect or change state (there are no debug commands as such). For example, you can check
       or change the value of any variables using printf and  set.  As  another  example,  you  can  run  status
       print-stack-trace  to  see  how  the  current  breakpoint  was reached. To resume normal execution of the
       script, simply type exit or ctrl-d.

       To start a debug session simply insert the builtin command breakpoint at  the  point  in  a  function  or
       script  where  you wish to gain control, then run the function or script. Also, the default action of the
       TRAP signal is to call this builtin, meaning a running script can be actively debugged by sending it  the
       TRAP  signal  (kill  -s  TRAP  <PID>).  There  is  limited support for interactively setting or modifying
       breakpoints from this debug prompt: it is possible to insert new breakpoints in (or remove old ones from)
       other functions by using the funced function to edit the definition of a function, but it is not possible
       to add or remove a breakpoint from the function/script currently loaded and being executed.

       Another way to debug script issues is to set the fish_trace variable, e.g.  fish_trace=1  fish_prompt  to
       see which commands fish executes when running the fish_prompt function.

   Profiling fish scripts
       If   you   specifically   want  to  debug  performance  issues,  fish  can  be  run  with  the  --profile
       /path/to/profile.log option to save a profile  to  the  specified  path.  This  profile  log  includes  a
       breakdown of how long each step in the execution took.

       For example:

          > fish --profile /tmp/sleep.prof -ic 'sleep 3s'
          > cat /tmp/sleep.prof
          Time    Sum     Command
          3003419 3003419 > sleep 3s

       This  will  show the time for each command itself in the first column, the time for the command and every
       subcommand (like any commands inside of a function or  command  substitutions)  in  the  second  and  the
       command itself in the third, separated with tabs.

       The time is given in microseconds.

       To see the slowest commands last, sort -nk2 /path/to/logfile is useful.

       For profiling fish's startup there is also --profile-startup /path/to/logfile.

       See fish for more information.

   Commands
       This is a list of all the commands fish ships with.

       Broadly speaking, these fall into a few categories:

   Keywords
       Core language keywords that make up the syntax, like

       • if and else for conditions.

       • for and while for loops.

       • break and continue to control loops.

       • function to define functions.

       • return to return a status from a function.

       • begin to begin a block and end to end any block (including ifs and loops).

       • and, or and not to combine commands logically.

       • switch and case to make multiple blocks depending on the value of a variable.

       • command or builtin to tell fish what sort of thing to execute

       • time to time execution

       • exec tells fish to replace itself with a command.

       • end to end a block

   Tools
       Builtins to do a task, like

       • cd to change the current directory.

       • echo or printf to produce output.

       • set_color to colorize output.

       • set to set, query or erase variables.

       • read to read input.

       • string for string manipulation.

       • path for filtering paths and handling their components.

       • math does arithmetic.

       • argparse to make arguments easier to handle.

       • count to count arguments.

       • type  to find out what sort of thing (command, builtin or function) fish would call, or if it exists at
         all.

       • test checks conditions like if a file exists or a string is empty.

       • contains to see if a list contains an entry.

       • eval and source to run fish code from a string or file.

       • status to get shell information, like whether it's interactive or a login shell, or which  file  it  is
         currently running.

       • abbr manages Abbreviations.

       • bind to change bindings.

       • complete manages completions.

       • commandline to get or change the commandline contents.

       • fish_config to easily change fish's configuration, like the prompt or colorscheme.

       • random to generate random numbers or pick from a list.

   Known functions
       Known  functions  are  a  customization  point. You can change them to change how your fish behaves. This
       includes:

       • fish_prompt and fish_right_prompt and fish_mode_prompt to print your prompt.

       • fish_command_not_found to tell fish what to do when a command is not found.

       • fish_title to change the terminal's title.

       • fish_greeting to show a greeting when fish starts.

       • fish_should_add_to_history to determine if a command should be added to history

   Helper functions
       Some helper functions, often to give you information for use in your prompt:

       • fish_git_prompt and fish_hg_prompt to print information about the current git or mercurial repository.

       • fish_vcs_prompt to print information for either.

       • fish_svn_prompt to print information about the current svn repository.

       • fish_status_to_signal to give a signal name from a return status.

       • prompt_pwd to give the current directory in a nicely formatted and shortened way.

       • prompt_login to describe the current login, with user and hostname, and to explain  if  you  are  in  a
         chroot or connected via ssh.

       • prompt_hostname to give the hostname, shortened for use in the prompt.

       • fish_is_root_user to check if the current user is an administrator user like root.

       • fish_add_path to easily add a path to $PATH.

       • alias to quickly define wrapper functions ("aliases").

       • fish_delta to show what you have changed from the default configuration.

       • export as a compatibility function for other shells.

   Helper commands
       fish also ships some things as external commands so they can be easily called from elsewhere.

       This  includes  fish_indent  to  format  fish code and fish_key_reader to show you what escape sequence a
       keypress produces.

   The full list
       And here is the full list:

   _ - call fish's translations
   Synopsis
       _ STRING

   Description
       _ translates its arguments into the current language, if possible.

       It is equivalent to gettext fish STRING, meaning it can only be used to look up fish's own translations.

       It requires fish to be built with  gettext  support.  If  that  support  is  disabled,  or  there  is  no
       translation it will simply echo the argument back.

       The language depends on the current locale, set with LANG and LC_MESSAGES.

   Options
       _ takes no options.

   Examples
          > _ File
          Datei

   abbr - manage fish abbreviations
   Synopsis
       abbr --add NAME [--position command | anywhere] [-r | --regex PATTERN] [-c | --command COMMAND]
                       [--set-cursor[=MARKER]] ([-f | --function FUNCTION] | EXPANSION)
       abbr --erase NAME ...
       abbr --rename OLD_WORD NEW_WORD
       abbr --show
       abbr --list
       abbr --query NAME ...

   Description
       abbr manages abbreviations - user-defined words that are replaced with longer phrases when entered.

       NOTE:
          Only typed-in commands use abbreviations. Abbreviations are not expanded in scripts.

       For  example,  a  frequently-run command like git checkout can be abbreviated to gco.  After entering gco
       and pressing space or enter, the full text git checkout will  appear  in  the  command  line.   To  avoid
       expanding  something  that  looks  like  an  abbreviation, the default ctrl-space binding inserts a space
       without expanding.

       An abbreviation may match a literal word, or it may match a pattern given by a regular  expression.  When
       an  abbreviation  matches a word, that word is replaced by new text, called its expansion. This expansion
       may be a fixed new phrase, or it can be dynamically created via a fish function.  This  expansion  occurs
       after pressing space or enter.

       Combining these features, it is possible to create custom syntaxes, where a regular expression recognizes
       matching tokens, and the expansion function interprets them. See the Examples section.

       Changed  in version 3.6.0: Previous versions of this allowed saving abbreviations in universal variables.
       That's no longer possible. Existing variables will still be imported and abbr --erase will also erase the
       variables.  We recommend adding abbreviations to config.fish by just adding the abbr --add command.  When
       you run abbr, you will see output like this

          > abbr
          abbr -a -- foo bar # imported from a universal variable, see `help abbr`

       In that case you should take the part before the # comment and save it in config.fish, then you  can  run
       abbr --erase to remove the universal variable:

          > abbr >> ~/.config/fish/config.fish
          > abbr --erase (abbr --list)

       Alternatively you can keep them in a separate configuration file by doing something like the following:

          > abbr > ~/.config/fish/conf.d/myabbrs.fish

       This  will  save all your abbreviations in "myabbrs.fish", overwriting the whole file so it doesn't leave
       any duplicates, or restore abbreviations you had erased.  Of course any functions will have to  be  saved
       separately, see funcsave.

   "add" subcommand
       abbr [-a | --add] NAME [--position command | anywhere] [-r | --regex PATTERN]
            [-c | --command COMMAND] [--set-cursor[=MARKER]] ([-f | --function FUNCTION] | EXPANSION)

       abbr --add creates a new abbreviation. With no other options, the string NAME is replaced by EXPANSION.

       With  --position command, the abbreviation will only expand when it is positioned as a command, not as an
       argument to another command. With --position anywhere the abbreviation may expand anywhere in the command
       line. The default is command.

       With --command COMMAND, the abbreviation will only expand when it is used as an  argument  to  the  given
       COMMAND.  Multiple  --command  can  be used together, and the abbreviation will expand for each. An empty
       COMMAND means it will expand only when there is no command. --command  implies  --position  anywhere  and
       disallows  --position  command.  Even  with  different COMMANDS, the NAME of the abbreviation needs to be
       unique. Consider using --regex if you want to expand the same word differently for multiple commands.

       With --regex, the abbreviation matches using the regular expression given  by  PATTERN,  instead  of  the
       literal  NAME. The pattern is interpreted using PCRE2 syntax and must match the entire token. If multiple
       abbreviations match the same token, the last abbreviation added is used.

       With --set-cursor=MARKER, the cursor is moved to the first occurrence of MARKER  in  the  expansion.  The
       MARKER  value  is erased. The MARKER may be omitted (i.e. simply --set-cursor), in which case it defaults
       to %.

       With -f FUNCTION or --function FUNCTION, FUNCTION is treated as the name of a fish function instead of  a
       literal  replacement.  When the abbreviation matches, the function will be called with the matching token
       as an argument. If the function's exit status  is  0  (success),  the  token  will  be  replaced  by  the
       function's output; otherwise the token will be left unchanged. No EXPANSION may be given separately.

   Examples
          abbr --add gco git checkout

       Add a new abbreviation where gco will be replaced with git checkout.

          abbr -a --position anywhere -- -C --color

       Add a new abbreviation where -C will be replaced with --color. The -- allows -C to be treated as the name
       of the abbreviation, instead of an option.

          abbr -a L --position anywhere --set-cursor "% | less"

       Add a new abbreviation where L will be replaced with | less, placing the cursor before the pipe.

          function last_history_item
              echo $history[1]
          end
          abbr -a !! --position anywhere --function last_history_item

       This  first  creates a function last_history_item which outputs the last entered command. It then adds an
       abbreviation which replaces !! with the result of calling this function. Taken together, this is  similar
       to the !! history expansion feature of bash.

          function vim_edit
              echo vim $argv
          end
          abbr -a vim_edit_texts --position command --regex ".+\.txt" --function vim_edit

       This  first  creates  a  function  vim_edit  which  prepends  vim  before  its  argument. It then adds an
       abbreviation which matches commands ending in .txt, and replaces the command with the result  of  calling
       this  function.  This allows text files to be "executed" as a command to open them in vim, similar to the
       "suffix alias" feature in zsh.

          abbr 4DIRS --set-cursor=! "$(string join \n -- 'for dir in */' 'cd $dir' '!' 'cd ..' 'end')"

       This creates an abbreviation "4DIRS" which expands to a multi-line loop "template." The  template  enters
       each  directory  and  then  leaves it. The cursor is positioned ready to enter the command to run in each
       directory, at the location of the !, which is itself erased.

          abbr --command git co checkout

       Turns "co" as an argument to "git" into "checkout". Multiple commands  are  possible,  --command={git,hg}
       would expand "co" to "checkout" for both git and hg.

   Other subcommands
          abbr --rename OLD_NAME NEW_NAME

       Renames an abbreviation, from OLD_NAME to NEW_NAME

          abbr [-s | --show]

       Show all abbreviations in a manner suitable for import and export

          abbr [-l | --list]

       Prints the names of all abbreviation

          abbr [-e | --erase] NAME

       Erases the abbreviation with the given name

          abbr -q or --query [NAME...]

       Return 0 (true) if one of the NAME is an abbreviation.

          abbr -h or --help

       Displays help for the abbr command.

   alias - create a function
   Synopsis
       alias
       alias [--save] NAME DEFINITION
       alias [--save] NAME=DEFINITION

   Description
       NOTE: This page documents the fish builtin alias.  To see the documentation on any non-fish versions, use
       command man alias.

       alias  is  a simple wrapper for the function builtin, which creates a function wrapping a command. It has
       similar syntax to POSIX shell alias. For other uses, it is recommended to define a function.

       If you want to ease your interactive use, to save typing, consider using an abbreviation instead.

       fish marks functions that have been created by alias by including the command used to create them in  the
       function  description. You can list alias-created functions by running alias without arguments. They must
       be erased using functions -e.

       • NAME is the name of the alias

       • DEFINITION is the actual command to execute. alias automatically appends $argv, so that all  parameters
         used with the alias are passed to the actual command.

       You  cannot  create an alias to a function with the same name. Note that spaces need to be escaped in the
       call to alias just like at the command line, even inside quoted parts.

       The following options are available:

       -h or --help
              Displays help about using this command.

       -s or --save
              Saves the function created by the alias into your fish configuration directory using funcsave.

   Example
       The following code will create rmi, which runs rm with additional arguments on every invocation.

          alias rmi="rm -i"

          # This is equivalent to entering the following function:
          function rmi --wraps rm --description 'alias rmi=rm -i'
              rm -i $argv
          end

       alias sometimes requires escaping, as you can see here:

          # This needs to have the spaces escaped or "Chrome.app..."
          # will be seen as an argument to "/Applications/Google":
          alias chrome='/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome'

   See more
       1. The function command this builds on.

       2. Functions.

       3. Defining aliases.

   and - conditionally execute a command
   Synopsis
       PREVIOUS; and COMMAND

   Description
       and is used to execute a command if the previous command was successful (returned a status of 0).

       and statements may be used as part of the condition in an while or if block.

       and does not change the current exit status itself, but the command it runs most likely  will.  The  exit
       status of the last foreground command to exit can always be accessed using the $status variable.

       The -h or --help option displays help about using this command.

   Example
       The following code runs the make command to build a program. If the build succeeds, make's exit status is
       0, and the program is installed. If either step fails, the exit status is 1, and make clean is run, which
       removes the files created by the build process.

          make; and make install; or make clean

   See Alsoor command

       • not command

   argparse - parse options passed to a fish script or function
   Synopsis
       argparse [OPTIONS] OPTION_SPEC ... -- [ARG ...]

   Description
       This  command  makes  it easy for fish scripts and functions to handle arguments. You pass arguments that
       define the known options, followed by a literal --, then the arguments to be  parsed  (which  might  also
       include a literal --). argparse then sets variables to indicate the passed options with their values, and
       sets $argv to the remaining arguments. See the usage section below.

       Each  option  specification (OPTION_SPEC) is written in the domain specific language described below. All
       OPTION_SPECs must appear after any argparse flags  and  before  the  --  that  separates  them  from  the
       arguments to be parsed.

       Each  option  that  is  seen in the ARG list will result in variables named _flag_X, where X is the short
       flag letter and the long flag name (if they are  defined).  For  example  a  --help  option  could  cause
       argparse to define one variable called _flag_h and another called _flag_help.

       The  variables will be set with local scope (i.e., as if the script had done set -l _flag_X). If the flag
       is a boolean (that is, it just is passed or not, it doesn't have a value) the values are  the  short  and
       long  flags  seen. If the option is not a boolean the values will be zero or more values corresponding to
       the values collected when the ARG list is processed. If the flag was not seen the flag variable will  not
       be set.

   Options
       The following argparse options are available. They must appear before all OPTION_SPECs:

       -n or --name
              The  command name for use in error messages. By default the current function name will be used, or
              argparse if run outside of a function.

       -x or --exclusive OPTIONS
              A comma separated list of options that are mutually exclusive. You can use this more than once  to
              define  multiple sets of mutually exclusive options.  You give either the short or long version of
              each option, and you still need to otherwise define the options.

       -N or --min-args NUMBER
              The minimum number of acceptable non-option arguments. The default is zero.

       -X or --max-args NUMBER
              The maximum number of acceptable non-option arguments. The default is infinity.

       -i or --ignore-unknown
              Ignores unknown options, keeping them and their arguments in $argv instead.

       -s or --stop-nonopt
              Causes scanning the arguments to stop as soon as the first  non-option  argument  is  seen.  Among
              other things, this is useful to implement subcommands that have their own options.

       -h or --help
              Displays help about using this command.

   Usage
       To use this command, pass the option specifications (OPTION_SPEC), a mandatory --, and then the arguments
       to be parsed.

       A simple example:

          argparse 'h/help' 'n/name=' -- $argv
          or return

       If  $argv is empty then there is nothing to parse and argparse returns zero to indicate success. If $argv
       is not empty then it is checked for flags -h, --help, -n and --name. If they are found they  are  removed
       from  the  arguments  and  local  variables called _flag_OPTION are set so the script can determine which
       options were seen. If $argv doesn't have any errors, like an unknown option or a missing mandatory  value
       for  an option, then argparse exits with a status of zero. Otherwise it writes appropriate error messages
       to stderr and exits with a status of one.

       The or return means that the function returns argparse's status if it failed, so if it goes  on  argparse
       succeeded.

       To use the flags argparse has extracted:

          # Checking for _flag_h and _flag_help is equivalent
          # We check if it has been given at least once
          if set -ql _flag_h
              echo "Usage: my_function [-h | --help] [-n | --name=NAME]" >&2
              return 1
          end

          set -l myname somedefault
          set -ql _flag_name[1]
          and set myname $_flag_name[-1] # here we use the *last* --name=

       Any  characters  in  the flag name that are not valid in a variable name (like - dashes) will be replaced
       with underscores.

       The -- argument is required. You do not have to include any option specifications or arguments after  the
       -- but you must include the --. For example, this is acceptable:

          set -l argv foo
          argparse 'h/help' 'n/name' -- $argv
          argparse --min-args=1 -- $argv

       But this is not:

          set -l argv
          argparse 'h/help' 'n/name' $argv

       The  first -- seen is what allows the argparse command to reliably separate the option specifications and
       options to argparse itself (like --ignore-unknown) from the command arguments, so it is required.

   Option Specifications
       Each option specification consists of:

       • An optional alphanumeric short flag character, followed by a / if the short flag can be used by someone
         invoking your command or, for backwards compatibility, a - if it should not be exposed as a valid short
         flag (in which case it will also not be exposed as a flag variable).

       • An optional long flag name, which if not present the short flag can be used, and if that  is  also  not
         present, an error is reported

       • Nothing if the flag is a boolean that takes no argument or is an integer flag, or

            • = if it requires a value and only the last instance of the flag is saved, or

            • =? if it takes an optional value and only the last instance of the flag is saved, or

            • =+ if it requires a value and each instance of the flag is saved.

       • Optionally a ! followed by fish script to validate the value. Typically this will be a function to run.
         If the exit status is zero the value for the flag is valid. If non-zero the value is invalid. Any error
         messages  should  be  written to stdout (not stderr). See the section on Flag Value Validation for more
         information.

       See the fish_opt command for a friendlier but more verbose way to create option specifications.

       If a flag is not seen when parsing the arguments then the corresponding _flag_X var(s) will not be set.

   Integer flag
       Sometimes commands take numbers directly as options, like foo -55. To allow this one option spec can have
       the # modifier so that any integer will be understood as this flag, and the last number will be given  as
       its value (as if = was used).

       The  # must follow the short flag letter (if any), and other modifiers like = are not allowed, except for
       - (for backwards compatibility):

          m#maximum

       This does not read numbers given as +NNN, only those that look like flags - -NNN.

   Note: Optional arguments
       An option defined with =? can take optional arguments. Optional arguments have to be directly attached to
       the option they belong to.

       That means the argument will only be used for the option if you use it like:

          cmd --flag=value
          # or
          cmd  -fvalue

       but not if used like:

          cmd --flag value
          # "value" here will be used as a positional argument
          # and "--flag" won't have an argument.

       If this weren't the case, using an option without an optional argument would be  difficult  if  you  also
       wanted to use positional arguments.

       For example:

          grep --color auto
          # Here "auto" will be used as the search string,
          # "color" will not have an argument and will fall back to the default,
          # which also *happens to be* auto.
          grep --color always
          # Here grep will still only use color "auto"matically
          # and search for the string "always".

       This isn't specific to argparse but common to all things using getopt(3) (if they have optional arguments
       at all). That grep example is how GNU grep actually behaves.

   Flag Value Validation
       Sometimes  you  need  to  validate  the  option  values. For example, that it is a valid integer within a
       specific range, or an ip address, or something entirely different. You can always do this after  argparse
       returns but you can also request that argparse perform the validation by executing arbitrary fish script.
       To do so simply append an ! (exclamation-mark) then the fish script to be run. When that code is executed
       three vars will be defined:

       • _argparse_cmd will be set to the value of the value of the argparse --name value.

       • _flag_name will be set to the short or long flag that being processed.

       • _flag_value will be set to the value associated with the flag being processed.

       These variables are passed to the function as local exported variables.

       The  script  should  write any error messages to stdout, not stderr. It should return a status of zero if
       the flag value is valid otherwise a non-zero status to indicate it is invalid.

       Fish ships with a _validate_int function that accepts a --min and --max  flag.  Let's  say  your  command
       accepts a -m or --max flag and the minimum allowable value is zero and the maximum is 5. You would define
       the  option  like  this: m/max=!_validate_int --min 0 --max 5. The default if you just call _validate_int
       without those flags is to simply check that the value is a valid integer with no limits on the min or max
       value allowed.

       Here are some examples of flag validations:

          # validate that a path is a directory
          argparse 'p/path=!test -d "$_flag_value"' -- --path $__fish_config_dir
          # validate that a function does not exist
          argparse 'f/func=!not functions -q "$_flag_value"' -- -f alias
          # validate that a string matches a regex
          argparse 'c/color=!string match -rq \'^#?[0-9a-fA-F]{6}$\' "$_flag_value"' -- -c 'c0ffee'
          # validate with a validator function
          argparse 'n/num=!_validate_int --min 0 --max 99' -- --num 42

   Example OPTION_SPECs
       Some OPTION_SPEC examples:

       • h/help means that both -h and --help are valid. The flag is a boolean and can be used more  than  once.
         If either flag is used then _flag_h and _flag_help will be set to however either flag was seen, as many
         times as it was seen. So it could be set to -h, -h and --help, and count $_flag_h would yield "3".

       • help  means  that  only --help is valid. The flag is a boolean and can be used more than once. If it is
         used then _flag_help will be set as above. Also h-help (with an arbitrary short letter)  for  backwards
         compatibility.

       • longonly=  is  a  flag  --longonly  that  requires an option, there is no short flag or even short flag
         variable.

       • n/name= means that both -n and --name are valid. It requires a value and can be used at most  once.  If
         the  flag  is  seen  then _flag_n and _flag_name will be set with the single mandatory value associated
         with the flag.

       • n/name=? means that both -n and --name are valid. It accepts an optional value and can be used at  most
         once.  If  the  flag is seen then _flag_n and _flag_name will be set with the value associated with the
         flag if one was provided else it will be set with no values.

       • name=+ means that only --name is valid. It requires a value and can be used more than once. If the flag
         is seen then _flag_name will be set with the values associated with each occurrence.

       • x means that only -x is valid. It is a boolean that can be used more than once.  If  it  is  seen  then
         _flag_x will be set as above.

       • x=,  x=?, and x=+ are similar to the n/name examples above but there is no long flag alternative to the
         short flag -x.

       • #max (or #-max) means that flags matching the regex "^--?\d+$" are valid. When seen they  are  assigned
         to  the  variable  _flag_max.  This  allows  any  valid positive or negative integer to be specified by
         prefixing it with a single "-". Many commands support this idiom. For example head -3 /a/file  to  emit
         only the first three lines of /a/file.

       • n#max  means  that  flags  matching  the regex "^--?\d+$" are valid. When seen they are assigned to the
         variables _flag_n and _flag_max. This allows any valid positive or negative integer to be specified  by
         prefixing  it  with a single "-". Many commands support this idiom. For example head -3 /a/file to emit
         only the first three lines of /a/file. You can also specify the value using  either  flag:  -n  NNN  or
         --max NNN in this example.

       • #longonly causes the last integer option to be stored in _flag_longonly.

       After  parsing the arguments the argv variable is set with local scope to any values not already consumed
       during flag processing. If there are no unbound values the variable is set but count $argv will be zero.

       If an error occurs during argparse processing it will  exit  with  a  non-zero  status  and  print  error
       messages to stderr.

   Examples
       A simple use:

          argparse h/help -- $argv
          or return

          if set -q _flag_help
              # TODO: Print help here
              return 0
          end

       This just wants one option - -h / --help. Any other option is an error. If it is given it prints help and
       exits.

       How fish_add_path - add to the path parses its args:

          argparse -x g,U -x P,U -x a,p g/global U/universal P/path p/prepend a/append h/help m/move v/verbose n/dry-run -- $argv

       There  are  a  variety  of boolean flags, all with long and short versions. A few of these cannot be used
       together, and that is what the -x flag is used for.  -x g,U means that --global and --universal or  their
       short  equivalents  conflict, and if they are used together you get an error.  In this case you only need
       to give the short or long flag, not the full option specification.

       After this it figures out which variable it should operate on according to the --path flag:

          set -l var fish_user_paths
          set -q _flag_path
          and set var PATH

          # ...

          # Check for --dry-run.
          # The "-" has been replaced with a "_" because
          # it is not valid in a variable name
          not set -ql _flag_dry_run
          and set $var $result

   Limitations
       One limitation with --ignore-unknown is that, if an unknown  option  is  given  in  a  group  with  known
       options, the entire group will be kept in $argv. argparse will not do any permutations here.

       For instance:

          argparse --ignore-unknown h -- -ho
          echo $_flag_h # is -h, because -h was given
          echo $argv # is still -ho

       This limitation may be lifted in future.

       Additionally,  it  can only parse known options up to the first unknown option in the group - the unknown
       option could take options, so it isn't clear what any character after an unknown option means.

   begin - start a new block of code
   Synopsis
       begin; [COMMANDS ...]; end

   Description
       begin is used to create a new block of code.

       A block allows the introduction of a new variable scope, redirection of the input or output of a  set  of
       commands as a group, or to specify precedence when using the conditional commands like and.

       The block is unconditionally executed. begin; ...; end is equivalent to if true; ...; end.

       begin  does not change the current exit status itself. After the block has completed, $status will be set
       to the status returned by the most recent command.

       The -h or --help option displays help about using this command.

   Example
       The following code sets a number of variables inside of a block scope. Since the variables are set inside
       the block and have local scope, they will be automatically deleted when the block ends.

          begin
              set -l PIRATE Yarrr

              ...
          end

          echo $PIRATE
          # This will not output anything, since the PIRATE variable
          # went out of scope at the end of the block

       In the following code, all output is redirected to the file out.html.

          begin
              echo $xml_header
              echo $html_header
              if test -e $file
                  ...
              end
              ...
          end > out.html

   bg - send jobs to background
   Synopsis
       bg [PID ...]

   Description
       bg sends jobs to the background, resuming them if they are stopped.

       A background job is executed simultaneously with fish, and does not have access to the  keyboard.  If  no
       job  is  specified,  the  last  job  to  be  used is put in the background. If PID is specified, the jobs
       containing the specified process IDs are put in the background.

       A PID of the format %n, where n is an integer, will be interpreted as  the  PID  of  job  number  n.  Job
       numbers can be seen in the output of jobs.

       When  at  least  one  of  the  arguments  isn't  a  valid  job  specifier, bg will print an error without
       backgrounding anything.

       When all arguments are valid job specifiers, bg will background all matching jobs that exist.

       The -h or --help option displays help about using this command.

   Example
       The typical use is to run something, stop it with ctrl-z, and then continue it in the background with bg:

          > find / -name "*.js" >/tmp/jsfiles 2>/dev/null # oh no, this takes too long, let's press Ctrl-z!
          fish: Job 1, 'find / -name "*.js" >/tmp/jsfil…' has stopped
          > bg
          Send job 1 'find / -name "*.js" >/tmp/jsfiles 2>/dev/null' to background
          > # I can continue using this shell!
          > # Eventually:
          fish: Job 1, 'find / -name "*.js" >/tmp/jsfil…' has ended

       bg 123 456 789 will background the jobs that contain processes 123, 456 and 789.

       If only 123 and 789 exist, it will still background them and print an error about 456.

       bg 123 banana or bg banana 123 will complain that "banana" is not a valid job specifier.

       bg %2 will background job 2.

   bind - handle fish key bindings
   Synopsis
       bind [(-M | --mode) MODE] [(-m | --sets-mode) NEW_MODE] [--preset | --user] [-s | --silent] KEYS COMMAND ...
       bind [(-M | --mode) MODE] [--preset] [--user] [KEYS]
       bind [-a | --all] [--preset] [--user]
       bind (-f | --function-names)
       bind (-L | --list-modes)
       bind (-e | --erase) [(-M | --mode) MODE] [--preset] [--user] [-a | --all] | KEYS ...

   Description
       bind manages key bindings.

       If both KEYS and COMMAND are given, bind adds (or replaces) a binding in MODE.  If only  KEYS  is  given,
       any existing binding in the given MODE will be printed.

       KEYS is a comma-separated list of key names.  Modifier keys can be specified by prefixing a key name with
       a  combination  of  ctrl-,  alt-,  shift- and super- (i.e. the "windows" or "command" key).  For example,
       pressing w while holding the Alt modifier is written as alt-w.  Key names are case-sensitive; for example
       alt-W is the same as alt-shift-w.  ctrl-x,ctrl-e would mean pressing ctrl-x followed by ctrl-e.

       Some keys have names, usually because they don't have  an  obvious  printable  character  representation.
       They are:

       • the arrow keys up, down, left and right,

       • backspace,

       • comma (,),

       • delete,

       • end,

       • enter,

       • escape,

       • f1 through f12.

       • home,

       • insert,

       • minus (-),

       • pageup,

       • pagedown,

       • space and

       • tab,

       These names are case-sensitive.

       An  empty  value  ('') for KEYS designates the generic binding that will be used if nothing else matches.
       For most bind modes, it makes sense to bind this to the self-insert function (i.e. bind ''  self-insert).
       This  will insert any keystrokes that have no bindings otherwise. Non-printable characters are ignored by
       the editor, so this will not result in control sequences being inserted.

       To find the name of a key combination you can use fish_key_reader.

       COMMAND can be any fish command, but it can also be one of  a  set  of  special  input  functions.  These
       include  functions for moving the cursor, operating on the kill-ring, performing tab completion, etc. Use
       bind --function-names or see below for a list of these input functions.

       NOTE:
          If a script changes the commandline, it should finish by calling the repaint special input function.

       If no KEYS argument is provided, all bindings (in the given MODE) are printed. If KEYS is provided but no
       COMMAND, just the binding matching that sequence is printed.

       Key bindings may use "modes", which mimics vi's modal input behavior.  The  default  mode  is  "default".
       Every  key  binding  applies to a single mode; you can specify which one with -M MODE. If the key binding
       should change the mode, you can specify the new mode with -m NEW_MODE. The mode can be viewed and changed
       via the $fish_bind_mode variable. If you want to change the mode from inside a  fish  function,  use  set
       fish_bind_mode MODE.

       To  save  custom  key  bindings,  put  the  bind  statements  into  config.fish. Alternatively, fish also
       automatically executes a function called fish_user_key_bindings if it exists.

   Options
       The following options are available:

       -f or --function-names
              Display a list of available input functions

       -L or --list-modes
              Display a list of defined bind modes

       -M MODE or --mode MODE
              Specify a bind mode that the bind is used in. Defaults to "default"

       -m NEW_MODE or --sets-mode NEW_MODE
              Change the current mode to NEW_MODE after this binding is executed

       -e or --erase
              Erase the binding with the given sequence and mode  instead  of  defining  a  new  one.   Multiple
              sequences  can  be  specified with this flag.  Specifying -a or --all with -M or --mode erases all
              binds in the given mode regardless of sequence.  Specifying -a  or  --all  without  -M  or  --mode
              erases all binds in all modes regardless of sequence.

       -a or --all
              See --erase

       --preset and --user
              Specify  if  bind  should  operate on user or preset bindings.  User bindings take precedence over
              preset bindings when fish looks up mappings.  By default, all bind invocations work on the  "user"
              level  except  for listing, which will show both levels.  All invocations except for inserting new
              bindings can operate on both levels at the same time (if both  --preset  and  --user  are  given).
              --preset should only be used in full binding sets (like when working on fish_vi_key_bindings).

       -s or --silent
              Silences some of the error messages, including for unknown key names and unbound sequences.

       -k KEY_NAME or --key KEY_NAME
              This  looks  up  KEY_NAME  in  terminfo  and  binds that sequence instead of a key that fish would
              decode.  To view a list of the terminfo keys fish knows about, use bind --key-names  or  bind  -K.
              This  is  deprecated  and provided for compatibility with older fish versions. You should bind the
              keys directly.  Instead of bind -k sright use bind shift-right, instead of bind -k  nul  use  bind
              ctrl-space and so on.

       -h or --help
              Displays help about using this command.

   Special input functions
       The following special input functions are available:

       and    only  execute  the  next  function  if  the  previous  succeeded (note: only some functions report
              success)

       accept-autosuggestion
              accept the current autosuggestion. Returns false when there was nothing to accept.

       backward-char
              move one character to the left.  If the completion pager is active, select the previous completion
              instead.

       backward-char-passive
              move one character to the left, but do not trigger any  non-movement-related  operations.  If  the
              cursor  is at the start of the commandline, does nothing. Does not change the selected item in the
              completion pager UI when shown.

       backward-bigword
              move one whitespace-delimited word to the left

       backward-token
              move one argument to the left

       backward-delete-char
              deletes one character of input to the left of the cursor

       backward-kill-bigword
              move the whitespace-delimited word to the left of the cursor to the killring

       backward-kill-token
              move the argument to the left of the cursor to the killring

       backward-kill-line
              move everything from the beginning of the line to the cursor to the killring

       backward-kill-path-component
              move one path component to the left of the cursor to the killring. A path component is  everything
              likely  to  belong  to  a  path  component,  i.e.  not any of the following: /={,}'":@ |;<>&, plus
              newlines and tabs.

       backward-kill-word
              move the word to the left of the cursor to the killring. The  "word"  here  is  everything  up  to
              punctuation or whitespace.

       backward-word
              move one word to the left

       beginning-of-buffer
              moves to the beginning of the buffer, i.e. the start of the first line

       beginning-of-history
              move to the beginning of the history

       beginning-of-line
              move to the beginning of the line

       begin-selection
              start selecting text

       cancel close  the  pager  if  it is open, or undo the most recent completion if one was just inserted, or
              otherwise cancel the current commandline and replace it with a new empty one

       cancel-commandline
              cancel the current commandline and replace it with a new empty one, leaving the old one  in  place
              with a marker to show that it was cancelled

       capitalize-word
              make the current word begin with a capital letter

       clear-commandline
              empty the entire commandline

       clear-screen
              clears  the  screen and redraws the prompt. if the terminal doesn't support clearing the screen it
              is the same as repaint.

       complete
              guess the remainder of the current token

       complete-and-search
              invoke the searchable pager on completion options (for convenience, this also moves  backwards  in
              the completion pager)

       delete-char
              delete one character to the right of the cursor

       delete-or-exit
              delete one character to the right of the cursor, or exit the shell if the commandline is empty

       down-line
              move down one line

       downcase-word
              make the current word lowercase

       end-of-buffer
              moves to the end of the buffer, i.e. the end of the first line

       end-of-history
              move to the end of the history

       end-of-line
              move to the end of the line

       end-selection
              end selecting text

       expand-abbr
              expands any abbreviation currently under the cursor

       execute
              run the current commandline

       exit   exit the shell

       forward-bigword
              move one whitespace-delimited word to the right

       forward-token
              move one argument to the right

       forward-char
              move  one  character  to  the  right;  or  if  at  the  end of the commandline, accept the current
              autosuggestion.  If the completion pager is active, select the next completion instead.

       forward-char-passive
              move one character to the right, but do not trigger any non-movement-related  operations.  If  the
              cursor is at the end of the commandline, does not accept the current autosuggestion (if any). Does
              not change the selected item in the completion pager, if shown.

       forward-single-char
              move  one  character  to the right; or if at the end of the commandline, accept a single char from
              the current autosuggestion.

       forward-word
              move one word to the right; or if at the end of the commandline, accept one word from the  current
              autosuggestion.

       history-pager
              invoke  the  searchable  pager on history (incremental search); or if the history pager is already
              active, search further backwards in time.

       history-pager-delete
              permanently delete the current history item, either from the  history  pager  or  from  an  active
              up-arrow history search

       history-search-backward
              search the history for the previous match

       history-search-forward
              search the history for the next match

       history-prefix-search-backward
              search the history for the previous prefix match

       history-prefix-search-forward
              search the history for the next prefix match

       history-token-search-backward
              search the history for the previous matching argument

       history-token-search-forward
              search the history for the next matching argument

       forward-jump and backward-jump
              read another character and jump to its next occurrence after/before the cursor

       forward-jump-till and backward-jump-till
              jump to right before the next occurrence

       repeat-jump and repeat-jump-reverse
              redo the last jump in the same/opposite direction

       jump-to-matching-bracket
              jump to matching bracket if the character under the cursor is bracket; otherwise, jump to the next
              occurrence of any right bracket after the cursor.  The following brackets are considered: ([{}])

       jump-till-matching-bracket
              the  same  as jump-to-matching-bracket but offset cursor to the right for left bracket, and offset
              cursor to the left for right bracket.  The offset is applied for both the position  we  jump  from
              and  position  we  jump to.  In other words, the cursor will continuously jump inside the brackets
              but won't reach them by 1 character.  The input function is useful to emulate ib vi  text  object.
              The following brackets are considered: ([{}])

       kill-bigword
              move the next whitespace-delimited word to the killring

       kill-token
              move the next argument to the killring

       kill-line
              move everything from the cursor to the end of the line to the killring

       kill-selection
              move the selected text to the killring

       kill-whole-line
              move the line (including the following newline) to the killring. If the line is the last line, its
              preceding newline is also removed

       kill-inner-line
              move the line (without the following newline) to the killring

       kill-word
              move the next word to the killring

       nextd-or-forward-word
              if  the  commandline is empty, then move forward in the directory history, otherwise move one word
              to the  right;  or  if  at  the  end  of  the  commandline,  accept  one  word  from  the  current
              autosuggestion.

       or     only  execute  the next function if the previous did not succeed (note: only some functions report
              failure)

       pager-toggle-search
              toggles the search field if the completions pager is visible;  or  if  used  after  history-pager,
              search forwards in time.

       prevd-or-backward-word
              if  the commandline is empty, then move backward in the directory history, otherwise move one word
              to the left

       repaint
              reexecutes   the   prompt   functions   and   redraws   the   prompt   (also   force-repaint   for
              backwards-compatibility)

       repaint-mode
              reexecutes  the  fish_mode_prompt  and  redraws  the  prompt.  This  is  useful for vi mode. If no
              fish_mode_prompt exists or it prints nothing, it acts like a normal repaint.

       self-insert
              inserts the matching sequence into the command line

       self-insert-notfirst
              inserts the matching sequence into the command line, unless the cursor is at the beginning

       suppress-autosuggestion
              remove the current autosuggestion. Returns true if there was a suggestion to remove.

       swap-selection-start-stop
              go to the other end of the highlighted text without changing the selection

       transpose-chars
              transpose two characters to the left of the cursor

       transpose-words
              transpose two words to the left of the cursor

       togglecase-char
              toggle the capitalisation (case) of the character under the cursor

       togglecase-selection
              toggle the capitalisation (case) of the selection

       insert-line-under
              add a new line under the current line

       insert-line-over
              add a new line over the current line

       up-line
              move up one line

       undo and redo
              revert or redo the most recent edits on the command line

       upcase-word
              make the current word uppercase

       yank   insert the latest entry of the killring into the buffer

       yank-pop
              rotate to the previous entry of the killring

   Additional functions
       The following functions are included as normal functions, but are particularly useful for input editing:

       up-or-search and down-or-search
              move the cursor or search the history depending on the cursor position and current mode

       edit_command_buffer
              open the visual editor (controlled by the VISUAL or EDITOR environment variables) with the current
              command-line contents

       fish_clipboard_copy
              copy the current selection to the system clipboard

       fish_clipboard_paste
              paste the current selection from the system clipboard before the cursor

       fish_commandline_append
              append the argument to the command-line. If the command-line already ends with the argument,  this
              removes  the  suffix  instead.  Starts  with  the last command from history if the command-line is
              empty.

       fish_commandline_prepend
              prepend the argument to the command-line. If the command-line already starts  with  the  argument,
              this  removes the prefix instead. Starts with the last command from history if the command-line is
              empty.

   Examples
       Exit the shell when ctrl-d is pressed:

          bind ctrl-d 'exit'

       Perform a history search when pageup is pressed:

          bind pageup history-search-backward

       Turn on vi key bindings and rebind ctrl-c to clear the input line:

          set -g fish_key_bindings fish_vi_key_bindings
          bind -M insert ctrl-c kill-whole-line repaint

       Launch git diff and repaint the commandline afterwards when ctrl-g is pressed:

          bind ctrl-g 'git diff' repaint

   Terminal Limitations
       Unix terminals, like the ones fish operates in, are at heart 70s technology. They have  some  limitations
       that applications running inside them can't workaround.

       For  instance, historically the control key modifies a character by setting the top three bits to 0. This
       means:

       • Many characters + control are indistinguishable from other keys: ctrl-i is tab, ctrl-j is newline (\n).

       • Control and shift don't work simultaneously - ctrl-X is the same as ctrl-x.

       Other keys don't have a direct encoding, and are sent as escape sequences. For example right ()  usually
       sends \e\[C.

       Some  modern  terminals  support  newer encodings for keys, that allow distinguishing more characters and
       modifiers, and fish enables as many of these as it can, automatically.

       When in doubt, run fish_key_reader - explore what characters keyboard keys send. If that tells  you  that
       pressing  ctrl-i sends tab, your terminal does not support these better encodings, and so fish is limited
       to what it sends.

   Key timeout
       When you've bound a sequence of multiple characters, there is always the possibility that fish  has  only
       seen a part of it, and then it needs to disambiguate between the full sequence and part of it.

       For example:

          bind j,k 'commandline -i foo'
          # or `bind jk`

       will  bind  the  sequence  jk  to  insert  "foo" into the commandline. When you've only pressed "j", fish
       doesn't know if it should insert the "j" (because of the default self-insert), or wait for the "k".

       You can enable a timeout for this, by setting the fish_sequence_key_delay_ms variable to the  timeout  in
       milliseconds.  If  the timeout elapses, fish will no longer wait for the sequence to be completed, and do
       what it can with the characters it already has.

       The escape key is a special case, because it can be used standalone as a real key or as part of a  longer
       escape sequence, like function or arrow keys. Holding alt and something else also typically sends escape,
       for  example holding alt+a will send an escape character and then an "a". So the escape character has its
       own timeout configured with fish_escape_delay_ms.

       See also Key sequences.

   block - temporarily block delivery of events
   Synopsis
       block [(--local | --global)]
       block --erase

   Description
       block delays delivery of all events triggered by fish or the emit, thus delaying  the  execution  of  any
       function  registered  --on-event,  --on-process-exit,  --on-job-exit, --on-variable and --on-signal until
       after the block is removed.

       Event blocks should not be confused with code blocks, which are created with begin, if, while or for

       Without options, block sets up a block that is released automatically at the end of the current  function
       scope.

       The following options are available:

       -l or --local
              Release the block automatically at the end of the current innermost code block scope.

       -g or --global
              Never automatically release the lock.

       -e or --erase
              Release global block.

       -h or --help
              Display help about using this command.

   Example
          # Create a function that listens for events
          function --on-event foo foo; echo 'foo fired'; end

          # Block the delivery of events
          block -g

          emit foo
          # No output will be produced

          block -e
          # 'foo fired' will now be printed

   Notes
       Events  are  only  received from the current fish process as there is no way to send events from one fish
       process to another.

   break - stop the current inner loop
   Synopsis
       LOOP_CONSTRUCT
          [COMMANDS ...]
          break
          [COMMANDS ...]
       end

   Description
       break halts a currently running loop (LOOP_CONSTRUCT), such as a for or while loop. It is  usually  added
       inside of a conditional block such as an if block.

       There are no parameters for break.

   Example
       The following code searches all .c files for "smurf", and halts at the first occurrence.

          for i in *.c
              if grep smurf $i
                  echo Smurfs are present in $i
                  break
              end
          end

   See Also
       • the continue command, to skip the remainder of the current iteration of the current inner loop

   breakpoint - launch debug mode
   Synopsis
       breakpoint

   Description
       breakpoint is used to halt a running script and launch an interactive debugging prompt.

       For more details, see Debugging fish scripts in the fish manual.

       There are no parameters for breakpoint.

   builtin - run a builtin command
   Synopsis
       builtin [OPTIONS] BUILTINNAME
       builtin --query BUILTINNAME ...
       builtin --names

   Description
       builtin  forces  the  shell  to  use  a builtin command named BUILTIN, rather than a function or external
       program.

       The following options are available:

       -n or --names
              Lists the names of all defined builtins.

       -q or --query BUILTIN
              Tests if any of the specified builtins exist. If any exist, it returns 0, 1 otherwise.

       -h or --help
              Displays help about using this command.

   Example
          builtin jobs
          # executes the jobs builtin, even if a function named jobs exists

   case - conditionally execute a block of commands
   Synopsis
       switch VALUE
          [case [GLOB ...]
              [COMMAND ...]]
       end

   Description
       switch executes one of several blocks of commands, depending on whether a specified value matches one  of
       several  values. case is used together with the switch statement in order to determine which block should
       be executed.

       Each case command is given one or more parameters. The first case command with a parameter  that  matches
       the  string  specified  in  the  switch command will be evaluated. case parameters may contain wildcards.
       These need to be escaped or quoted in order to avoid regular wildcard expansion using filenames.

       Note that fish does not fall through on case statements. Only the first matching case is executed.

       Note that command substitutions in a case statement will be evaluated even if its body is not taken.  All
       substitutions,  including  command  substitutions,  must  be  performed  before the value can be compared
       against the parameter.

   Example
       Say $animal contains the name of an animal. Then this code would classify it:

          switch $animal
              case cat
                  echo evil
              case wolf dog human moose dolphin whale
                  echo mammal
              case duck goose albatross
                  echo bird
              case shark trout stingray
                  echo fish
              # Note that the next case has a wildcard which is quoted
              case '*'
                  echo I have no idea what a $animal is
          end

       If the above code was run with $animal set to whale, the output would be mammal.

       If $animal was set to "banana", it would print "I have no idea what a banana is".

   cd - change directory
   Synopsis
       cd [DIRECTORY]

   Description
       NOTE: This page documents the fish builtin cd.  To see the documentation on any  non-fish  versions,  use
       command man cd.

       cd changes the current working directory.

       If  DIRECTORY  is given, it will become the new directory. If no parameter is given, the HOME environment
       variable will be used.

       If DIRECTORY is a relative path, all the paths in the CDPATH  will  be  tried  as  prefixes  for  it,  in
       addition to PWD.  It is recommended to keep . as the first element of CDPATH, or PWD will be tried last.

       Fish will also try to change directory if given a command that looks like a directory (starting with ., /
       or ~, or ending with /), without explicitly requiring cd.

       Fish  also  ships  a  wrapper  function  around  the  builtin cd that understands cd - as changing to the
       previous directory.  See also prevd.  This wrapper function maintains a history of the 25  most  recently
       visited directories in the $dirprev and $dirnext global variables.  If you make those universal variables
       your cd history is shared among all fish instances.

       As  a  special  case, cd . is equivalent to cd $PWD, which is useful in cases where a mountpoint has been
       recycled or a directory has been removed and recreated.

       The --help or -h option displays help about using this command, and does not change the directory.

   Examples
          cd
          # changes the working directory to your home directory.

          cd /usr/src/fish-shell
          # changes the working directory to /usr/src/fish-shell

   See Also
       Navigate directories using the directory history or the directory stack

   cdh - change to a recently visited directory
   Synopsis
       cdh [DIRECTORY]

   Description
       cdh with no arguments presents a list of recently visited directories.  You can then select  one  of  the
       entries  by  letter or number.  You can also press tab to use the completion pager to select an item from
       the list.  If you give it a single argument it is equivalent to cd DIRECTORY.

       Note that the cd command limits directory history to the  25  most  recently  visited  directories.   The
       history  is  stored  in  the  dirprev and dirnext variables, which this command manipulates.  If you make
       those universal variables, your cd history is shared among all fish instances.

   See Also
       • the dirh command to print the directory history

       • the prevd command to move backward

       • the nextd command to move forward

   command - run a program
   Synopsis
       command [OPTIONS] [COMMANDNAME [ARG ...]]

   Description
       NOTE: This page documents the fish builtin command.  To see the documentation on any  non-fish  versions,
       use command man command.

       command forces the shell to execute the program COMMANDNAME and ignore any functions or builtins with the
       same name.

       In command foo, command is a keyword.

       The following options are available:

       -a or --all
              Prints all COMMAND found in PATH, in the order found.

       -q or --query
              Return  0  if any of the given commands could be found, 127 otherwise.  Don't print anything.  For
              compatibility, this is also --quiet (deprecated).

       -s or --search (or -v)
              Prints the external command that would be  executed,  or  prints  nothing  if  no  file  with  the
              specified name could be found in PATH.

       -h or --help
              Displays help about using this command.

   Examples
       command ls executes the ls program, even if an ls function also exists.
       command -s ls prints the path to the ls program.
       command -q git; and command git log runs git log only if git exists.
       command -sq git and command -q git and command -vq git return true (0) if a git command could be found and don't print anything.

   commandline - set or get the current command line buffer
   Synopsis
       commandline [OPTIONS] [CMD]

   Description
       commandline can be used to set or get the current contents of the command line buffer.

       With no parameters, commandline returns the current value of the command line.

       With CMD specified, the command line buffer is erased and replaced with the contents of CMD.

       The following options are available:

       -C or --cursor
              Set  or get the current cursor position, not the contents of the buffer.  If no argument is given,
              the current cursor position is printed, otherwise the argument is interpreted as  the  new  cursor
              position.  If one of the options -j, -p or -t is given, the position is relative to the respective
              substring instead of the entire command line buffer.

       -B or --selection-start
              Get current position of the selection start in the buffer.

       -E or --selection-end
              Get current position of the selection end in the buffer.

       -f or --function
              Causes  any  additional  arguments  to  be  interpreted as input functions, and puts them into the
              queue, so that they will be read before any additional actual key presses are.  This option cannot
              be combined with any other option.  See bind for a list of input functions.

       -h or --help
              Displays help about using this command.

       The following options change the way commandline updates the command line buffer:

       -a or --append
              Do not remove the current commandline, append the specified string at the end of it.

       -i or --insert
              Do not remove the current commandline, insert the specified string at the current cursor position

       -r or --replace
              Remove the current commandline and replace it with the specified string (default)

       The following options change what part of the commandline is printed or updated:

       -b or --current-buffer
              Select the entire commandline, not including any displayed autosuggestion (default).

       -j or --current-job
              Select the current job - a job here is one pipeline.  Stops at logical  operators  or  terminators
              (;, &, and newlines).

       -p or --current-process
              Select  the  current  process  -  a  process  here  is  one  command.  Stops at logical operators,
              terminators, and pipes.

       -s or --current-selection
              Selects the current selection

       -t or --current-token
              Selects the current token

       --search-field
              Use the pager search field instead of the command line. Returns false if the search field  is  not
              shown.

       The following options change the way commandline prints the current commandline buffer:

       -c or --cut-at-cursor
              Only  print  selection  up until the current cursor position.  If combined with --tokens-expanded,
              this will print up until the last completed token - excluding the token the cursor is in.  This is
              typically what you would want for instance in completions.  To  get  both,  use  both  commandline
              --cut-at-cursor  --tokens-expanded;  commandline  --cut-at-cursor  --current-token, or commandline
              -cx; commandline -ct for short.

       -x or --tokens-expanded
              Perform  argument  expansion  on  the  selection  and  print  one  argument  per  line.    Command
              substitutions are not expanded but forwarded as-is.

       --tokens-raw
              Print arguments in the selection as they appear on the command line, one per line.

       -o or tokenize
              Deprecated; do not use.

       If  commandline  is called during a call to complete a given string using complete -C STRING, commandline
       will consider the specified string to be the current contents of the command line.

       The following options output metadata about the commandline state:

       -L or --line
              If no argument is given, print the line that the cursor is on, with the topmost line  starting  at
              1.  Otherwise, set the cursor to the given line.

       --column
              If  no  argument  is  given,  print  the  1-based  offset from the start of the line to the cursor
              position in Unicode code points.  Otherwise, set the cursor to the given code point offset.

       -S or --search-mode
              Evaluates to true if the commandline is performing a history search.

       -P or --paging-mode
              Evaluates to true if the commandline is showing pager contents, such as tab completions.

       --paging-full-mode
              Evaluates to true if the commandline is showing pager contents, such as tab  completions  and  all
              lines are shown (no "<n> more rows" message).

       --is-valid
              Returns  true  when  the  commandline  is syntactically valid and complete.  If it is, it would be
              executed when the execute bind function is called.  If the commandline is incomplete, return 2, if
              erroneous, return 1.

       --showing-suggestion
              Evaluates to true (i.e. returns 0) when the  shell  is  currently  showing  an  automatic  history
              completion/suggestion,  available  to  be consumed via one of the forward- bindings.  For example,
              can be used to determine if moving the cursor to the right when already at the  end  of  the  line
              would   have   no   effect  or  if  it  would  cause  a  completion  to  be  accepted  (note  that
              forward-char-passive does this automatically).

   Example
       commandline -j $history[3] replaces the job under the cursor with the third item from  the  command  line
       history.

       If the commandline contains

          >_ echo $flounder >&2 | less; and echo $catfish

       (with the cursor on the "o" of "flounder")

       The echo $flounder >& is the first process, less the second and and echo $catfish the third.

       echo $flounder >&2 | less is the first job, and echo $catfish the second.

       $flounder is the current token.

       The most common use for something like completions is

          set -l tokens (commandline -xpc)

       which  gives  the  current  process (what is being completed), tokenized into separate entries, up to but
       excluding the currently being completed token

       If you are then also interested in the in-progress token, add

          set -l current (commandline -ct)

       Note that this makes it easy to render fish's infix  matching  moot  -  if  possible  it's  best  if  the
       completions just print all possibilities and leave the matching to the current token up to fish's logic.

       More examples:

          >_ commandline -t
          $flounder
          >_ commandline -ct
          $fl
          >_ commandline -b # or just commandline
          echo $flounder >&2 | less; and echo $catfish
          >_ commandline -p
          echo $flounder >&2
          >_ commandline -j
          echo $flounder >&2 | less

   complete - edit command-specific tab-completions
   Synopsis
       complete ((-c | --command) | (-p | --path)) COMMAND [OPTIONS]
       complete (-C | --do-complete) [--escape] STRING

   Description
       complete defines, removes or lists completions for a command.

       For an introduction to writing your own completions, see Writing your own completions in the fish manual.

       The following options are available:

       -c or --command COMMAND
              Specifies  that  COMMAND  is  the  name  of  the  command. If there is no -c or -p, one non-option
              argument will be used as the command.

       -p or --path COMMAND
              Specifies that COMMAND is the absolute path of the command (optionally containing wildcards).

       -e or --erase
              Deletes the specified completion.

       -s or --short-option SHORT_OPTION
              Adds a short option to the completions list.

       -l or --long-option LONG_OPTION
              Adds a GNU-style long option to the completions list.

       -o or --old-option OPTION
              Adds an old-style short or long option (see below for details).

       -a or --arguments ARGUMENTS
              Adds the specified option arguments to the completions list.

       -k or --keep-order
              Keeps the order of ARGUMENTS instead of sorting alphabetically. Multiple complete  calls  with  -k
              result in arguments of the later ones displayed first.

       -f or --no-files
              This completion may not be followed by a filename.

       -F or --force-files
              This  completion  may  be  followed  by  a filename, even if another applicable complete specified
              --no-files.

       -r or --require-parameter
              This completion must have an option argument, i.e. may not be followed by  another  option.   This
              means  that  the  next  argument  is the argument to the option.  If this is not given, the option
              argument must be attached like -xFoo or --color=auto.

       -x or --exclusive
              Short for -r and -f.

       -d or --description DESCRIPTION
              Add a description for this completion, to be shown in the completion pager.

       -w or --wraps WRAPPED_COMMAND
              Causes the specified command to inherit completions from WRAPPED_COMMAND (see below for details).

       -n or --condition CONDITION
              This completion should only be used if the CONDITION (a shell command) returns 0.  This  makes  it
              possible to specify completions that should only be used in some cases. If multiple conditions are
              specified, fish will try them in the order they are specified until one fails or all succeeded.

       -C or --do-complete STRING
              Makes  complete  try  to  find  all  possible completions for the specified string. If there is no
              STRING, the current commandline is used instead.

       --escape
              When used with -C, escape special characters in completions.

       -h or --help
              Displays help about using this command.

       Command-specific tab-completions in fish are based on the notion of options and arguments. An option is a
       parameter which begins with a hyphen, such as -h, -help or --help. Arguments are parameters that  do  not
       begin  with a hyphen. Fish recognizes three styles of options, the same styles as the GNU getopt library.
       These styles are:

       • Short options, like -a. Short options are a single character long, are preceded by a single hyphen  and
         can  be grouped together (like -la, which is equivalent to -l -a). Option arguments may be specified by
         appending the option with the value (-w32), or, if  --require-parameter  is  given,  in  the  following
         parameter (-w 32).

       • Old-style  options,  long like -Wall or -name or even short like -a. Old-style options can be more than
         one character long, are preceded by a single hyphen and may not be grouped together.  Option  arguments
         are specified by default following a space (-foo null) or after = (-foo=null).

       • GNU-style  long options, like --colors. GNU-style long options can be more than one character long, are
         preceded by two hyphens, and can't be grouped together. Option arguments may be  specified  after  a  =
         (--quoting-style=shell),   or,   if   --require-parameter   is   given,   in  the  following  parameter
         (--quoting-style shell).

       Multiple commands and paths can be given in  one  call  to  define  the  same  completions  for  multiple
       commands.

       Multiple  command  switches  and wrapped commands can also be given to define multiple completions in one
       call.

       Invoking complete multiple times for the same command adds the new definitions on  top  of  any  existing
       completions defined for the command.

       When  -a or --arguments is specified in conjunction with long, short, or old-style options, the specified
       arguments are only completed as arguments for any of the specified  options.  If  -a  or  --arguments  is
       specified without any long, short, or old-style options, the specified arguments are used when completing
       non-option arguments to the command (except when completing an option argument that was specified with -r
       or --require-parameter).

       Command  substitutions  found  in ARGUMENTS should return a newline-separated list of arguments, and each
       argument may optionally have a tab character followed by the argument description. Description given this
       way override a description given with -d or --description.

       Descriptions given with --description are also used to group options given with -s,  -o  or  -l.  Options
       with the same (non-empty) description will be listed as one candidate, and one of them will be picked. If
       the description is empty or no description was given this is skipped.

       The  -w  or  --wraps  options  causes  the specified command to inherit completions from another command,
       "wrapping" the other command. The wrapping command can also have additional completions.  A  command  can
       wrap  multiple  commands,  and  wrapping is transitive: if A wraps B, and B wraps C, then A automatically
       inherits all of C's completions. Wrapping can be removed using the -e or --erase options.  Wrapping  only
       works  for completions specified with -c or --command and are ignored when specifying completions with -p
       or --path.

       When erasing completions, it is possible to either erase  all  completions  for  a  specific  command  by
       specifying complete -c COMMAND -e, or by specifying a specific completion option to delete.

       When  complete  is  called  without  anything that would define or erase completions (options, arguments,
       wrapping, ...), it shows matching completions instead. So complete without any arguments shows all loaded
       completions, complete -c foo shows all loaded completions for foo. Since completions are autoloaded,  you
       will have to trigger them first.

   Examples
       The short-style option -o for the gcc command needs a file argument:

          complete -c gcc -s o -r

       The short-style option -d for the grep command requires one of read, skip or recurse:

          complete -c grep -s d -x -a "read skip recurse"

       The  su command takes any username as an argument. Usernames are given as the first colon-separated field
       in the file /etc/passwd. This can be specified as:

          complete -x -c su -d "Username" -a "(cat /etc/passwd | cut -d : -f 1)"

       The rpm command has several different modes. If the -e or --erase flag has  been  specified,  rpm  should
       delete  one or more packages, in which case several switches related to deleting packages are valid, like
       the nodeps switch.

       This can be written as:

          complete -c rpm -n "__fish_contains_opt -s e erase" -l nodeps -d "Don't check dependencies"

       where __fish_contains_opt is a function that checks the  command  line  buffer  for  the  presence  of  a
       specified set of options.

       To implement an alias, use the -w or --wraps option:

          complete -c hub -w git

       Now  hub  inherits  all  of  the  completions  from  git.  Note  this can also be specified in a function
       declaration (function thing -w otherthing).

          complete -c git

       Shows all completions for git.

       Any command foo that doesn't support grouping multiple short options in one string (not supporting -xf as
       short for -x -f) or a short option and its value in one string (not  supporting  -d9  instead  of  -d  9)
       should  be  specified  as  a  single-character  old-style  option instead of as a short-style option; for
       example, complete -c foo -o s; complete -c foo -o v would never suggest foo -ov but rather foo -o -v.

   contains - test if a word is present in a list
   Synopsis
       contains [OPTIONS] KEY [VALUES ...]

   Description
       contains tests whether the set VALUES contains the string KEY.  If so, contains exits  with  code  0;  if
       not, it exits with code 1.

       The following options are available:

       -i or --index
              Print the index (number of the element in the set) of the first matching element.

       -h or --help
              Displays help about using this command.

       Note  that  contains  interprets  all  arguments  starting with a - as an option to contains, until an --
       argument is reached.

       See the examples below.

   Example
       If animals is a list of animals, the following will test if animals contains "cat":

          if contains cat $animals
             echo Your animal list is evil!
          end

       This code will add some directories to PATH if they aren't yet included:

          for i in ~/bin /usr/local/bin
              if not contains $i $PATH
                  set PATH $PATH $i
              end
          end

       While this will check if function hasargs is being ran with the -q option:

          function hasargs
              if contains -- -q $argv
                  echo '$argv contains a -q option'
              end
          end

       The -- here stops contains from treating -q to an option to itself.  Instead it treats  it  as  a  normal
       string to check.

   continue - skip the remainder of the current iteration of the current inner loop
   Synopsis
       LOOP_CONSTRUCT; [COMMANDS ...;] continue; [COMMANDS ...;] end

   Description
       continue  skips the remainder of the current iteration of the current inner loop, such as a for loop or a
       while loop. It is usually added inside of a conditional block  such  as  an  if  statement  or  a  switch
       statement.

   Example
       The following code removes all tmp files that do not contain the word smurf.

          for i in *.tmp
              if grep smurf $i
                  continue
              end
              # This "rm" is skipped over if "continue" is executed.
              rm $i
              # As is this "echo"
              echo $i
          end

   See Also
       • the break command, to stop the current inner loop

   count - count the number of elements of a list
   Synopsis
       count STRING1 STRING2 ...
       COMMAND | count
       count [...] < FILE

   Description
       count prints the number of arguments that were passed to it, plus the number of newlines passed to it via
       stdin.  This  is usually used to find out how many elements an environment variable list contains, or how
       many lines there are in a text file.

       count does not accept any options, not even -h or --help.

       count exits with a non-zero exit status if no arguments were passed to it, and with zero if at least  one
       argument was passed.

       Note that, like wc -l, reading from stdin counts newlines, so echo -n foo | count will print 0.

   Example
          count $PATH
          # Returns the number of directories in the users PATH variable.

          count *.txt
          # Returns the number of files in the current working directory
          # ending with the suffix '.txt'.

          git ls-files --others --exclude-standard | count
          # Returns the number of untracked files in a git repository

          printf '%s\n' foo bar | count baz
          # Returns 3 (2 lines from stdin plus 1 argument)

          count < /etc/hosts
          # Counts the number of entries in the hosts file

   dirh - print directory history
   Synopsis
       dirh

   Description
       dirh  prints  the current directory history. The current position in the history is highlighted using the
       color defined in the fish_color_history_current environment variable.

       dirh does not accept any parameters.

       Note that the cd command limits directory history to  the  25  most  recently  visited  directories.  The
       history is stored in the $dirprev and $dirnext variables.

   See Also
       • the cdh command to display a prompt to quickly navigate the history

       • the prevd command to move backward

       • the nextd command to move forward

   dirs - print directory stack
   Synopsis
       dirs [-c]

   Description
       dirs prints the current directory stack, as created by pushd and modified by popd.

       The following options are available:

       -c:    Clear the directory stack instead of printing it.

       -h or --help
              Displays help about using this command.

       dirs does not accept any arguments.

   See Also
       • the cdh command, which provides a more intuitive way to navigate to recently visited directories.

   disown - remove a process from the list of jobs
   Synopsis
       disown [PID ...]

   Description
       disown  removes the specified job from the list of jobs. The job itself continues to exist, but fish does
       not keep track of it any longer.  This will make fish lose all knowledge of the job, so functions defined
       with --on-process-exit or --on-job-exit will no longer fire.

       Jobs in the list of jobs are sent a hang-up signal when fish terminates, which usually causes the job  to
       terminate; disown allows these processes to continue regardless.

       If  no process is specified, the most recently-used job is removed (like bg and fg).  If one or more PIDs
       are specified, jobs with the specified process IDs are removed  from  the  job  list.  Invalid  jobs  are
       ignored and a warning is printed.

       If  a  job  is  stopped,  it  is  sent  a signal to continue running, and a warning is printed. It is not
       possible to use the bg builtin to continue a job once it has been disowned.

       disown returns 0 if  all  specified  jobs  were  disowned  successfully,  and  1  if  any  problems  were
       encountered.

       The --help or -h option displays help about using this command.

   Example
       firefox  &;  disown will start the Firefox web browser in the background and remove it from the job list,
       meaning it will not be closed when the fish process is closed.

       disown (jobs -p) removes all jobs from the job list without terminating them.

   echo - display a line of text
   Synopsis
       echo [OPTIONS] [STRING]

   Description
       NOTE: This page documents the fish builtin echo.  To see the documentation on any non-fish versions,  use
       command man echo.

       echo displays STRING of text.

       The following options are available:

       -n     Do not output a newline.

       -s     Do not separate arguments with spaces.

       -E     Disable interpretation of backslash escapes (default).

       -e     Enable interpretation of backslash escapes.

       Unlike other shells, this echo accepts -- to signal the end of the options.

   Escape Sequences
       If -e is used, the following sequences are recognized:

       • \ backslash

       • \a alert (BEL)

       • \b backspace

       • \c produce no further output

       • \e escape

       • \f form feed

       • \n new line

       • \r carriage return

       • \t horizontal tab

       • \v vertical tab

       • \0NNN byte with octal value NNN (1 to 3 digits)

       • \xHH byte with hexadecimal value HH (1 to 2 digits)

   Example
          > echo 'Hello World'
          Hello World

          > echo -e 'Top\nBottom'
          Top
          Bottom

          > echo -- -n
          -n

   See Also
       • the printf command, for more control over output formatting

   else - execute command if a condition is not met
   Synopsis
       if CONDITION; COMMANDS_TRUE ...; [else; COMMANDS_FALSE ...;] end

   Description
       if  will execute the command CONDITION*.  If the condition's exit status is 0, the commands COMMANDS_TRUE
       will execute.  If it is not 0 and else is given, COMMANDS_FALSE will be executed.

   Example
       The following code tests whether a file foo.txt exists as a regular file.

          if test -f foo.txt
              echo foo.txt exists
          else
              echo foo.txt does not exist
          end

   emit - emit a generic event
   Synopsis
       emit EVENT_NAME [ARGUMENTS ...]

   Description
       emit emits, or fires, an event. Events are delivered to, or caught by,  special  functions  called  event
       handlers. The arguments are passed to the event handlers as function arguments.

       The --help or -h option displays help about using this command.

   Example
       The  following  code  first  defines  an event handler for the generic event named 'test_event', and then
       emits an event of that type.

          function event_test --on-event test_event
              echo event test: $argv
          end

          emit test_event something

   Notes
       Note that events are only sent to the current fish process as there is no way to  send  events  from  one
       fish process to another.

   end - end a block of commands
   Synopsis
       begin
           [COMMANDS ...]
       end

       function NAME [OPTIONS]; COMMANDS ...; end
       if CONDITION; COMMANDS_TRUE ...; [else; COMMANDS_FALSE ...;] end
       switch VALUE; [case [WILDCARD ...]; [COMMANDS ...]; ...] end
       while CONDITION; COMMANDS ...; end
       for VARNAME in [VALUES ...]; COMMANDS ...; end

   Description
       The end keyword ends a block of commands started by one of the following commands:

       • begin to start a block of commands

       • function to define a function

       • if, switch to conditionally execute commands

       • while, for to perform commands multiple times

       The end keyword does not change the current exit status.  Instead, the status after it will be the status
       returned by the most recent command.

   eval - evaluate the specified commands
   Synopsis
       eval [COMMANDS ...]

   Description
       eval  evaluates  the  specified  parameters  as  a command.  If more than one parameter is specified, all
       parameters will be joined using a space character as a separator.

       If the command does not need access to stdin, consider using source instead.

       If no piping or other compound shell constructs are required, variable-expansion-as-command, as  in   set
       cmd ls -la; $cmd, is also an option.

   Example
       The following code will call the ls command and truncate each filename to the first 12 characters.

          set cmd ls \| cut -c 1-12
          eval $cmd

   exec - execute command in current process
   Synopsis
       exec COMMAND

   Description
       NOTE:  This page documents the fish builtin exec.  To see the documentation on any non-fish versions, use
       command man exec.

       exec replaces the currently running shell with a  new  command.  On  successful  completion,  exec  never
       returns. exec cannot be used inside a pipeline.

       The --help or -h option displays help about using this command.

   Example
       exec emacs starts up the emacs text editor, and exits fish. When emacs exits, the session will terminate.

   exit - exit the shell
   Synopsis
       exit [CODE]

   Description
       exit  is  a  special  builtin  that  causes  the  shell to exit. Either 255 or the CODE supplied is used,
       whichever is lesser.  Otherwise, the exit status will be that of the last command executed.

       If exit is called while sourcing a file (using the source builtin) the rest of the file will be  skipped,
       but the shell itself will not exit.

       The --help or -h option displays help about using this command.

   export - compatibility function for exporting variables
   Synopsis
       export
       export NAME=VALUE

   Description
       export  is a function included for compatibility with POSIX shells. In general, the set builtin should be
       used instead.

       When called without arguments, export prints a list of currently-exported variables, like set -x.

       When called with a NAME=VALUE pair, the variable NAME is set to VALUE in the global scope,  and  exported
       as an environment variable to other commands.

       There are no options available.

   Example
       The following commands have an identical effect.

          set -gx PAGER bat
          export PAGER=bat

       Note: If you want to add to e.g. $PATH, you need to be careful to combine the list. Quote it, like so:

          export PATH="$PATH:/opt/bin"

       Or just use set, which avoids this:

          set -gx PATH $PATH /opt/bin

   See more
       1. The set command.

   false - return an unsuccessful result
   Synopsis
       false

   Description
       false sets the exit status to 1.

   See Alsotrue command

       • $status variable

   fg - bring job to foreground
   Synopsis
       fg [PID]

   Description
       The  fg  builtin  brings  the  specified  job  to  the foreground, resuming it if it is stopped.  While a
       foreground job is executed, fish is suspended.  If no job is specified, the last job to be used is put in
       the foreground.  If PID is specified, the job containing a process with the specified process ID  is  put
       in the foreground.

       For  compatibility  with  other  shells, job expansion syntax is supported for fg. A PID of the format %1
       will foreground job 1.  Job numbers can be seen in the output of jobs.

       The --help or -h option displays help about using this command.

   Example
       fg will put the last job in the foreground.

       fg %3 will put job 3 into the foreground.

   fish - the friendly interactive shell
   Synopsis
       fish [OPTIONS] [FILE [ARG ...]]
       fish [OPTIONS] [-c COMMAND [ARG ...]]

   Description
       fish is a command-line shell written mainly with interactive use in mind.  This  page  briefly  describes
       the  options  for  invoking  fish.   The  full manual is available in HTML by using the help command from
       inside fish, and in the fish-doc(1) man page.  The tutorial is available as HTML via help tutorial or  in
       man fish-tutorial.

       The following options are available:

       -c or --command=COMMAND
              Evaluate  the  specified  commands  instead  of  reading  from the commandline, passing additional
              positional arguments through $argv.

       -C or --init-command=COMMANDS
              Evaluate specified commands after reading the configuration but before executing command specified
              by -c or reading interactive input.

       -d or --debug=DEBUG_CATEGORIES
              Enables debug output and specify a pattern for matching debug categories.  See Debugging below for
              details.

       -o or --debug-output=DEBUG_FILE
              Specifies a file path to receive the debug  output,  including  categories  and  fish_trace.   The
              default is standard error.

       -i or --interactive
              The shell is interactive.

       --install[=PATH]
              When  built  as self-installable (via cargo), this will unpack fish's data files and place them in
              ~/.local/share/fish/install/.  fish will also ask to do this automatically when run interactively.
              If PATH is given, fish will install itself into a relocatable directory tree rooted at that  path.
              That means it will install the data files to PATH/share/fish and copy itself to PATH/bin/fish.

       -l or --login
              Act as if invoked as a login shell.

       -N or --no-config
              Do not read configuration files.

       -n or --no-execute
              Do not execute any commands, only perform syntax checking.

       -p or --profile=PROFILE_FILE
              when  fish  exits, output timing information on all executed commands to the specified file.  This
              excludes time spent starting up and reading the configuration.

       --profile-startup=PROFILE_FILE
              Will write timing for fish startup to specified file.

       -P or --private
              Enables private mode: fish will not access old or store new history.

       --print-rusage-self
              When fish exits, output stats from getrusage.

       --print-debug-categories
              Print all debug categories, and then exit.

       -v or --version
              Print version and exit.

       -f or --features=FEATURES
              Enables one or more comma-separated feature flags.

       The fish exit status is generally the exit status of the last foreground command.

   Debugging
       While fish provides extensive support for debugging fish scripts,  it  is  also  possible  to  debug  and
       instrument  its  internals.   Debugging  can  be enabled by passing the --debug option.  For example, the
       following command turns on debugging for  background  IO  thread  events,  in  addition  to  the  default
       categories, i.e. debug, error, warning, and warning-path:

          > fish --debug=iothread

       Available  categories  are  listed  by  fish  --print-debug-categories.  The  --debug  option  accepts  a
       comma-separated list of categories, and supports glob syntax.  The following command turns  on  debugging
       for complete, history, history-file, and profile-history, as well as the default categories:

          > fish --debug='complete,*history*'

       Debug  messages  output  to  stderr  by  default.  Note that if fish_trace is set, execution tracing also
       outputs to stderr by default. You can output to a file using the --debug-output option:

          > fish --debug='complete,*history*' --debug-output=/tmp/fish.log --init-command='set fish_trace on'

       These options can also be changed via the FISH_DEBUG and  FISH_DEBUG_OUTPUT  variables.   The  categories
       enabled  via  --debug  are added to the ones enabled by $FISH_DEBUG, so they can be disabled by prefixing
       them with - (reader-*,-ast* enables reader debugging and disables ast debugging).

       The file given in --debug-output takes precedence over the file in FISH_DEBUG_OUTPUT.

   fish_add_path - add to the path
   Synopsis
       fish_add_path path ...
       fish_add_path [(-g | --global) | (-U | --universal) | (-P | --path)] [(-m | --move)] [(-a | --append) | (-p | --prepend)] [(-v | --verbose) | (-n | --dry-run)] PATHS ...

   Description
       fish_add_path is a simple way to add more directories  to  fish's  PATH.  It  does  this  by  adding  the
       directories either to fish_user_paths or directly to PATH (if the --path switch is given).

       It  is  (by default) safe to use fish_add_path in config.fish, or it can be used once, interactively, and
       the paths will stay in future because of universal variables. This is a "do what I mean" style command  -
       it  tries to do the right thing by default, and follow your lead on what you have already set up (e.g. by
       using a global fish_user_paths if you have that already). If you need more  control,  consider  modifying
       the variable yourself.

       Directories  are  normalized  with  realpath.  Trailing  slashes  are ignored and relative paths are made
       absolute (but symlinks are not resolved). If a directory is already included, it is not added  again  and
       stays in the same place unless the --move switch is given.

       Directories  are added in the order they are given, and they are prepended to the path unless --append is
       given. If $fish_user_paths is used, that means  they  are  last  in  $fish_user_paths,  which  is  itself
       prepended  to PATH, so they still stay ahead of the system paths. If the --path option is used, the paths
       are appended/prepended to PATH directly, so this doesn't happen.

       With --path, because PATH must be a global variable  instead  of  a  universal  one,  the  changes  won't
       persist,  so  those  calls  need to be stored in config.fish. This also applies to fish_user_paths if you
       make it global (for instance by passing --global).

       If no directory is new, the variable (fish_user_paths or PATH) is not set again or otherwise modified, so
       variable handlers are not triggered.

       If an argument is not an existing directory, fish_add_path ignores it.

   Options
       -a or --append
              Add directories to the end of the variable.

       -p or --prepend
              Add directories to the front of the variable (this is the default).

       -g or --global
              Use a global fish_user_paths.

       -U or --universal
              Use a universal fish_user_paths - this is the default if it doesn't already exist.

       -P or --path
              Manipulate PATH directly.

       -m or --move
              Move already-included directories to the place they would be added - by default they would be left
              in place and not added again.

       -v or --verbose
              Print the set command used, and some more warnings, like when a path is skipped because it doesn't
              exist or is not a directory.  Verbose mode is automatically enabled  when  fish_add_path  is  used
              interactively and the output goes to the terminal.

       -n or --dry-run
              Print the set command that would be used without executing it.

       -h or --help
              Displays help about using this command.

       If  --move is used, it may of course lead to the path swapping order, so you should be careful doing that
       in config.fish.

   Example
          # I just installed mycoolthing and need to add it to the path to use it.
          # It is at /opt/mycoolthing/bin/mycoolthing,
          # so let's add the directory: /opt/mycoolthing/bin.
          > fish_add_path /opt/mycoolthing/bin

          # I want my ~/.local/bin to be checked first,
          # even if it was already added.
          > fish_add_path -m ~/.local/bin

          # I prefer using a global fish_user_paths
          # This isn't saved automatically, I need to add this to config.fish
          # if I want it to stay.
          > fish_add_path -g ~/.local/bin ~/.otherbin /usr/local/sbin

          # I want to append to the entire $PATH because this directory contains fallbacks
          # This needs --path/-P because otherwise it appends to $fish_user_paths,
          # which is added to the front of $PATH.
          > fish_add_path --append --path /opt/fallback/bin

          # I want to add the bin/ directory of my current $PWD (say /home/nemo/)
          # -v/--verbose shows what fish_add_path did.
          > fish_add_path -v bin/
          set fish_user_paths /home/nemo/bin /usr/bin /home/nemo/.local/bin

          # I have installed ruby via homebrew
          > fish_add_path /usr/local/opt/ruby/bin

   fish_breakpoint_prompt - define the prompt when stopped at a breakpoint
   Synopsis
       fish_breakpoint_prompt

          function fish_breakpoint_prompt
              ...
          end

   Description
       fish_breakpoint_prompt is the prompt function when asking for input in response to a breakpoint command.

       The exit status of commands within fish_breakpoint_prompt will not modify the value of $status outside of
       the fish_breakpoint_prompt function.

       fish ships with a default version of this function that displays the function name and line number of the
       current execution context.

   Example
       A simple prompt that is a simplified version of the default debugging prompt:

          function fish_breakpoint_prompt -d "Write out the debug prompt"
              set -l function (status current-function)
              set -l line (status current-line-number)
              set -l prompt "$function:$line >"
              echo -ns (set_color $fish_color_status) "BP $prompt" (set_color normal) ' '
          end

   fish_clipboard_copy - copy text to the system's clipboard
   Synopsis
       fish_clipboard_copy

       foo | fish_clipboard_copy

   Description
       The fish_clipboard_copy function copies text to the system clipboard.

       If stdin is not a terminal (see isatty), it will read all input from there and copy it. If it is, it will
       use the current commandline, or the current selection if there is one.

       It is bound to ctrl-x by default.

       fish_clipboard_copy works by calling a system-specific backend. If it doesn't appear to work you may need
       to install yours.

       Currently supported are:

       • pbcopywl-copy using wayland

       • xsel and xclip for X11

       • clip.exe on Windows.

   See alsofish_clipboard_paste - get text from the system's clipboard which does the inverse.

   fish_clipboard_paste - get text from the system's clipboard
   Synopsis
       fish_clipboard_paste

       fish_clipboard_paste | foo

   Description
       The fish_clipboard_paste function copies text from the system clipboard.

       If its stdout is not a terminal (see isatty),  it  will  output  everything  there,  as-is,  without  any
       additional newlines. If it is, it will put the text in the commandline instead.

       If  it  outputs  to  the  commandline, it will automatically escape the output if the cursor is currently
       inside single-quotes so it is suitable for single-quotes (meaning it escapes ' and \\).

       It is bound to ctrl-v by default.

       fish_clipboard_paste works by calling a system-specific backend. If it doesn't appear  to  work  you  may
       need to install yours.

       Currently supported are:

       • pbpastewl-paste using wayland

       • xsel and xclip for X11

       • powershell.exe  on  Windows  (this  backend has encoding limitations and uses windows line endings that
         fish_clipboard_paste undoes)

   See alsofish_clipboard_copy - copy text to the system's clipboard which does the inverse.

   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"
       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

   fish_config - start the web-based configuration interface
   Synopsis
       fish_config [browse]
       fish_config prompt (choose | list | save | show)
       fish_config theme (choose | demo | dump | list | save | show)

   Description
       fish_config is used to configure fish.

       Without arguments or with the browse command it starts the web-based  configuration  interface.  The  web
       interface  allows  you  to view your functions, variables and history, and to make changes to your prompt
       and color configuration. It starts a local web server and opens a browser window. When you are  finished,
       close the browser window and press the Enter key to terminate the configuration session.

       If  the  BROWSER  environment  variable  is  set,  it will be used as the name of the web browser to open
       instead of the system default.

       With the prompt command fish_config can be used to view and choose a prompt from  fish's  sample  prompts
       inside the terminal directly.

       Available subcommands for the prompt command:

       • choose loads a sample prompt in the current session.

       • list lists the names of the available sample prompts.

       • save saves the current prompt to a file (via funcsave).

       • show shows what the given sample prompts (or all) would look like.

       With the theme command fish_config can be used to view and choose a theme (meaning a color scheme) inside
       the terminal.

       Available subcommands for the theme command:

       • choose loads a sample theme in the current session.

       • demo displays some sample text in the current theme.

       • dump prints the current theme in a loadable format.

       • list lists the names of the available sample themes.

       • save saves the given theme to universal variables.

       • show shows what the given sample theme (or all) would look like.

       The -h or --help option displays help about using this command.

   Theme Files
       fish_config theme and the theme selector in the web config tool load their themes from theme files. These
       are stored in the fish configuration directory, typically ~/.config/fish/themes, with a .theme ending.

       You can add your own theme by adding a file in that directory.

       To get started quickly:

          fish_config theme dump > ~/.config/fish/themes/my.theme

       which will save your current theme in .theme format.

       The format looks like this:

          # name: 'Cool Beans'
          # preferred_background: black

          fish_color_autosuggestion 666
          fish_color_cancel -r
          fish_color_command normal
          fish_color_comment '888'  '--italics'
          fish_color_cwd 0A0
          fish_color_cwd_root A00
          fish_color_end 009900

       The two comments at the beginning are the name and background that the web config tool shows.

       The  other lines are just like set variable value, except that no expansions are allowed. Quotes are, but
       aren't necessary.

       Any color variable fish knows about that the theme doesn't set will be set to empty when it is loaded, so
       the old theme is completely overwritten.

       Other than that, .theme files can contain any variable with a name that matches  the  regular  expression
       '^fish_(?:pager_)?color.*$' - starts with fish_, an optional pager_, then color and then anything.

   Example
       fish_config or fish_config browse opens a new web browser window and allows you to configure certain fish
       settings.

       fish_config prompt show demos the available sample prompts.

       fish_config  prompt choose disco makes the disco prompt the prompt for the current session. This can also
       be used in config.fish to set the prompt.

       fish_config prompt save saves the current prompt to an autoloaded file.

       fish_config prompt save default chooses the default prompt and saves it.

   fish_default_key_bindings - set emacs key bindings for fish
   Synopsis
       fish_default_key_bindings

   Description
       fish_default_key_bindings sets the emacs key bindings for fish shell.

       Some of the Emacs key bindings are defined here.

       There are no parameters for fish_default_key_bindings.

   Examples
       To start using emacs key bindings:

          fish_default_key_bindings

   fish_delta - compare functions and completions to the default
   Synopsis
       fish_delta name ...
       fish_delta [-f | --no-functions] [-c | --no-completions] [-C | --no-config] [-d | --no-diff] [-n | --new] [-V | --vendor=]
       fish_delta [-h | --help]

   Description
       The fish_delta function tells you, at a glance, which of your functions and completions differ  from  the
       set that fish ships.

       It   does   this   by  going  through  the  relevant  variables  (fish_function_path  for  functions  and
       fish_complete_path for completions) and comparing the files against fish's default directories.

       If any names are given, it will only compare files by those names (plus a ".fish" extension).

       By default, it will also use diff to display the difference between the files. If diff is unavailable, it
       will skip it, but in that case it also cannot figure out if the files really differ.

       The exit status is 1 if there was a difference and 2 for other errors, otherwise 0.

   Options
       The following options are available:

       -f or --no-functions
              Stops checking functions

       -c or --no-completions
              Stops checking completions

       -C or --no-config
              Stops checking configuration files like config.fish or snippets in the conf.d directories.

       -d or --no-diff
              Removes the diff display (this happens automatically if diff can't be found)

       -n or --new
              Also prints new files (i.e. those that can't be found in fish's default directories).

       -Vvalue or --vendor=value
              Determines how the vendor directories are counted. Valid values are:

              • "default" - counts vendor files as belonging to the defaults. Any changes in  other  directories
                will be counted as changes over them. This is the default.

              • "user" - counts vendor files as belonging to the user files. Any changes in them will be counted
                as new or changed files.

              • "ignore"  -  ignores  vendor  directories. Files of the same name will be counted as "new" if no
                file of the same name in fish's default directories exists.

       -h or --help
              Prints fish_delta's help (this).

   Example
       Running just:

          fish_delta

       will give you a list of all your changed functions and completions, including diffs (if you have the diff
       command).

       It might look like this:

          > fish_delta
          New: /home/alfa/.config/fish/functions/battery.fish
          Changed: /home/alfa/.config/fish/test/completions/cargo.fish
          --- /home/alfa/.config/fish/test/completions/cargo.fish 2022-09-02 12:57:55.579229959 +0200
          +++ /usr/share/fish/completions/cargo.fish      2022-09-25 17:51:53.000000000 +0200
          # the output of `diff` follows

       The options are there to select which parts of the output you want. With --no-completions you can compare
       just functions, and with --no-diff you can turn off the diff display.

       To only compare your fish_git_prompt, you might use:

          fish_delta --no-completions fish_git_prompt

       which will only compare files called "fish_git_prompt.fish".

   fish_git_prompt - output git information for use in a prompt
   Synopsis
       fish_git_prompt

          function fish_prompt
               printf '%s' $PWD (fish_git_prompt) ' $ '
          end

   Description
       The fish_git_prompt function displays information about the current git repository, if any.

       Git <https://git-scm.com> must be installed.

       There are numerous customization options, which can be controlled with git options or fish variables. git
       options, where available, take precedence over the fish variable with the same function. git options  can
       be  set  on  a  per-repository or global basis. git options can be set with the git config command, while
       fish variables can be set as usual with the set command.

       Boolean options (those which enable or disable something) understand "1", "yes" or "true"  to  mean  true
       and every other value to mean false.

       • $__fish_git_prompt_show_informative_status  or  the git option bash.showInformativeStatus can be set to
         1, true or yes to enable the "informative" display, which will show a large amount of information - the
         number of dirty files, unpushed/unpulled commits, and more.  In large repositories, this can take a lot
         of  time,  so  you  may  wish  to  disable  it  in  these  repositories  with    git   config   --local
         bash.showInformativeStatus  false. It also changes the characters the prompt uses to less plain ones (
         instead of * for the dirty state  for  example)  ,  and  if  you  are  only  interested  in  that,  set
         $__fish_git_prompt_use_informative_chars instead.

         Because counting untracked files requires a lot of time, the number of untracked files is only shown if
         enabled via $__fish_git_prompt_showuntrackedfiles or the git option bash.showUntrackedFiles.

       • $__fish_git_prompt_showdirtystate or the git option bash.showDirtyState can be set to 1, true or yes to
         show if the repository is "dirty", i.e. has uncommitted changes.

       • $__fish_git_prompt_showuntrackedfiles  or  the git option bash.showUntrackedFiles can be set to 1, true
         or yes to show if the repository has untracked files (that aren't ignored).

       • $__fish_git_prompt_showupstream can be set to a list of values to determine how  changes  between  HEAD
         and upstream are shown:

            auto   summarize the difference between HEAD and its upstream

            verbose
                   show number of commits ahead/behind (+/-) upstream

            name   if verbose, then also show the upstream abbrev name

            informative
                   similar  to verbose, but shows nothing when equal - this is the default if informative status
                   is enabled.

            git    always compare HEAD to @{upstream}

            svn    always compare HEAD to your SVN upstream

            none   disables (useful with informative status)

       • $__fish_git_prompt_showstashstate can be set to 1, true or yes to display the state of the stash.

       • $__fish_git_prompt_shorten_branch_len can be set to the number of characters that the branch name  will
         be shortened to.

       • $__fish_git_prompt_describe_style  can  be  set  to one of the following styles to describe the current
         HEAD:

            contains
                   relative to newer annotated tag, such as (v1.6.3.2~35)

            branch relative to newer tag or branch, such as (master~4)

            describe
                   relative to older annotated tag, such as (v1.6.3.1-13-gdd42c2f)

            default
                   an exactly matching tag ((develop))

            If none of these apply, the commit SHA shortened to 8 characters is used.

       • $__fish_git_prompt_showcolorhints can be set to 1, true or yes to enable coloring for the  branch  name
         and status symbols.

       A number of variables set characters and color used as indicators. Many of these have a different default
       if  used  with  informative  status  enabled,  or $__fish_git_prompt_use_informative_chars set. The usual
       default is given first, then the informative default (if it is different). If no default for  the  colors
       is given, they default to $__fish_git_prompt_color.

       • $__fish_git_prompt_char_stateseparator (' ', |) - the character to be used between the state characters

       • $__fish_git_prompt_color (no default)

       • $__fish_git_prompt_color_prefix - the color of the ( prefix

       • $__fish_git_prompt_color_suffix - the color of the ) suffix

       • $__fish_git_prompt_color_bare - the color to use for a bare repository - one without a working tree

       • $__fish_git_prompt_color_merging  -  the  color  when a merge/rebase/revert/bisect or cherry-pick is in
         progress

       • $__fish_git_prompt_char_cleanstate (✔ in informative mode) - the character to be used when nothing else
         applies

       • $__fish_git_prompt_color_cleanstate (no default)

       Variables used with showdirtystate:

       • $__fish_git_prompt_char_dirtystate (*, ✚) - the number of "dirty" changes,  i.e.  unstaged  files  with
         changes

       • $__fish_git_prompt_char_invalidstate (#, ✖) - the number of "unmerged" changes, e.g. additional changes
         to already added files

       • $__fish_git_prompt_char_stagedstate (+, ●) - the number of staged files without additional changes

       • $__fish_git_prompt_color_dirtystate (red with showcolorhints, same as color_flags otherwise)

       • $__fish_git_prompt_color_invalidstate$__fish_git_prompt_color_stagedstate (green with showcolorhints, color_flags otherwise)

       Variables used with showstashstate:

       • $__fish_git_prompt_char_stashstate ($, ⚑)

       • $__fish_git_prompt_color_stashstate (same as color_flags)

       Variables used with showuntrackedfiles:

       • $__fish_git_prompt_char_untrackedfiles (%, …) - the symbol for untracked files

       • $__fish_git_prompt_color_untrackedfiles (same as color_flags)

       Variables used with showupstream (also implied by informative status):

       • $__fish_git_prompt_char_upstream_ahead  (>, ↑) - the character for the commits this repository is ahead
         of upstream

       • $__fish_git_prompt_char_upstream_behind (<, ↓) - the character  for  the  commits  this  repository  is
         behind upstream

       • $__fish_git_prompt_char_upstream_diverged (<>) - the symbol if this repository is both ahead and behind
         upstream

       • $__fish_git_prompt_char_upstream_equal (=) - the symbol if this repo is equal to upstream

       • $__fish_git_prompt_char_upstream_prefix ('')

       • $__fish_git_prompt_color_upstream

       Colors used with showcolorhints:

       • $__fish_git_prompt_color_branch (green) - the color of the branch if nothing else applies

       • $__fish_git_prompt_color_branch_detached  (red) the color of the branch if it's detached (e.g. a commit
         is checked out)

       • $__fish_git_prompt_color_branch_dirty (no default) the color of  the  branch  if  it's  dirty  and  not
         detached

       • $__fish_git_prompt_color_branch_staged  (no  default)  the color of the branch if it just has something
         staged and is otherwise clean

       • $__fish_git_prompt_color_flags (--bold blue) - the  default  color  for  dirty/staged/stashed/untracked
         state

       Note  that  all  colors  can  also  have  a  corresponding  _done  color.  For  example,  the contents of
       $__fish_git_prompt_color_upstream_done is printed right _after_ the upstream.

       See also fish_vcs_prompt, which will call all supported version control prompt functions, including  git,
       Mercurial and Subversion.

   Example
       A simple prompt that displays git info:

          function fish_prompt
              # ...
              set -g __fish_git_prompt_showupstream auto
              printf '%s %s$' $PWD (fish_git_prompt)
          end

   fish_greeting - display a welcome message in interactive shells
   Synopsis
       fish_greeting

          function fish_greeting
              ...
          end

   Description
       When an interactive fish starts, it executes fish_greeting and displays its output.

       The  default fish_greeting is a function that prints a variable of the same name ($fish_greeting), so you
       can also just change that if you just want to change the text.

       While you could also just put echo calls into config.fish, fish_greeting takes care of only being used in
       interactive shells, so it won't be used e.g. with scp (which  executes  a  shell),  which  prevents  some
       errors.

   Example
       To just empty the text, with the default greeting function:

          set -U fish_greeting

       or set -g fish_greeting in config.fish.

       A simple greeting:

          function fish_greeting
              echo Hello friend!
              echo The time is (set_color yellow)(date +%T)(set_color normal) and this machine is called $hostname
          end

   fish_hg_prompt - output Mercurial information for use in a prompt
   Synopsis
       fish_hg_prompt

          function fish_prompt
               printf '%s' $PWD (fish_hg_prompt) ' $ '
          end

   Description
       The fish_hg_prompt function displays information about the current Mercurial repository, if any.

       Mercurial <https://www.mercurial-scm.org/> (hg) must be installed.

       By default, only the current branch is shown because hg status can be slow on a large repository. You can
       enable  a  more  informative  prompt by setting the variable $fish_prompt_hg_show_informative_status, for
       example:

          set --universal fish_prompt_hg_show_informative_status

       If you enabled the informative status, there are numerous customization options, which can be  controlled
       with fish variables.

       • $fish_color_hg_clean,  $fish_color_hg_modified  and  $fish_color_hg_dirty  are  colors  used  when  the
         repository has the respective status.

       Some colors for status symbols:

       • $fish_color_hg_added$fish_color_hg_renamed$fish_color_hg_copied$fish_color_hg_deleted$fish_color_hg_untracked$fish_color_hg_unmerged

       The status symbols themselves:

       • $fish_prompt_hg_status_added, default '✚'

       • $fish_prompt_hg_status_modified, default '*'

       • $fish_prompt_hg_status_copied, default '⇒'

       • $fish_prompt_hg_status_deleted, default '✖'

       • $fish_prompt_hg_status_untracked, default '?'

       • $fish_prompt_hg_status_unmerged, default '!'

       Finally, $fish_prompt_hg_status_order, which can be used to change the order the  status  symbols  appear
       in. It defaults to added modified copied deleted untracked unmerged.

       See  also fish_vcs_prompt, which will call all supported version control prompt functions, including git,
       Mercurial and Subversion.

   Example
       A simple prompt that displays hg info:

          function fish_prompt
              ...
              set -g fish_prompt_hg_show_informative_status
              printf '%s %s$' $PWD (fish_hg_prompt)
          end

   fish_indent - indenter and prettifier
   Synopsis
       fish_indent [OPTIONS] [FILE ...]

   Description
       fish_indent is used to indent a piece of fish code. fish_indent reads commands from standard input or the
       given filenames and outputs them to standard output or a specified file (if -w is given).

       The following options are available:

       -w or --write
              Indents a specified file and immediately writes to that file.

       -i or --no-indent
              Do not indent commands; only reformat to one job per line.

       --only-indent
              Do not reformat, only indent each line.

       --only-unindent
              Do not reformat, only unindent each line.

       -c or --check
              Do not indent, only return 0 if the code is already indented as fish_indent would, the  number  of
              failed files otherwise. Also print the failed filenames if not reading from standard input.

       -v or --version
              Displays the current fish version and then exits.

       --ansi Colorizes  the  output  using  ANSI  escape sequences, appropriate for the current TERM, using the
              colors defined in the environment (such as fish_color_command).

       --html Outputs HTML, which supports syntax highlighting if the appropriate CSS is defined. The CSS  class
              names are the same as the variable names, such as fish_color_command.

       -d or --debug=DEBUG_CATEGORIES
              Enable debug output and specify a pattern for matching debug categories. See Debugging in fish (1)
              for details.

       -o or --debug-output=DEBUG_FILE
              Specify  a file path to receive the debug output, including categories and fish_trace. The default
              is standard error.

       --dump-parse-tree
              Dumps information about the parsed statements to standard error. This is likely to be of  interest
              only to people working on the fish source code.

       -h or --help
              Displays help about using this command.

   fish_is_root_user - check if the current user is root
   Synopsis
       fish_is_root_user

   Description
       fish_is_root_user  will  check  if  the  current user is root. It can be useful for the prompt to display
       something different if the user is root, for example.

   Example
       A simple example:

          function example --description 'Just an example'
              if fish_is_root_user
                  do_something_different
              end
          end

   fish_key_reader - explore what characters keyboard keys send
   Synopsis
       fish_key_reader [OPTIONS]

   Description
       fish_key_reader is used to explain how you would bind a certain key sequence. By default, it  prints  the
       bind command for one key sequence read interactively over standard input.

       The following options are available:

       -c or --continuous
              Begins a session where multiple key sequences can be inspected. By default the program exits after
              capturing a single key sequence.

       -h or --help
              Displays help about using this command.

       -V or --verbose
              Explain what sequence was received in addition to the decoded key.

       -v or --version
              Displays the current fish version and then exits.

   Usage Notes
       fish_key_reader  intentionally  disables  handling  of  many  signals.  To  terminate  fish_key_reader in
       --continuous mode do:

       • press ctrl-c twice, or

       • press ctrl-d twice, or

       • type exit, or

       • type quit

   Example
          > fish_key_reader
          Press a key:
          # press up-arrow
          bind up 'do something'

   fish_mode_prompt - define the appearance of the mode indicator
   Synopsis
       fish_mode_prompt

          function fish_mode_prompt
               echo -n "$fish_bind_mode "
          end

   Description
       The fish_mode_prompt function outputs the mode indicator for use in vi mode.

       The default fish_mode_prompt function will output indicators about the current vi editor  mode  displayed
       to  the  left  of  the  regular  prompt. Define your own function to customize the appearance of the mode
       indicator. The $fish_bind_mode variable can be used to determine the current mode.  It  will  be  one  of
       default, insert, replace_one, or visual.

       You can also define an empty fish_mode_prompt function to remove the vi mode indicators:

          function fish_mode_prompt; end
          funcsave fish_mode_prompt

       fish_mode_prompt  will  be  executed when the vi mode changes. If it produces any output, it is displayed
       and used. If it does not, the other prompt functions (fish_prompt and fish_right_prompt) will be executed
       as well in case they contain a mode display.

   Example
          function fish_mode_prompt
            switch $fish_bind_mode
              case default
                set_color --bold red
                echo 'N'
              case insert
                set_color --bold green
                echo 'I'
              case replace_one
                set_color --bold green
                echo 'R'
              case visual
                set_color --bold brmagenta
                echo 'V'
              case '*'
                set_color --bold red
                echo '?'
            end
            set_color normal
          end

       Outputting multiple lines is not supported in fish_mode_prompt.

   fish_opt - create an option specification for the argparse command
   Synopsis
       fish_opt [(-slor | --multiple-vals=) OPTNAME]
       fish_opt --help

   Description
       This command provides a way to produce option specifications suitable for use with the argparse  command.
       You  can,  of  course,  write the option specifications by hand without using this command. But you might
       prefer to use this for the clarity it provides.

       The following argparse options are available:

       -s or --short
              Takes a single letter that is used as the short flag in the option being defined. This  option  is
              mandatory.

       -l or --long
              Takes  a string that is used as the long flag in the option being defined. This option is optional
              and has no default. If no long flag is defined then only the  short  flag  will  be  allowed  when
              parsing arguments using the option specification.

       --long-only
              The  option  being defined will only allow the long flag name to be used. The short flag name must
              still be defined (i.e., --short must be specified) but it cannot be used  when  parsing  arguments
              using this option specification.

       -o or --optional-val
              The  option being defined can take a value, but it is optional rather than required. If the option
              is seen more than once when parsing arguments, only the last value seen is saved. This  means  the
              resulting  flag  variable  created  by  argparse will zero elements if no value was given with the
              option else it will have exactly one element.

       -r or --required-val
              The option being defined requires a value. If the option is  seen  more  than  once  when  parsing
              arguments,  only  the  last value seen is saved. This means the resulting flag variable created by
              argparse will have exactly one element.

       --multiple-vals
              The option being defined requires a value each time it is seen.  Each  instance  is  stored.  This
              means  the  resulting flag variable created by argparse will have one element for each instance of
              this option in the arguments.

       -h or --help
              Displays help about using this command.

   Examples
       Define a single option specification for the boolean help flag:

          set -l options (fish_opt -s h -l help)
          argparse $options -- $argv

       Same as above but with a second flag that requires a value:

          set -l options (fish_opt -s h -l help)
          set options $options (fish_opt -s m -l max --required-val)
          argparse $options -- $argv

       Same as above but with a third flag that can be given multiple times saving the value  of  each  instance
       seen and only the long flag name (--token) can be used:

          set -l options (fish_opt --short=h --long=help)
          set options $options (fish_opt --short=m --long=max --required-val)
          set options $options (fish_opt --short=t --long=token --multiple-vals --long-only)
          argparse $options -- $argv

   fish_prompt - define the appearance of the command line prompt
   Synopsis
       fish_prompt

          function fish_prompt
              ...
          end

   Description
       The fish_prompt function is executed when the prompt is to be shown, and the output is used as a prompt.

       The  exit  status  of  commands  within  fish_prompt  will not modify the value of $status outside of the
       fish_prompt function.

       fish ships with a number of example prompts that can be chosen with the fish_config command.

   Example
       A simple prompt:

          function fish_prompt -d "Write out the prompt"
              # This shows up as USER@HOST /home/user/ >, with the directory colored
              # $USER and $hostname are set by fish, so you can just use them
              # instead of using `whoami` and `hostname`
              printf '%s@%s %s%s%s > ' $USER $hostname \
                  (set_color $fish_color_cwd) (prompt_pwd) (set_color normal)
          end

   fish_right_prompt - define the appearance of the right-side command line prompt
   Synopsis
          function fish_right_prompt
              ...
          end

   Description
       fish_right_prompt is similar to fish_prompt, except that it appears on the right  side  of  the  terminal
       window.

       Multiple lines are not supported in fish_right_prompt.

   Example
       A simple right prompt:

          function fish_right_prompt -d "Write out the right prompt"
              date '+%m/%d/%y'
          end

   fish_should_add_to_history - decide whether a command should be added to the history
   Synopsis
       fish_should_add_to_history

          function fish_should_add_to_history
              ...
          end

   Description
       The fish_should_add_to_history function is executed before fish adds a command to history, and its return
       status decides whether that is done.

       If  it  returns  0,  the  command  is stored in history, when it returns anything else, it is not. In the
       latter case the command can still be recalled for one command.

       The first argument to fish_should_add_to_history is the commandline. History is added before a command is
       run, so e.g. status can't be checked. This is so commands that don't finish like exec -  execute  command
       in current process and long-running commands are available in new sessions immediately.

       If  fish_should_add_to_history doesn't exist, fish will save a command to history unless it starts with a
       space. If it does exist, this function takes over all of the duties, so commands starting with space  are
       saved unless fish_should_add_to_history says otherwise.

   Example
       A simple example:

          function fish_should_add_to_history
              for cmd in vault mysql ls
                   string match -qr "^$cmd" -- $argv; and return 1
              end
              return 0
          end

       This refuses to store any immediate "vault", "mysql" or "ls" calls. Commands starting with space would be
       stored.

          function fish_should_add_to_history
              # I don't want `git pull`s in my history when I'm in a specific repository
              if string match -qr '^git pull'
              and string match -qr "^/home/me/my-secret-project/" -- (pwd -P)
                  return 1
              end

              return 0
          end

   fish_status_to_signal - convert exit codes to human-friendly signals
   Synopsis
       fish_status_to_signal NUM

          function fish_prompt
              echo -n (fish_status_to_signal $pipestatus | string join '|') (prompt_pwd) '$ '
          end

   Description
       fish_status_to_signal  converts  exit  codes to their corresponding human-friendly signals if one exists.
       This is likely to be useful for prompts in conjunction with the $status and $pipestatus variables.

   Example
          >_ sleep 5
          ^C⏎
          >_ fish_status_to_signal $status
          SIGINT

   fish_svn_prompt - output Subversion information for use in a prompt
   Synopsis
       fish_svn_prompt

          function fish_prompt
               printf '%s' $PWD (fish_svn_prompt) ' $ '
          end

   Description
       The fish_svn_prompt function displays information about the current Subversion repository, if any.

       Subversion <https://subversion.apache.org/> (svn) must be installed.

       There are numerous customization options, which can be controlled with fish variables.

       •

         __fish_svn_prompt_color_revision
                the colour of the revision number to display in the prompt

       •

         __fish_svn_prompt_char_separator
                the separator between status characters

       A number of variables control the symbol  ("display")  and  color  ("color")  for  the  different  status
       indicators:

       • __fish_svn_prompt_char_added_display__fish_svn_prompt_char_added_color__fish_svn_prompt_char_conflicted_display__fish_svn_prompt_char_conflicted_color__fish_svn_prompt_char_deleted_display__fish_svn_prompt_char_deleted_color__fish_svn_prompt_char_ignored_display__fish_svn_prompt_char_ignored_color__fish_svn_prompt_char_modified_display__fish_svn_prompt_char_modified_color__fish_svn_prompt_char_replaced_display__fish_svn_prompt_char_replaced_color__fish_svn_prompt_char_unversioned_external_display__fish_svn_prompt_char_unversioned_external_color__fish_svn_prompt_char_unversioned_display__fish_svn_prompt_char_unversioned_color__fish_svn_prompt_char_missing_display__fish_svn_prompt_char_missing_color__fish_svn_prompt_char_versioned_obstructed_display__fish_svn_prompt_char_versioned_obstructed_color__fish_svn_prompt_char_locked_display__fish_svn_prompt_char_locked_color__fish_svn_prompt_char_scheduled_display__fish_svn_prompt_char_scheduled_color__fish_svn_prompt_char_switched_display__fish_svn_prompt_char_switched_color__fish_svn_prompt_char_token_present_display__fish_svn_prompt_char_token_present_color__fish_svn_prompt_char_token_other_display__fish_svn_prompt_char_token_other_color__fish_svn_prompt_char_token_stolen_display__fish_svn_prompt_char_token_stolen_color__fish_svn_prompt_char_token_broken_display__fish_svn_prompt_char_token_broken_color

       See  also fish_vcs_prompt, which will call all supported version control prompt functions, including git,
       Mercurial and Subversion.

   Example
       A simple prompt that displays svn info:

          function fish_prompt
              ...
              printf '%s %s$' $PWD (fish_svn_prompt)
          end

   fish_title - define the terminal's title
   Synopsis
       fish_title

          function fish_title
              ...
          end

   Description
       The fish_title function is executed before and after a new command is executed or put into the foreground
       and the output is used as a titlebar message.

       The first argument to fish_title contains the most recently executed foreground command as a  string,  if
       any.

       This requires that your terminal supports programmable titles and the feature is turned on.

       To disable setting the title, use an empty function (see below).

   Example
       A simple title:

          function fish_title
              set -q argv[1]; or set argv fish
              # Looks like ~/d/fish: git log
              # or /e/apt: fish
              echo (fish_prompt_pwd_dir_length=1 prompt_pwd): $argv;
          end

       Do not change the title:

          function fish_title
          end

   fish_update_completions - update completions using manual pages
   Synopsis
       fish_update_completions

   Description
       fish_update_completions  parses  manual  pages installed on the system, and attempts to create completion
       files in the fish configuration directory.

       This does not overwrite custom completions.

       There are no parameters for fish_update_completions.

   fish_vcs_prompt - output version control system information for use in a prompt
   Synopsis
       fish_vcs_prompt

          function fish_prompt
               printf '%s' $PWD (fish_vcs_prompt) ' $ '
          end

   Description
       The fish_vcs_prompt function  displays  information  about  the  current  version  control  system  (VCS)
       repository, if any.

       It calls out to VCS-specific functions. The currently supported systems are:

       • fish_git_promptfish_hg_promptfish_svn_prompt

       If a VCS isn't installed, the respective function does nothing.

       The  Subversion  prompt  is  disabled  by default, because it's slow on large repositories. To enable it,
       modify fish_vcs_prompt to uncomment it. See funced.

       For more information, see the documentation for each of the functions above.

   Example
       A simple prompt that displays all known VCS info:

          function fish_prompt
              ...
              set -g __fish_git_prompt_showupstream auto
              printf '%s %s$' $PWD (fish_vcs_prompt)
          end

   fish_vi_key_bindings - set vi key bindings for fish
   Synopsis
       fish_vi_key_bindings
       fish_vi_key_bindings [--no-erase] [INIT_MODE]

   Description
       fish_vi_key_bindings sets the vi key bindings for fish shell.

       If a valid INIT_MODE is provided (insert, default, visual), then that mode will become the default  .  If
       no INIT_MODE is given, the mode defaults to insert mode.

       The following parameters are available:

       --no-erase
              Does not clear previous set bindings

       Further information on how to use vi mode.

   Examples
       To start using vi key bindings:

          fish_vi_key_bindings

       or set -g fish_key_bindings fish_vi_key_bindings in config.fish.

   for - perform a set of commands multiple times
   Synopsis
       for VARNAME in [VALUES ...]; COMMANDS ...; end

   Description
       for  is  a  loop  construct.  It  will perform the commands specified by COMMANDS multiple times. On each
       iteration, the local variable specified by VARNAME is assigned a new value  from  VALUES.  If  VALUES  is
       empty,  COMMANDS  will  not  be executed at all. The VARNAME is visible when the loop terminates and will
       contain the last value assigned to it. If VARNAME does not already exist it will  be  set  in  the  local
       scope.  For  our  purposes  if the for block is inside a function there must be a local variable with the
       same name. If the for block is not nested inside a function then global and universal  variables  of  the
       same name will be used if they exist.

       Much like set, for does not modify $status, but the evaluation of its subordinate commands can.

       The -h or --help option displays help about using this command.

   Example
          for i in foo bar baz; echo $i; end

          # would output:
          foo
          bar
          baz

   Notes
       The  VARNAME  was local to the for block in releases prior to 3.0.0. This means that if you did something
       like this:

          for var in a b c
              if break_from_loop
                  break
              end
          end
          echo $var

       The last value assigned to var when the loop terminated would not be available  outside  the  loop.  What
       echo $var would write depended on what it was set to before the loop was run. Likely nothing.

   funced - edit a function interactively
   Synopsis
       funced [OPTIONS] NAME

   Description
       funced provides an interface to edit the definition of the function NAME.

       If  the  $VISUAL  environment  variable  is  set, it will be used as the program to edit the function. If
       $VISUAL is unset but $EDITOR is set, that will be used. Otherwise, a built-in editor will be  used.  Note
       that  to  enter  a  literal  newline using the built-in editor you should press alt-enter. Pressing enter
       signals that you are done editing the function. This does not apply to an external editor like  emacs  or
       vim.

       funced  will  try  to  edit the original file that a function is defined in, which might include variable
       definitions or helper functions as well. If changes cannot be saved to the original file, a copy will  be
       created in the user's function directory.

       If there is no function called NAME, a new function will be created with the specified name.

       -e command or --editor command
              Open  the  function  body  inside  the  text editor given by the command (for example, -e vi). The
              special command fish will use the built-in editor (same as specifying -i).

       -i or --interactive
              Force opening the function body in the built-in editor even if $VISUAL or $EDITOR is defined.

       -s or --save
              Automatically save the function after successfully editing it.

       -h or --help
              Displays help about using this command.

   Example
       Say you want to modify your prompt.

       Run:

          >_ funced fish_prompt

       This will open up your editor, allowing you to modify the function. When you're done, save and quit. Fish
       will reload the function, so you should see the changes right away.

       When you're done, use:

          >_ funcsave fish_prompt

       For more, see funcsave. To view a function's current definition, use functions or type.

   funcsave - save the definition of a function to the user's autoload directory
   Synopsis
       funcsave FUNCTION_NAME
       funcsave [-q | --quiet] [(-d | --directory) DIR] FUNCTION_NAME

   Description
       funcsave saves a function to  a  file  in  the  fish  configuration  directory.  This  function  will  be
       automatically  loaded by current and future fish sessions. This can be useful to commit functions created
       interactively for permanent use.

       If you have erased a function using functions's --erase option, funcsave will remove the  saved  function
       definition.

       Because fish loads functions on-demand, saved functions cannot serve as event handlers until they are run
       or  otherwise  sourced.  To  activate  an  event  handler  for  every  new shell, add the function to the
       configuration file instead of using funcsave.

       This is often used after funced, which opens the function in $EDITOR or $VISUAL and  loads  it  into  the
       current session afterwards.

       To view a function's current definition, use functions or type.

   function - create a function
   Synopsis
       function NAME [OPTIONS]; BODY; end

   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
              Has to be the last option. Assigns the value of successive command-line  arguments  to  the  names
              given  in  NAMES  (separated  by space). These are the same arguments given in argv, and are still
              available there. See also Argument Handling.

       -d DESCRIPTION or --description DESCRIPTION
              A description of what the function does, suitable as a completion description.

       -w WRAPPED_COMMAND or --wraps WRAPPED_COMMAND
              Inherit completions from the given WRAPPED_COMMAND. See the documentation for  complete  for  more
              information.

       -e EVENT_NAME or --on-event EVENT_NAME
              Run  this  function  when  the  specified  named event is emitted. Fish internally generates named
              events, for example, when showing the prompt. Custom events can be emitted using the emit command.

       -v VARIABLE_NAME or --on-variable VARIABLE_NAME
              Run this function when  the  variable  VARIABLE_NAME  changes  value.  Note  that  fish  makes  no
              guarantees  on  any  particular timing or even that the function will be run for every single set.
              Rather it will be run when the variable has been set at least once, possibly skipping some  values
              or  being run when the variable has been set to the same value (except for universal variables set
              in other shells - only changes in the value will be picked up for those).

       -j PID or --on-job-exit PID
              Run this function when the job containing a child process with the given  process  identifier  PID
              exits.  Instead  of  a  PID,  the string 'caller' can be specified. This is only allowed when in a
              command substitution, and will result in the handler being triggered by the exit of the job  which
              created this command substitution.  This will not trigger for disowned jobs.

       -p PID or --on-process-exit PID
              Run  this  function  when  the fish child process with process ID PID exits. Instead of a PID, for
              backward compatibility, "%self" can be specified as an alias for $fish_pid, and the function  will
              be run when the current fish instance exits.  This will not trigger for disowned jobs.

       -s SIGSPEC or --on-signal SIGSPEC
              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). Note that the signal must have been delivered to  fish;
              for  example,  ctrl-c  sends SIGINT to the foreground process group, which will not be fish if you
              are running another command at the time. Observing a signal will  prevent  fish  from  exiting  in
              response to that signal.

       -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 are independent of the calling function.

              It's important to note that this does not capture referenced variables or the scope at the time of
              function  declaration!  At  this  time,  fish  does not have any concept of closures, and variable
              lifetimes are never extended. In other words, by  using  --no-scope-shadowing  the  scope  of  the
              function  each time it is run is shared with the scope it was called from rather than the scope it
              was defined in.

       -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 defined. This is similar to a closure in other languages like Python
              but a bit different. Note the word "snapshot" in the first sentence. If you change  the  value  of
              the  variable  after defining the function, even if you do so in the same scope (typically another
              function) the new value will not be used by the function you just created using this  option.  See
              the function notify example below for how this might be used.

       The  event  handler  switches (on-event, on-variable, on-job-exit, on-process-exit and on-signal) cause a
       function to run automatically at specific events. New named events for --on-event can be fired using  the
       emit builtin. Fish already generates a few events, see Event handlers for more.

       Functions names cannot be reserved words. These are elements of fish syntax or builtin commands which are
       essential  for the operations of the shell. Current reserved words are [, _, and, argparse, begin, break,
       builtin, case, command, continue, else, end, eval, exec, for, function, if, not, or, read,  return,  set,
       status, string, switch, test, time, and while.

   Example
          function ll
              ls -l $argv
          end

       will run the ls command, using the -l option, while passing on any additional files and switches to ls.

          function debug -a name val
              echo [DEBUG] $name: $val >&2
          end

          set foo bar
          debug foo bar
          # prints: [DEBUG] foo: bar

          # OR

          function debug2 -a var
              echo [DEBUG] $var: $$var >&2
          end

          set foo bar
          debug2 foo
          # prints: [DEBUG] foo: bar

       will create a debug command to print chosen variables to stderr.

          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

       This will run the mkdir command, and if it is successful, change the current working directory to the one
       just created.

          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

       This will beep when the most recent job completes.

   Notes
       Events  are  only  received from the current fish process as there is no way to send events from one fish
       process to another.

   See more
       For more explanation of how functions fit into fish, see Functions.

   functions - print or erase functions
   Synopsis
       functions [-a | --all] [-n | --names]
       functions [-D | --details] [-v] FUNCTION
       functions -c OLDNAME NEWNAME
       functions -d DESCRIPTION FUNCTION
       functions [-e | -q] FUNCTION ...

   Description
       functions prints or erases functions.

       The following options are available:

       -a or --all
              Lists all functions, even those whose name starts with an underscore.

       -c or --copy OLDNAME NEWNAME
              Creates a new function named NEWNAME, using the definition of the OLDNAME function.

       -d or --description DESCRIPTION
              Changes the description of this function.

       -e or --erase
              Causes the specified functions to be erased. This also means that it is prevented from autoloading
              in the current session. Use funcsave to remove the saved copy.

       -D or --details
              Reports the path name where the specified function is defined or could be autoloaded, stdin if the
              function was defined interactively or on the command line or by reading standard input, -  if  the
              function  was  created via source, and n/a if the function isn't available. (Functions created via
              alias will return -, because alias uses source internally. Copied functions will return where  the
              function was copied.) If the --verbose option is also specified then five lines are written:

              • the path name as already described,

              • if  the  function  was  copied,  the  path  name  to  where the function was originally defined,
                otherwise autoloaded, not-autoloaded or n/a,

              • the line number within the file or zero if not applicable,

              • scope-shadowing if the function shadows the vars in the calling function (the normal case if  it
                wasn't defined with --no-scope-shadowing), else no-scope-shadowing, or n/a if the function isn't
                defined,

              • the  function description minimally escaped so it is a single line, or n/a if the function isn't
                defined or has no description.

              You should not assume that only five lines will be written since we may add additional information
              to the output in the future.

       --no-details
              Turns off function path reporting, so just the definition will be printed.

       -n or --names
              Lists the names of all defined functions.

       -q or --query
              Tests if the specified functions exist.

       -v or --verbose
              Make some output more verbose.

       -H or --handlers
              Show all event handlers.

       -t or --handlers-type TYPE
              Show all event handlers matching the given TYPE.

       -h or --help
              Displays help about using this command.

       The default behavior of functions, when called with no arguments, is to print the names  of  all  defined
       functions.  Unless  the  -a  option  is given, no functions starting with underscores are included in the
       output.

       If any non-option parameters are given, the definition of the specified functions are printed.

       Copying a function using -c copies only the  body  of  the  function,  and  does  not  attach  any  event
       notifications from the original function.

       Only one function's description can be changed in a single invocation of functions -d.

       The exit status of functions is the number of functions specified in the argument list that do not exist,
       which can be used in concert with the -q option.

   Examples
          functions -n
          # Displays a list of currently-defined functions

          functions -c foo bar
          # Copies the 'foo' function to a new function called 'bar'

          functions -e bar
          # Erases the function ``bar``

   See more
       For more explanation of how functions fit into fish, see Functions.

   help - display fish documentation
   Synopsis
       help [SECTION]

   Description
       help displays the fish help documentation.

       If a SECTION is specified, the help for that command is shown.

       The -h or --help option displays help about using this command.

       If  the  BROWSER  environment  variable is set, it will be used to display the documentation.  Otherwise,
       fish will search for a suitable browser.  To use a different browser than as described above, you can set
       $fish_help_browser This variable may be set as a list, where the first element is the browser command and
       the rest are browser options.

   Example
       help fg shows the documentation for the fg builtin.

   Notes
       Most builtin commands, including this one, display their help in  the  terminal  when  given  the  --help
       option.

   history - show and manipulate command history
   Synopsis
       history [search] [--show-time] [--case-sensitive]
                        [--exact | --prefix | --contains] [--max N] [--null] [--reverse]
                        [SEARCH_STRING ...]
       history delete [--case-sensitive]
                      [--exact | --prefix | --contains] SEARCH_STRING ...
       history merge
       history save
       history clear
       history clear-session
       history append COMMAND ...

   Description
       history is used to search, delete, and otherwise manipulate the history of interactive commands.

       The following operations (sub-commands) are available:

       search Returns  history  items matching the search string. If no search string is provided it returns all
              history items. This is the default operation if no other operation is specified. You only have  to
              explicitly  say  history  search  if you wish to search for one of the subcommands. The --contains
              search option will be used if you don't specify a different search  option.  Entries  are  ordered
              newest to oldest unless you use the --reverse flag. If stdout is attached to a tty the output will
              be piped through your pager by the history function. The history builtin simply writes the results
              to stdout.

       delete Deletes  history items. The --contains search option will be used if you don't specify a different
              search option. If you don't specify --exact a prompt  will  be  displayed  before  any  items  are
              deleted  asking  you  which  entries are to be deleted. You can enter the word "all" to delete all
              matching entries. You can enter a single ID (the number in square brackets) to  delete  just  that
              single  entry.  You  can  enter  more  than  one ID, or an ID range separated by a space to delete
              multiple entries. Just press [enter] to not delete anything.  Note  that  the  interactive  delete
              behavior  is  a  feature  of  the  history  function.  The  history  builtin only supports --exact
              --case-sensitive deletion.

       merge  Immediately incorporates history changes from other  sessions.  Ordinarily  fish  ignores  history
              changes  from  sessions  started  after  the  current  one.  This  command  applies  those changes
              immediately.

       save   Immediately writes all changes to the history file. The  shell  automatically  saves  the  history
              file;  this  option  is  provided  for internal use and should not normally need to be used by the
              user.

       clear  Clears the history file. A prompt is displayed before the history is erased asking you to  confirm
              you really want to clear all history unless builtin history is used.

       clear-session
              Clears  the  history  file  from  all  activity  of the current session. Note: If history merge or
              builtin history merge is run in a session, only the history after this will be erased.

       append Appends commands to the history without needing to execute them.

       The following options are available:

       These flags can appear before or immediately after one of the sub-commands listed above.

       -C or --case-sensitive
              Does a case-sensitive search. The default is case-insensitive. Note that prior to fish  2.4.0  the
              default was case-sensitive.

       -c or --contains
              Searches  items in the history that contain the specified text string. This is the default for the
              --search flag. This is not currently supported by the delete subcommand.

       -e or --exact
              Searches or deletes items in the history that exactly match the specified text string. This is the
              default for the delete subcommand. Note that the match is  case-insensitive  by  default.  If  you
              really want an exact match, including letter case, you must use the -C or --case-sensitive flag.

       -p or --prefix
              Searches  items  in  the  history that begin with the specified text string. This is not currently
              supported by the delete subcommand.

       -t or --show-time
              Prepends each history entry with the date and time the entry was recorded. By default it uses  the
              strftime  format # %c%n. You can specify another format; e.g., --show-time="%Y-%m-%d %H:%M:%S " or
              --show-time="%a%I%p". The short option, -t, doesn't accept a strftime format string; it only  uses
              the default format. Any strftime format is allowed, including %s to get the raw UNIX seconds since
              the epoch.

       -z or --null
              Causes history entries written by the search operations to be terminated by a NUL character rather
              than  a  newline.  This allows the output to be processed by read -z to correctly handle multiline
              history entries.

       -*NUMBER* -n NUMBER or --max NUMBER
              Limits the matched history items to the first NUMBER matching entries.  This  is  only  valid  for
              history search.

       -R or --reverse
              Causes  the history search results to be ordered oldest to newest. Which is the order used by most
              shells. The default is newest to oldest.

       -h or --help
              Displays help for this command.

   Example
          history clear
          # Deletes all history items

          history search --contains "foo"
          # Outputs a list of all previous commands containing the string "foo".

          history delete --prefix "foo"
          # Interactively deletes commands which start with "foo" from the history.
          # You can select more than one entry by entering their IDs separated by a space.

   Customizing the name of the history file
       By   default   interactive   commands   are   logged   to   $XDG_DATA_HOME/fish/fish_history   (typically
       ~/.local/share/fish/fish_history).

       You  can  set  the fish_history variable to another name for the current shell session. The default value
       (when the variable is unset) is fish which corresponds to $XDG_DATA_HOME/fish/fish_history. If you set it
       to e.g. fun, the history would be written  to  $XDG_DATA_HOME/fish/fun_history.  An  empty  string  means
       history will not be stored at all. This is similar to the private session features in web browsers.

       You  can  change  fish_history at any time (by using set -x fish_history "session_name") and it will take
       effect right away. If you set it to "default", it will use the default session name (which is "fish").

       Other shells such as bash and zsh use a variable named HISTFILE  for  a  similar  purpose.  Fish  uses  a
       different  name  to  avoid conflicts and signal that the behavior is different (session name instead of a
       file path). Also, if you set the var to anything other than fish or default it will inhibit importing the
       bash history. That's because the most common use case for this feature is to  avoid  leaking  private  or
       sensitive history when giving a presentation.

   Notes
       If you specify both --prefix and --contains the last flag seen is used.

       Note  that  for  backwards  compatibility  each  subcommand  can  also be specified as a long option. For
       example, rather than history search you can type history --search. Those long options are deprecated  and
       will be removed in a future release.

   if - conditionally execute a command
   Synopsis
       if CONDITION; COMMANDS_TRUE ...;
       [else if CONDITION2; COMMANDS_TRUE2 ...;]
       [else; COMMANDS_FALSE ...;]
       end

   Description
       if  will  execute  the command CONDITION. If the condition's exit status is 0, the commands COMMANDS_TRUE
       will execute.  If the exit status is not 0 and else is given, COMMANDS_FALSE will be executed.

       You can use and or or in the condition. See the second example below.

       The exit status of the last foreground command to exit can always be accessed using the $status variable.

       The -h or --help option displays help about using this command.

   Example
       The following code will print foo.txt exists if the file foo.txt exists and is a regular file,  otherwise
       it  will  print  bar.txt exists if the file bar.txt exists and is a regular file, otherwise it will print
       foo.txt and bar.txt do not exist.

          if test -f foo.txt
              echo foo.txt exists
          else if test -f bar.txt
              echo bar.txt exists
          else
              echo foo.txt and bar.txt do not exist
          end

       The following code will print "foo.txt exists and is readable" if foo.txt is a regular file and readable

          if test -f foo.txt
             and test -r foo.txt
             echo "foo.txt exists and is readable"
          end

   See also
       if is only as useful as the command used as the condition.

       Fish ships a few:

       • test - perform tests on files and text can compare numbers, strings and check paths

       • string - manipulate strings can perform string operations including  wildcard  and  regular  expression
         matches

       • path - manipulate and check paths can check paths for permissions, existence or type

       • contains - test if a word is present in a list can check if an element is in a list

   isatty - test if a file descriptor is a terminal
   Synopsis
       isatty [FILE_DESCRIPTOR]

   Description
       isatty  tests  if  a  file  descriptor is a terminal (as opposed to a file). The name is derived from the
       system call of the same name, which for historical reasons refers to a teletypewriter (TTY).

       FILE DESCRIPTOR may be either the number of a file descriptor, or one of the strings  stdin,  stdout,  or
       stderr. If not specified, zero is assumed.

       If the specified file descriptor is a terminal device, the exit status of the command is zero. Otherwise,
       the exit status is non-zero. No messages are printed to standard error.

       The -h or --help option displays help about using this command.

   Examples
       From an interactive shell, the commands below exit with a return value of zero:

          isatty
          isatty stdout
          isatty 2
          echo | isatty 1

       And these will exit non-zero:

          echo | isatty
          isatty 9
          isatty stdout > file
          isatty 2 2> file

   jobs - print currently running jobs
   Synopsis
       jobs [OPTIONS] [PID | %JOBID]

   Description
       NOTE:  This page documents the fish builtin jobs.  To see the documentation on any non-fish versions, use
       command man jobs.

       jobs prints a list of the currently running jobs and their status.

       jobs accepts the following options:

       -c or --command
              Prints the command name for each process in jobs.

       -g or --group
              Only prints the group ID of each job.

       -l or --last
              Prints only the last job to be started.

       -p or --pid
              Prints the process ID for each process in all jobs.

       -q or --query
              Prints no output for evaluation of jobs by exit status  only.  For  compatibility  with  old  fish
              versions this is also --quiet (but this is deprecated).

       -h or --help
              Displays help about using this command.

       On  systems  that  support this feature, jobs will print the CPU usage of each job since the last command
       was executed. The  CPU  usage  is  expressed  as  a  percentage  of  full  CPU  activity.  Note  that  on
       multiprocessor systems, the total activity may be more than 100%.

       Arguments  of the form PID or %JOBID restrict the output to jobs with the selected process identifiers or
       job numbers respectively.

       If the output of jobs is redirected or if it is part of a command substitution, the column header that is
       usually printed is omitted, making it easier to parse.

       The exit status of jobs is 0 if there are running background jobs and 1 otherwise.

   Example
       jobs outputs a summary of the current jobs, such as two long-running tasks in this example:

          Job Group   State   Command
          2   26012   running nc -l 55232 < /dev/random &
          1   26011   running python tests/test_11.py &

   math - perform mathematics calculations
   Synopsis
       math [(-s | --scale) N] [(-b | --base) BASE] [(-m | --scale-mode) MODE] EXPRESSION ...

   Description
       math performs mathematical calculations.  It supports simple operations such  as  addition,  subtraction,
       and so on, as well as functions like abs(), sqrt() and ln().

       By  default,  the  output  shows up to 6 decimal places.  To change the number of decimal places, use the
       --scale option, including --scale=0 for integer output.

       Keep in mind that parameter expansion happens before expressions are evaluated.  This can be very  useful
       in order to perform calculations involving shell variables or the output of command substitutions, but it
       also means that parenthesis (()) and the asterisk (*) glob character have to be escaped or quoted.  x can
       also  be  used to denote multiplication, but it needs to be followed by whitespace to distinguish it from
       hexadecimal numbers.

       Parentheses for functions are optional - math sin pi prints 0.  However, a comma will bind to  the  inner
       function,  so  math pow sin 3, 5 is an error because it tries to give sin the arguments 3 and 5.  When in
       doubt, use parentheses.

       math ignores whitespace between arguments and takes its input as multiple  arguments  (internally  joined
       with a space), so math 2 +2 and math "2 +    2" work the same.  math 2 2 is an error.

       The following options are available:

       -s N or --scale N
              Sets  the  scale  of the result.  N must be an integer or the word "max" for the maximum scale.  A
              scale of zero causes results to be truncated by default. Any non-integer component is thrown away.
              So 3/2 returns 1 by default, rather than 2 which  1.5  would  normally  round  to.   This  is  for
              compatibility  with  bc  which  was  the basis for this command prior to fish 3.0.0.  Scale values
              greater than zero causes the result to be rounded using the usual rules to the specified number of
              decimal places.

       -b BASE or --base BASE
              Sets the numeric base used for output (math always understands hexadecimal numbers as input).   It
              currently  understands  "hex"  or  "16" for hexadecimal and "octal" or "8" for octal and implies a
              scale of 0 (other scales cause an error), so it will truncate the result down to an integer.  This
              might change in the future.  Hex numbers will be printed with a 0x  prefix.   Octal  numbers  will
              have a prefix of 0 but aren't understood by math as input.

       -m MODE or --scale-mode MODE
              Sets scale behavior.  The MODE can be truncate, round, floor, ceiling.  The default value of scale
              mode is round with non zero scale and truncate with zero scale.

       -h or --help
              Displays help about using this command.

   Return Values
       If the expression is successfully evaluated and doesn't over/underflow or return NaN the return status is
       zero (success) else one.

   Syntax
       math knows some operators, constants, functions and can (obviously) read numbers.

       For  numbers,  .  is always the radix character regardless of locale - 2.5, not 2,5.  Scientific notation
       (10e5) and hexadecimal (0xFF) are also available.

       math allows you to use underscores as visual separators for digit grouping. For example,  you  can  write
       1_000_000, 0x_89_AB_CD_EF, and 1.234_567_e89.

   Operators
       math knows the following operators:

       +      for addition

       -      for subtraction

       * or x for  multiplication.  *  is  the  glob  character and needs to be quoted or escaped, x needs to be
              followed by whitespace or it looks like 0x hexadecimal notation.

       /      for division

       ^      for exponentiation

       %      for modulo

       ( or ) for grouping. These need to be quoted or escaped because () denotes a command substitution.

       They are all used in an infix manner - 5 + 2, not + 5 2.

   Constants
       math knows the following constants:

       e      Euler's number

       pi     π, you know this one.  Half of Tau

       tau    Equivalent to 2π, or the number of radians in a circle

       Use them without a leading $ - pi - 3 should be about 0.

   Functions
       math supports the following functions:

       abs    the absolute value, with positive sign

       acos   arc cosine

       asin   arc sine

       atan   arc tangent

       atan2  arc tangent of two variables

       bitand, bitor and bitxor
              perform bitwise operations.  These will throw away any non-integer parts and interpret the rest as
              an int.

              Note: bitnot and bitnand don't exist. This is because numbers in math don't really have a width in
              terms of bits, and these operations necessarily care about leading zeroes.

              If you need to negate a specific number you can do it with an xor with a mask, e.g.:

                 > math --base=hex bitxor 0x0F, 0xFF
                 0xF0

                 > math --base=hex bitxor 0x2, 0x3
                 # Here we mask with 0x3 == 0b111, so our number is 3 bits wide
                 # Only the 1 bit isn't set.
                 0x1

       ceil   round number up to the nearest integer

       cos    the cosine

       cosh   hyperbolic cosine

       exp    the base-e exponential function

       fac    factorial - also known as x! (x * (x - 1) * (x - 2) * ... * 1)

       floor  round number down to the nearest integer

       ln     the base-e logarithm

       log or log10
              the base-10 logarithm

       log2   the base-2 logarithm

       max    returns the largest of the given numbers - this takes an arbitrary number  of  arguments  (but  at
              least one)

       min    returns  the  smallest  of the given numbers - this takes an arbitrary number of arguments (but at
              least one)

       ncr    "from n choose r" combination function - how many subsets of size r can be  taken  from  n  (order
              doesn't matter)

       npr    the  number  of  subsets of size r that can be taken from a set of n elements (including different
              order)

       pow(x,y)
              returns x to the y (and can be written as x ^ y)

       round  rounds to the nearest integer, away from 0

       sin    the sine function

       sinh   the hyperbolic sine

       sqrt   the square root - (can also be written as x ^ 0.5)

       tan    the tangent

       tanh   the hyperbolic tangent

       All of the trigonometric functions use radians (the pi-based scale, not 360°).

   Examples
       math 1+1 outputs 2.

       math $status - 128 outputs the numerical exit status of the last command minus 128.

       math 10 / 6 outputs 1.666667.

       math -s0 10.0 / 6.0 outputs 1.

       math -s3 10 / 6 outputs 1.667.

       math "sin(pi)" outputs 0.

       math 5 \* 2 or math "5 * 2" or math 5 "*" 2 all output 10.

       math 0xFF outputs 255, math 0 x 3 outputs 0 (because it computes 0 multiplied by 3).

       math bitand 0xFE, 0x2e outputs 46.

       math "bitor(9,2)" outputs 11.

       math --base=hex 192 prints 0xc0.

       math 'ncr(49,6)' prints 13983816 - that's the number of possible picks in 6-from-49 lotto.

       math max 5,2,3,1 prints 5.

   Compatibility notes
       Fish 1.x and 2.x releases relied on the bc command for handling  math  expressions.  Starting  with  fish
       3.0.0 fish uses the tinyexpr library and evaluates the expression without the involvement of any external
       commands.

       You don't need to use -- before the expression, even if it begins with a minus sign which might otherwise
       be  interpreted  as  an  invalid  option. If you do insert -- before the expression, it will cause option
       scanning to stop just like for every other command and it won't be part of the expression.

   nextd - move forward through directory history
   Synopsis
       nextd [-l | --list] [POS]

   Description
       nextd moves forwards POS positions in the history of visited directories; if the end of the  history  has
       been hit, a warning is printed.

       If the -l or --list option is specified, the current directory history is also displayed.

       The -h or --help option displays help about using this command.

       Note  that  the  cd  command  limits  directory  history to the 25 most recently visited directories. The
       history is stored in the dirprev and dirnext variables which this command manipulates.

   Example
          cd /usr/src
          # Working directory is now /usr/src

          cd /usr/src/fish-shell
          # Working directory is now /usr/src/fish-shell

          prevd
          # Working directory is now /usr/src

          nextd
          # Working directory is now /usr/src/fish-shell

   See Also
       • the cdh command to display a prompt to quickly navigate the history

       • the dirh command to print the directory history

       • the prevd command to move backward

   not - negate the exit status of a job
   Synopsis
       not COMMAND [OPTIONS ...]
       ! COMMAND [OPTIONS ...]

   Description
       not negates the exit status of another command. If the exit status is zero, not returns 1. Otherwise, not
       returns 0.

       Some other shells only support the ! alias.

       The -h or --help option displays help about using this command.

   Example
       The following code reports an error and exits if no file named spoon can be found.

          if not test -f spoon
              echo There is no spoon
              exit 1
          end

   open - open file in its default application
   Synopsis
       open FILES ...

   Description
       open opens a file in its default application, using the appropriate tool for  the  operating  system.  On
       GNU/Linux, this requires the common but optional xdg-open utility, from the xdg-utils package.

       Note  that this function will not be used if a command by this name exists (which is the case on macOS or
       Haiku).

   Example
       open *.txt opens all the text files in the current directory using your system's default text editor.

   or - conditionally execute a command
   Synopsis
       COMMAND1; or COMMAND2

   Description
       or is used to execute a command if the  previous  command  was  not  successful  (returned  a  status  of
       something other than 0).

       or statements may be used as part of the condition in an if or while block.

       or  does  not  change  the current exit status itself, but the command it runs most likely will. The exit
       status of the last foreground command to exit can always be accessed using the $status variable.

       The -h or --help option displays help about using this command.

   Example
       The following code runs the make command to build a program.  If  the  build  succeeds,  the  program  is
       installed. If either step fails, make clean is run, which removes the files created by the build process.

          make; and make install; or make clean

   See Alsoand command

   path - manipulate and check paths
   Synopsis
       path basename GENERAL_OPTIONS [(-E | --no-extension)] [PATH ...]
       path dirname GENERAL_OPTIONS  [PATH ...]
       path extension GENERAL_OPTIONS [PATH ...]
       path filter GENERAL_OPTIONS [-v | --invert]
           [-d] [-f] [-l] [-r] [-w] [-x]
           [(-t | --type) TYPE] [(-p | --perm) PERMISSION] [PATH ...]
       path is GENERAL_OPTIONS [(-v | --invert)] [(-t | --type) TYPE]
           [-d] [-f] [-l] [-r] [-w] [-x]
           [(-p | --perm) PERMISSION] [PATH ...]
       path mtime GENERAL_OPTIONS [(-R | --relative)] [PATH ...]
       path normalize GENERAL_OPTIONS [PATH ...]
       path resolve GENERAL_OPTIONS [PATH ...]
       path change-extension GENERAL_OPTIONS EXTENSION [PATH ...]
       path sort GENERAL_OPTIONS [-r | --reverse]
           [-u | --unique] [--key=basename|dirname|path] [PATH ...]

       GENERAL_OPTIONS
           [-z | --null-in] [-Z | --null-out] [-q | --quiet]

   Description
       path performs operations on paths.

       PATH arguments are taken from the command line unless standard input is connected to a pipe or a file, in
       which  case they are read from standard input, one PATH per line. It is an error to supply PATH arguments
       on both the command line and on standard input.

       Arguments starting with - are normally interpreted as switches; -- causes the following arguments not  to
       be  treated as switches even if they begin with -. Switches and required arguments are recognized only on
       the command line.

       When a path starts with -, path filter and path normalize will prepend ./ on output  to  avoid  it  being
       interpreted  as an option otherwise, so it's safe to pass path's output to other commands that can handle
       relative paths.

       All subcommands accept a -q or --quiet switch, which suppresses the  usual  output  but  exits  with  the
       documented  status.  In  this  case  these commands will quit early, without reading all of the available
       input.

       All subcommands also accept a -Z or --null-out switch, which makes them print output separated  with  NUL
       instead  of  newlines. This is for further processing, e.g. passing to another path, or xargs -0. This is
       not recommended when the output goes to the terminal or a command substitution.

       All subcommands also accept a -z or --null-in switch,  which  makes  them  accept  arguments  from  stdin
       separated  with  NULL-bytes.  Since  Unix  paths can't contain NULL, that makes it possible to handle all
       possible paths and read input from e.g. find -print0. If arguments are given on the commandline this  has
       no  effect.  This  should  mostly be unnecessary since path automatically starts splitting on NULL if one
       appears in the first PATH_MAX bytes, PATH_MAX being the operating system's maximum length for a path plus
       a NULL byte.

       Some subcommands operate on the paths as strings and so work on nonexistent paths, while others  need  to
       access the paths themselves and so filter out nonexistent paths.

       The following subcommands are available.

   "basename" subcommand
          path basename [-E | --no-extension] [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]

       path  basename  returns  the  last path component of the given path, by removing the directory prefix and
       removing trailing slashes. In other words, it is the part that is not the dirname. For  files  you  might
       call it the "filename".

       If  the  -E  or ---no-extension option is used and the base name contained a period, the path is returned
       with the extension (or the last extension) removed, i.e. the "filename" without  an  extension  (akin  to
       calling path change-extension "" (path basename $path)).

       It returns 0 if there was a basename, i.e. if the path wasn't empty or just slashes.

   Examples
          >_ path basename ./foo.mp4
          foo.mp4

          >_ path basename ../banana
          banana

          >_ path basename /usr/bin/
          bin

          >_ path basename /usr/bin/*
          # This prints all files in /usr/bin/
          # A selection:
          cp
          fish
          grep
          rm

   "dirname" subcommand
          path dirname [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]

       path  dirname  returns  the dirname for the given path. This is the part before the last "/", discounting
       trailing slashes. In other words, it is the part  that  is  not  the  basename  (discounting  superfluous
       slashes).

       It returns 0 if there was a dirname, i.e. if the path wasn't empty or just slashes.

   Examples
          >_ path dirname ./foo.mp4
          .

          >_ path dirname ../banana
          ..

          >_ path dirname /usr/bin/
          /usr

   "extension" subcommand
          path extension [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]

       path  extension  returns the extension of the given path. This is the part after (and including) the last
       ".", unless that "." followed a "/" or the basename is "." or "..", in which case there is  no  extension
       and an empty line is printed.

       If the filename ends in a ".", only a "." is printed.

       It returns 0 if there was an extension.

   Examples
          >_ path extension ./foo.mp4
          .mp4

          >_ path extension ../banana
          # an empty line, status 1

          >_ path extension ~/.config
          # an empty line, status 1

          >_ path extension ~/.config.d
          .d

          >_ path extension ~/.config.
          .

          >_ set -l path (path change-extension '' ./foo.mp4)
          >_ set -l extension (path extension ./foo.mp4)
          > echo $path$extension
          # reconstructs the original path again.
          ./foo.mp4

   "filter" subcommand
          path filter [-z | --null-in] [-Z | --null-out] [-q | --quiet] \
              [-d] [-f] [-l] [-r] [-w] [-x] \
              [-v | --invert] [(-t | --type) TYPE] [(-p | --perm) PERMISSION] [PATH ...]

       path  filter  returns all of the given paths that match the given checks. In all cases, the paths need to
       exist, nonexistent paths are always filtered.

       The available filters are:

       • -t or --type with the options: "dir", "file", "link", "block", "char", "fifo" and  "socket",  in  which
         case  the  path  needs  to  be  a  directory, file, link, block device, character device, named pipe or
         socket, respectively.

       • -d, -f and -l are short for  --type=dir,  --type=file  and  --type=link,  respectively.  There  are  no
         shortcuts for the other types.

       • -p  or  --perm  with  the  options:  "read",  "write",  and  "exec",  as well as "suid", "sgid", "user"
         (referring to the path owner) and "group" (referring to the path's group), in which case the path needs
         to have all of the given permissions for the current user.

       • -r, -w and -x are short for --perm=read, --perm=write  and  --perm=exec,  respectively.  There  are  no
         shortcuts for the other permissions.

       Note  that  the  path  needs to be any of the given types, but have all of the given permissions. This is
       because having a path that is both writable and executable makes sense, but having a path that is both  a
       directory and a file doesn't. Links will count as the type of the linked-to file, so links to files count
       as files, links to directories count as directories.

       The  filter options can either be given as multiple options, or comma-separated - path filter -t dir,file
       or path filter --type dir --type file are equivalent.

       With --invert, the meaning of the filtering is inverted - any path that wouldn't pass (including  by  not
       existing) passes, and any path that would pass fails.

       When  a  path  starts  with  -,  path  filter  will prepend ./ to avoid it being interpreted as an option
       otherwise.

       It returns 0 if at least one path passed the filter.

       path is is shorthand for path filter -q,  i.e.  just  checking  without  producing  output,  see  The  is
       subcommand.

   Examples
          >_ path filter /usr/bin /usr/argagagji
          # The (hopefully) nonexistent argagagji is filtered implicitly:
          /usr/bin

          >_ path filter --type file /usr/bin /usr/bin/fish
          # Only fish is a file
          /usr/bin/fish

          >_ path filter --type file,dir --perm exec,write /usr/bin/fish /home/me
          # fish is a file, which passes, and executable, which passes,
          # but probably not writable, which fails.
          #
          # $HOME is a directory and both writable and executable, typically.
          # So it passes.
          /home/me

          >_ path filter -fdxw /usr/bin/fish /home/me
          # This is the same as above: "-f" is "--type=file", "-d" is "--type=dir",
          # "-x" is short for "--perm=exec" and "-w" short for "--perm=write"!
          /home/me

          >_ path filter -fx $PATH/*
          # Prints all possible commands - the first entry of each name is what fish would execute!

   "is" subcommand
          path is [-z | --null-in] [-Z | --null-out] [-q | --quiet] \
              [-d] [-f] [-l] [-r] [-w] [-x] \
              [-v | --invert] [(-t | --type) TYPE] [(-p | --perm) PERMISSION] [PATH ...]

       path  is  is  short  for path filter -q. It returns true if any of the given files passes the filter, but
       does not produce any output.

       --quiet can still be passed for compatibility but is redundant. The options are  the  same  as  for  path
       filter.

   Examples
          >_ path is /usr/bin /usr/argagagji
          # /usr/bin exists, so this returns a status of 0 (true). It prints nothing.
          >_ path is /usr/argagagji
          # /usr/argagagji does not, so this returns a status of 1 (false). It also prints nothing.
          >_ path is -fx /bin/sh
          # /bin/sh is usually an executable file, so this returns true.

   "mtime" subcommand
          path mtime [-z | --null-in] [-Z | --null-out] [-q | --quiet] [-R | --relative] [PATH ...]

       path  mtime  returns  the  last modification time ("mtime" in unix jargon) of the given paths, in seconds
       since the unix epoch (the beginning of the 1st of January 1970).

       With --relative (or -R), it prints the number of seconds since the modification time. It only  reads  the
       current  time  once at start, so in case multiple paths are given the times are all relative to the start
       of path mtime -R running.

       If you want to know if a file is newer or older than another file, consider using test -nt  instead.  See
       the test documentation.

       It returns 0 if reading mtime for any path succeeded.

   Examples
          >_ date +%s
          # This prints the current time as seconds since the epoch
          1657217847

          >_ path mtime /etc/
          1657213796

          >_ path mtime -R /etc/
          4078
          # So /etc/ on this system was last modified a little over an hour ago

          # This is the same as
          >_ math (date +%s) - (path mtime /etc/)

   "normalize" subcommand
          path normalize [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]

       path  normalize  returns  the  normalized  versions  of  all paths. That means it squashes duplicate "/",
       collapses "../" with earlier components and removes "." components.

       Unlike realpath or path resolve, it does not make the paths  absolute.  It  also  does  not  resolve  any
       symlinks. As such it can operate on non-existent paths.

       Because  it  operates  on paths as strings and doesn't resolve symlinks, it works sort of like pwd -L and
       cd. E.g. path normalize link/.. will return ., just like cd link; cd  ..  would  return  to  the  current
       directory. For a physical view of the filesystem, see path resolve.

       Leading  "./"  components  are usually removed. But when a path starts with -, path normalize will add it
       instead to avoid confusion with options.

       It returns 0 if any normalization was done, i.e. any given path wasn't in canonical form.

   Examples
          >_ path normalize /usr/bin//../../etc/fish
          # The "//" is squashed and the ".." components neutralize the components before
          /etc/fish

          >_ path normalize /bin//bash
          # The "//" is squashed, but /bin isn't resolved even if your system links it to /usr/bin.
          /bin/bash

          >_ path normalize ./my/subdirs/../sub2
          my/sub2

          >_ path normalize -- -/foo
          ./-/foo

   "resolve" subcommand
          path resolve [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]

       path resolve returns the normalized, physical and absolute versions of all paths. That means it  resolves
       symlinks  and  does  what  path  normalize  does: it squashes duplicate "/", collapses "../" with earlier
       components and removes "." components. Then it turns that path into the absolute path starting  from  the
       filesystem root "/".

       It  is  similar  to realpath, as it creates the "real", canonical version of the path. However, for paths
       that can't be resolved, e.g. if they don't exist or form a symlink loop, it will resolve as far as it can
       and normalize the rest.

       Because it resolves symlinks, it works sort of like pwd -P. E.g. path resolve  link/..  will  return  the
       parent  directory  of  what  the  link points to, just like cd link; cd (pwd -P)/.. would go to it. For a
       logical view of the filesystem, see path normalize.

       It returns 0 if any normalization or resolution was done, i.e. any given path wasn't in canonical form.

   Examples
          >_ path resolve /bin//sh
          # The "//" is squashed, and /bin is resolved if your system links it to /usr/bin.
          # sh here is bash (this is common on linux systems)
          /usr/bin/bash

          >_ path resolve /bin/foo///bar/../baz
          # Assuming /bin exists and is a symlink to /usr/bin, but /bin/foo doesn't.
          # This resolves the /bin/ and normalizes the nonexistent rest:
          /usr/bin/foo/baz

   "change-extension" subcommand
          path change-extension [-z | --null-in] [-Z | --null-out] \
              [-q | --quiet] EXTENSION [PATH ...]

       path change-extension returns the given paths, with their extension changed to the given  new  extension.
       The  extension  is  the  part  after  (and including) the last ".", unless that "." followed a "/" or the
       basename is "." or "..", in which case there is no previous extension and the new one is simply added.

       If the extension is empty, any previous extension is stripped, along with the ".". This  is,  of  course,
       the inverse of path extension.

       One leading dot on the extension is ignored, so ".mp3" and "mp3" are treated the same.

       It returns 0 if it was given any paths.

   Examples
          >_ path change-extension mp4 ./foo.wmv
          ./foo.mp4

          >_ path change-extension .mp4 ./foo.wmv
          ./foo.mp4

          >_ path change-extension '' ../banana
          ../banana

          >_ path change-extension '' ~/.config
          /home/alfa/.config

          >_ path change-extension '' ~/.config.d
          /home/alfa/.config

          >_ path change-extension '' ~/.config.
          /home/alfa/.config

   "sort" subcommand
          path sort [-z | --null-in] [-Z | --null-out] \
              [-q | --quiet] [-r | --reverse] \
              [--key=basename|dirname|path] [PATH ...]

       path  sort  returns  the  given  paths  in  sorted  order.  They  are sorted in the same order as globs -
       alphabetically, but with runs of numerical digits compared numerically.

       With --reverse or -r the sort is reversed.

       With --key= only the given part of the path is compared, e.g. --key=dirname causes only the dirname to be
       compared, --key=basename only the basename and --key=path causes the entire path to be compared (this  is
       the default).

       With  --unique  or -u the sort is deduplicated, meaning only the first of a run that have the same key is
       kept. So if you are sorting by basename, then only the first of each basename is used.

       The sort used is stable, so sorting first by basename and then by dirname works and causes the  files  to
       be grouped according to directory.

       It currently returns 0 if it was given any paths.

   Examples
          >_ path sort 10-foo 2-bar
          2-bar
          10-foo

          >_ path sort --reverse 10-foo 2-bar
          10-foo
          2-bar

          >_ path sort --unique --key=basename $fish_function_path/*.fish
          # prints a list of all function files fish would use, sorted by name.

   Combining path
       path is meant to be easy to combine with itself, other tools and fish.

       This is why

       • path's  output  is  automatically  split  by fish if it goes into a command substitution, so just doing
         (path ...) handles all paths, even those containing newlines, correctly

       • path has --null-in to handle null-delimited input (typically automatically detected!),  and  --null-out
         to pass on null-delimited output

       Some examples of combining path:

          # Expand all paths in the current directory, leave only executable files, and print their resolved path
          path filter -zZ -xf -- * | path resolve -z

          # The same thing, but using find (note -maxdepth needs to come first or find will scream)
          # (this also depends on your particular version of find)
          # Note the `-z` is unnecessary for any sensible version of find - if `path` sees a NULL,
          # it will split on NULL automatically.
          find . -maxdepth 1 -type f -executable -print0 | path resolve -z

          set -l paths (path filter -p exec $PATH/fish -Z | path resolve)

   popd - move through directory stack
   Synopsis
       popd

   Description
       popd  removes the top directory from the directory stack and changes the working directory to the new top
       directory. Use pushd to add directories to the stack.

       The -h or --help option displays help about using this command.

   Example
          pushd /usr/src
          # Working directory is now /usr/src
          # Directory stack contains /usr/src

          pushd /usr/src/fish-shell
          # Working directory is now /usr/src/fish-shell
          # Directory stack contains /usr/src /usr/src/fish-shell

          popd
          # Working directory is now /usr/src
          # Directory stack contains /usr/src

   See Also
       • the dirs command to print the directory stack

       • the cdh command which provides a more intuitive way to navigate to recently visited directories.

   prevd - move backward through directory history
   Synopsis
       prevd [-l | --list] [POS]

   Description
       prevd moves backwards POS positions in the history of  visited  directories;  if  the  beginning  of  the
       history has been hit, a warning is printed.

       If the -l or --list flag is specified, the current history is also displayed.

       Note  that  the  cd  command  limits  directory  history to the 25 most recently visited directories. The
       history is stored in the dirprev and dirnext variables which this command manipulates.

       The -h or --help option displays help about using this command.

   Example
          cd /usr/src
          # Working directory is now /usr/src

          cd /usr/src/fish-shell
          # Working directory is now /usr/src/fish-shell

          prevd
          # Working directory is now /usr/src

          nextd
          # Working directory is now /usr/src/fish-shell

   See Also
       • the cdh command to display a prompt to quickly navigate the history

       • the dirh command to print the directory history

       • the nextd command to move forward

   printf - display text according to a format string
   Synopsis
       printf FORMAT [ARGUMENT ...]

   Description
       NOTE: This page documents the fish builtin printf.  To see the documentation on  any  non-fish  versions,
       use command man printf.

       printf  uses  the  format  string FORMAT to print the ARGUMENT arguments. This means that it takes format
       specifiers in the format string and replaces each with an argument.

       The FORMAT argument is re-used as many times as necessary to convert  all  of  the  given  arguments.  So
       printf %s\n flounder catfish clownfish shark will print four lines.

       Unlike echo, printf does not append a new line unless it is specified as part of the string.

       It  doesn't support any options, so there is no need for a -- separator, which makes it easier to use for
       arbitrary input than echo. [1]

   Format Specifiers
       Valid format specifiers are taken from the C library function printf(3):

       • %d or %i: Argument will be used as decimal integer (signed or unsigned)

       • %o: An octal unsigned integer

       • %u: An unsigned decimal integer - this means negative numbers will wrap around

       • %x or %X: An unsigned hexadecimal integer

       • %f, %g or %G: A floating-point number. %f defaults to 6  places  after  the  decimal  point  (which  is
         locale-dependent  -  e.g.  in  de_DE it will be a ,). %g and %G will trim trailing zeroes and switch to
         scientific notation (like %e) if the numbers get small or large enough.

       • %e or %E: A floating-point number in scientific (XXXeYY) notation

       • %s: A string

       • %b: As a string, interpreting backslash escapes, except that octal escapes are of the form 0 or 0ooo.

       %% signifies a literal "%".

       Conversion can fail, e.g. "102.234" can't losslessly convert to an integer, causing printf  to  print  an
       error. If you are okay with losing information, silence errors with 2>/dev/null.

       A  number  between  the  % and the format letter specifies the width. The result will be left-padded with
       spaces.

   Backslash Escapes
       printf also knows a number of backslash escapes:

       • \" double quote

       • \\ backslash

       • \a alert (bell)

       • \b backspace

       • \c produce no further output

       • \e escape

       • \f form feed

       • \n new line

       • \r carriage return

       • \t horizontal tab

       • \v vertical tab

       • \ooo octal number (ooo is 1 to 3 digits)

       • \xhh hexadecimal number (hhh is 1 to 2 digits)

       • \uhhhh 16-bit Unicode character (hhhh is 4 digits)

       • \Uhhhhhhhh 32-bit Unicode character (hhhhhhhh is 8 digits)

   Errors and Return Status
       If the given argument doesn't work for the given format (like when you  try  to  convert  a  number  like
       3.141592  to  an  integer), printf prints an error, to stderr. printf will then also return non-zero, but
       will still try to print as much as it can.

       It will also return non-zero if no argument at all was given, in which case it will print nothing.

       This printf has been imported from the printf in GNU Coreutils version 6.9. If you would like  to  use  a
       newer version of printf, for example the one shipped with your OS, try command printf.

   Example
          printf '%s\t%s\n' flounder fish

       Will  print "flounder    fish" (separated with a tab character), followed by a newline character. This is
       useful for writing completions, as fish expects completion scripts to output the option followed  by  the
       description, separated with a tab character.

          printf '%s: %d' "Number of bananas in my pocket" 42

       Will print "Number of bananas in my pocket: 42", without a newline.

   See Also
       • the echo command, for simpler output

   Footnotes
       [1]  In  fact, while fish's echo supports --, POSIX forbids it, so other implementations can't be used if
            the input contains anything starting with -.

   prompt_hostname - print the hostname, shortened for use in the prompt
   Synopsis
       prompt_hostname

   Description
       prompt_hostname prints a shortened version the current hostname for use in the prompt. It will print just
       the first component of the hostname, everything up to the first dot.

   Examples
          function fish_prompt
              echo -n (whoami)@(prompt_hostname) (prompt_pwd) '$ '
          end

          # The machine's full hostname is foo.bar.com
          >_ prompt_hostname
          foo

   prompt_login - describe the login suitable for prompt
   Synopsis
       prompt_login

   Description
       prompt_login is a function to describe the current login. It will  show  the  user,  the  host  and  also
       whether the shell is running in a chroot (currently Debian's debian_chroot file is supported).

   Examples
          function fish_prompt
              echo -n (prompt_login) (prompt_pwd) '$ '
          end

          >_ prompt_login
          root@bananablaster

   prompt_pwd - print pwd suitable for prompt
   Synopsis
       prompt_pwd

   Description
       prompt_pwd  is  a  function to print the current working directory in a way suitable for prompts. It will
       replace the home directory with "~" and shorten every path component but the last to  a  default  of  one
       character.

       To    change   the   number   of   characters   per   path   component,   pass   --dir-length=   or   set
       fish_prompt_pwd_dir_length to the number of characters. Setting it to 0 or an invalid value will  disable
       shortening entirely. This defaults to 1.

       To  keep  some  components  unshortened, pass --full-length-dirs= or set fish_prompt_pwd_full_dirs to the
       number of components. This defaults to 1, keeping the last component.

       If any positional arguments are given, prompt_pwd shortens them instead of PWD.

   Options
       -d or --dir-length MAX
              Causes   the   components   to   be   shortened   to   MAX   characters   each.   This   overrides
              fish_prompt_pwd_dir_length.

       -D or --full-length-dirs NUM
              Keeps  NUM  components  (counted from the right) as full length without shortening. This overrides
              fish_prompt_pwd_full_dirs.

       -h or --help
              Displays help about using this command.

   Examples
          >_ cd ~/
          >_ echo $PWD
          /home/alfa

          >_ prompt_pwd
          ~

          >_ cd /tmp/banana/sausage/with/mustard
          >_ prompt_pwd
          /t/b/s/w/mustard

          >_ set -g fish_prompt_pwd_dir_length 3
          >_ prompt_pwd
          /tmp/ban/sau/wit/mustard

          >_ prompt_pwd --full-length-dirs=2 --dir-length=1
          /t/b/s/with/mustard

   psub - perform process substitution
   Synopsis
       COMMAND1 ( COMMAND2 | psub [-F | --fifo] [-f | --file] [(-s | --suffix) SUFFIX] )

   Description
       Some shells (e.g., ksh, bash) feature a syntax that is a mix between  command  substitution  and  piping,
       called  process  substitution.  It is used to send the output of a command into the calling command, much
       like command substitution, but with the difference that  the  output  is  not  sent  through  commandline
       arguments  but  through  a  named  pipe,  with  the filename of the named pipe sent as an argument to the
       calling program. psub combined with a regular command substitution provides the same functionality.

       The following options are available:

       -f or --file
              Use a regular file instead of a named pipe to communicate with  the  calling  process.  This  will
              cause  psub  to  be  significantly  slower  when  large  amounts of data are involved, but has the
              advantage that the reading process can seek in the stream. This is the default.

       -F or --fifo
              Use a named pipe rather than a file. You should only use this if the command produces no more than
              8 KiB of output. The limit on the amount of data a FIFO can buffer  varies  with  the  OS  but  is
              typically  8 KiB, 16 KiB or 64 KiB. If you use this option and the command on the left of the psub
              pipeline produces more output a deadlock is likely to occur.

       -s or --suffix SUFFIX
              Append SUFFIX to the filename.

       -h or --help
              Displays help about using this command.

   Example
          diff (sort a.txt | psub) (sort b.txt | psub)
          # shows the difference between the sorted versions of files ``a.txt`` and ``b.txt``.

          source-highlight -f esc (cpp main.c | psub -f -s .c)
          # highlights ``main.c`` after preprocessing as a C source.

   pushd - push directory to directory stack
   Synopsis
       pushd DIRECTORY

   Description
       The pushd function adds DIRECTORY to the top of the directory stack and  makes  it  the  current  working
       directory. popd will pop it off and return to the original directory.

       Without arguments, it exchanges the top two directories in the stack.

       pushd +NUMBER rotates the stack counter-clockwise i.e. from bottom to top

       pushd -NUMBER rotates clockwise i.e. top to bottom.

       The -h or --help option displays help about using this command.

   Example
          cd ~/dir1
          pushd ~/dir2
          pushd ~/dir3
          # Working directory is now ~/dir3
          # Directory stack contains ~/dir2 ~/dir1

          pushd /tmp
          # Working directory is now /tmp
          # Directory stack contains ~/dir3 ~/dir2 ~/dir1

          pushd +1
          # Working directory is now ~/dir3
          # Directory stack contains ~/dir2 ~/dir1 /tmp

          popd
          # Working directory is now ~/dir2
          # Directory stack contains ~/dir1 /tmp

   See Also
       • the dirs command to print the directory stack

       • the cdh command which provides a more intuitive way to navigate to recently visited directories.

   pwd - output the current working directory
   Synopsis
       pwd [-P | --physical]
       pwd [-L | --logical]

   Description
       NOTE:  This  page documents the fish builtin pwd.  To see the documentation on any non-fish versions, use
       command man pwd.

       pwd outputs (prints) the current working directory.

       The following options are available:

       -L or --logical
              Output the logical working directory, without resolving symlinks (default behavior).

       -P or --physical
              Output the physical working directory, with symlinks resolved.

       -h or --help
              Displays help about using this command.

   See Also
       Navigate directories using the directory history or the directory stack

   random - generate random number
   Synopsis
       random
       random SEED
       random START END
       random START STEP END
       random choice [ITEMS ...]

   Description
       random generates a pseudo-random integer from a uniform distribution. The range  (inclusive)  depends  on
       the arguments.

       No arguments indicate a range of 0 to 32767 (inclusive).

       If one argument is specified, the internal engine will be seeded with the argument for future invocations
       of random and no output will be produced.

       Two arguments indicate a range from START to END (both START and END included).

       Three arguments indicate a range from START to END with a spacing of STEP between possible outputs.

       random choice will select one random item from the succeeding arguments.

       The -h or --help option displays help about using this command.

       Note that seeding the engine will NOT give the same result across different systems.

       You should not consider random cryptographically secure, or even statistically accurate.

   Example
       The following code will count down from a random even number between 10 and 20 to 1:

          for i in (seq (random 10 2 20) -1 1)
              echo $i
          end

       And this will open a random picture from any of the subdirectories:

          open (random choice **.jpg)

       Or, to only get even numbers from 2 to 20:

          random 2 2 20

       Or odd numbers from 1 to 3:

          random 1 2 3 # or 1 2 4

   read - read line of input into variables
   Synopsis
       read [OPTIONS] [VARIABLE ...]

   Description
       NOTE:  This page documents the fish builtin read.  To see the documentation on any non-fish versions, use
       command man read.

       read reads from standard input and stores the result in shell variables. In an alternative mode,  it  can
       also print to its own standard output, for example for use in command substitutions.

       By  default,  read  reads  a single line and splits it into variables on spaces or tabs. Alternatively, a
       null character or a maximum number of characters can be used to terminate the input, and other delimiters
       can be given.

       Unlike other shells, there is no default variable (such as REPLY) for storing the result - instead, it is
       printed on standard output.

       When read reaches the end-of-file (EOF) instead  of  the  terminator,  the  exit  status  is  set  to  1.
       Otherwise, it is set to 0.

       If  read sets a variable and you don't specify a scope, it will use the same rules that set - display and
       change shell variables does - if the variable exists, it will  use  it  (in  the  lowest  scope).  If  it
       doesn't, it will use an unexported function-scoped variable.

       The  following  options, like the corresponding ones in set - display and change shell variables, control
       variable scope or attributes:

       -U or --universal
              Sets a universal variable.  The variable will be immediately available  to  all  the  user's  fish
              instances on the machine, and will be persisted across restarts of the shell.

       -f or --function
              Sets a variable scoped to the executing function.  It is erased when the function ends.

       -l or --local
              Sets  a  locally-scoped  variable  in this block.  It is erased when the block ends.  Outside of a
              block, this is the same as --function.

       -g or --global
              Sets a globally-scoped variable.  Global variables are available to all functions running  in  the
              same shell.  They can be modified or erased.

       -u or --unexport
              Prevents the variables from being exported to child processes (default behaviour).

       -x or --export
              Exports the variables to child processes.

       The following options control the interactive mode:

       -c CMD or --command CMD
              Sets the initial string in the interactive mode command buffer to CMD.

       -s or --silent
              Masks  characters  written  to  the  terminal,  replacing  them with asterisks. This is useful for
              reading things like passwords or other sensitive information.

       -p or --prompt PROMPT_CMD
              Uses the output of the shell command PROMPT_CMD as  the  prompt  for  the  interactive  mode.  The
              default prompt command is set_color green; echo -n read; set_color normal; echo -n "> "

       -P or --prompt-str PROMPT_STR
              Uses the literal PROMPT_STR as the prompt for the interactive mode.

       -R or --right-prompt RIGHT_PROMPT_CMD
              Uses  the  output  of  the  shell command RIGHT_PROMPT_CMD as the right prompt for the interactive
              mode. There is no default right prompt command.

       -S or --shell
              Enables syntax highlighting,  tab  completions  and  command  termination  suitable  for  entering
              shellscript  code  in the interactive mode. NOTE: Prior to fish 3.0, the short opt for --shell was
              -s, but it has been changed for compatibility with bash's -s short opt for --silent.

       The following options control how much is read and how it is stored:

       -d or --delimiter DELIMITER
              Splits on DELIMITER. DELIMITER will be used as an  entire  string  to  split  on,  not  a  set  of
              characters.

       -n or --nchars NCHARS
              Makes read return after reading NCHARS characters or the end of the line, whichever comes first.

       -t -or --tokenize
              Causes  read  to  split  the input into variables by the shell's tokenization rules. This means it
              will honor quotes and escaping. This option is  of  course  incompatible  with  other  options  to
              control  splitting  like  --delimiter and does not honor IFS (like fish's tokenizer). It saves the
              tokens in the manner they'd be passed to commands on the commandline, so e.g. a\ b is stored as  a
              b. Note that currently it leaves command substitutions intact along with the parentheses.

       -a or --list
              Stores  the  result  as  a list in a single variable. This option is also available as --array for
              backwards compatibility.

       -z or --null
              Marks the end of the line  with  the  NUL  character,  instead  of  newline.  This  also  disables
              interactive mode.

       -L or --line
              Reads  each  line  into  successive variables, and stops after each variable has been filled. This
              cannot be combined with the --delimiter option.

       Without the --line option, read reads a single line of input from standard input, breaks it into  tokens,
       and  then  assigns  one  token  to  each  variable  specified in VARIABLES. If there are more tokens than
       variables, the complete remainder is assigned to the last variable.

       If no option to determine how to split like --delimiter, --line or --tokenize is given, the variable  IFS
       is  used  as a list of characters to split on. Relying on the use of IFS is deprecated and this behaviour
       will be removed in future versions. The default value of IFS contains space, tab and newline  characters.
       As  a  special  case,  if  IFS  is  set  to the empty string, each character of the input is considered a
       separate token.

       With the --line option, read reads a line of input from  standard  input  into  each  provided  variable,
       stopping when each variable has been filled. The line is not tokenized.

       If  no  variable  names  are  provided,  read enters a special case that simply provides redirection from
       standard input to standard output, useful for command substitution. For instance, the fish shell  command
       below  can  be  used  to read a password from the console instead of hardcoding it in the command itself,
       which prevents it from showing up in fish's history:

          mysql -uuser -p(read)

       When running in this mode, read does not split the input in any way and text is  redirected  to  standard
       output without any further processing or manipulation.

       If  -l  or  --list  is provided, only one variable name is allowed and the tokens are stored as a list in
       this variable.

       In order to protect the shell from consuming too many system resources, read will only consume a  maximum
       of  100 MiB (104857600 bytes); if the terminator is not reached before this limit then VARIABLE is set to
       empty and the exit status is set to 122. This limit can be altered with the fish_read_limit variable.  If
       set to 0 (zero), the limit is removed.

   Example
       read has a few separate uses.

       The following code stores the value 'hello' in the shell variable foo.

          echo hello | read foo

       The while command is a neat way to handle command output line-by-line:

          printf '%s\n' line1 line2 line3 line4 | while read -l foo
                            echo "This is another line: $foo"
                        end

       Delimiters given via "-d" are taken as one string:

          echo a==b==c | read -d == -l a b c
          echo $a # a
          echo $b # b
          echo $c # c

       --tokenize honors quotes and escaping like the shell's argument passing:

          echo 'a\ b' | read -t first second
          echo $first # outputs "a b", $second is empty

          echo 'a"foo bar"b (command echo wurst)*" "{a,b}' | read -lt -l a b c
          echo $a # outputs 'afoo barb' (without the quotes)
          echo $b # outputs '(command echo wurst)* {a,b}' (without the quotes)
          echo $c # nothing

       For an example on interactive use, see Querying for user input.

   realpath - convert a path to an absolute path without symlinks
   Synopsis
       realpath [OPTIONS] PATH

   Description
       NOTE:  This page documents the fish builtin realpath.  To see the documentation on any non-fish versions,
       use command man realpath.

       realpath follows all symbolic links encountered  for  the  provided  PATH,  printing  the  absolute  path
       resolved.  fish  provides  a  realpath-alike  builtin intended to enrich systems where no such command is
       installed by default.

       If a realpath command exists, that will be preferred.  builtin realpath  will  explicitly  use  the  fish
       implementation of realpath.

       The following options are available:

       -s or --no-symlinks
              Don't  resolve  symlinks,  only  make  paths absolute, squash multiple slashes and remove trailing
              slashes.

       -h or --help
              Displays help about using this command.

   return - stop the current inner function
   Synopsis
       return [N]

   Description
       return halts a currently running function.  The exit status is set to N if it is  given.   If  return  is
       invoked outside of a function or dot script it is equivalent to exit.

       It  is  often  added  inside  of  a  conditional  block  such as an if statement or a switch statement to
       conditionally stop the executing function and return to the caller; it can also be used  to  specify  the
       exit status of a function.

       If  at  the  top level of a script, it exits with the given status, like exit.  If at the top level in an
       interactive session, it will set status, but not exit the shell.

       The -h or --help option displays help about using this command.

   Example
       An implementation of the false command as a fish function:

          function false
              return 1
          end

   set - display and change shell variables
   Synopsis
       set
       set (-f | --function) (-l | --local) (-g | --global) (-U | --universal) [--no-event]
       set [-Uflg] NAME [VALUE ...]
       set [-Uflg] NAME[[INDEX ...]] [VALUE ...]
       set (-x | --export) (-u | --unexport) [-Uflg] NAME [VALUE ...]
       set (-a | --append) (-p | --prepend) [-Uflg] NAME VALUE ...
       set (-q | --query) (-e | --erase) [-Uflg] [NAME][[INDEX]] ...]
       set (-S | --show) (-L | --long) [NAME ...]

   Description
       set manipulates shell variables.

       If both NAME and VALUE are provided, set assigns any values to variable  NAME.   Variables  in  fish  are
       lists,  multiple  values  are allowed.  One or more variable INDEX can be specified including ranges (not
       for all options.)

       If no VALUE is given, the variable will be set to the empty list.

       If set is ran without arguments, it prints the names and values of all shell variables in  sorted  order.
       Passing scope or export flags allows filtering this to only matching variables, so set --local would only
       show local variables.

       With  --erase  and  optionally a scope flag set will erase the matching variable (or the variable of that
       name in the smallest possible scope).

       With --show, set will describe the given variable names, explaining how they have been defined - in which
       scope with which values and options.

       The following options control variable scope:

       -U or --universal
              Sets a universal variable.  The variable will be immediately available  to  all  the  user's  fish
              instances on the machine, and will be persisted across restarts of the shell.

       -f or --function
              Sets a variable scoped to the executing function.  It is erased when the function ends.

       -l or --local
              Sets  a  locally-scoped  variable  in this block.  It is erased when the block ends.  Outside of a
              block, this is the same as --function.

       -g or --global
              Sets a globally-scoped variable.  Global variables are available to all functions running  in  the
              same shell.  They can be modified or erased.

       These options modify how variables operate:

       --export or -x
              Causes  the  specified shell variable to be exported to child processes (making it an "environment
              variable").

       --unexport or -u
              Causes the specified shell variable to NOT be exported to child processes.

       --path Treat specified variable as a path variable; variable will be split on  colons  (:)  and  will  be
              displayed joined by colons when quoted (echo "$PATH") or exported.

       --unpath
              Causes  variable to no longer be treated as a path variable.  Note: variables ending in "PATH" are
              automatically path variables.

       Further options:

       -a or --append NAME VALUE ...
              Appends VALUES to the current set of values for variable NAME.  Can be used with --prepend to both
              append and prepend at the same time.  This cannot be used when assigning to a variable slice.

       -p or --prepend NAME VALUE ...
              Prepends VALUES to the current set of values for variable NAME.  This can be used with --append to
              both append and prepend at the same time.  This cannot be used when assigning to a variable slice.

       -e or --erase NAME[INDEX]
              Causes the specified shell variables to be erased.  Supports erasing from multiple scopes at once.
              Individual items in a variable at INDEX in brackets can be specified.

       -q or --query NAME[INDEX]
              Test if the specified variable names are defined.  If an INDEX is provided,  check  for  items  at
              that  slot.   Does  not  output  anything,  but the shell status is set to the number of variables
              specified that were not defined, up to a maximum of 255.   If  no  variable  was  given,  it  also
              returns 255.

       -n or --names
              List  only  the  names  of all defined variables, not their value.  The names are guaranteed to be
              sorted.

       -S or --show
              Shows information about the given variables.  If no variable names are given  then  all  variables
              are  shown  in  sorted  order.  It shows the scopes the given variables are set in, along with the
              values in each and whether or not it is exported.  No other flags can be used with this option.

       --no-event
              Don't generate a variable change event when setting or erasing a  variable.   We  recommend  using
              this  carefully because the event handlers are usually set up for a reason.  Possible uses include
              modifying the variable inside a variable handler.

       -L or --long
              Do not abbreviate long values when printing set variables.

       -h or --help
              Displays help about using this command.

       If a variable is set to more than one value, the variable will be a list with the specified elements.  If
       a variable is set to zero elements, it will become a list with zero elements.

       If the variable name is one or more list elements,  such  as  PATH[1  3  7],  only  those  list  elements
       specified  will  be  changed.   If  you  specify  a  negative index when expanding or assigning to a list
       variable, the index will be calculated from the end of the list.  For example, the  index  -1  means  the
       last index of a list.

       The scoping rules when creating or updating a variable are:

       • Variables may be explicitly set as universal, global, function, or local.  Variables with the same name
         but in a different scope will not be changed.

       • If  the  scope  of  a  variable  is  not explicitly set but a variable by that name has been previously
         defined, the scope of the existing variable is used.  If the variable is already  defined  in  multiple
         scopes, the variable with the narrowest scope will be updated.

       • If  a  variable's  scope  is  not  explicitly  set  and there is no existing variable by that name, the
         variable will be local to the currently executing function.  Note that this is different from using the
         -l or --local flag, in which case the variable will be local  to  the  most-inner  currently  executing
         block,  while  without  them  the variable will be local to the function as a whole.  If no function is
         executing, the variable will be set in the global scope.

       The exporting rules when creating or  updating  a  variable  are  identical  to  the  scoping  rules  for
       variables:

       • Variables may be explicitly set to either exported or not exported.  When an exported variable goes out
         of scope, it is unexported.

       • If  a  variable  is not explicitly set to be exported or not exported, but has been previously defined,
         the previous exporting rule for the variable is kept.

       • If a variable is not explicitly set to be either exported or  unexported  and  has  never  before  been
         defined, the variable will not be exported.

       In query mode, the scope to be examined can be specified.  Whether the variable has to be a path variable
       or exported can also be specified.

       In  erase mode, if variable indices are specified, only the specified slices of the list variable will be
       erased.

       set requires all options to come before any other arguments.  For example, set flags  -l  will  have  the
       effect of setting the value of the variable flags to '-l', not making the variable local.

   Exit status
       In  assignment  mode,  set  does  not  modify  the exit status, but passes along whatever status was set,
       including by command substitutions.  This allows capturing the output and exit status  of  a  subcommand,
       like in if set output (command).

       In query mode, the exit status is the number of variables that were not found.

       In  erase  mode, set exits with a zero exit status in case of success, with a non-zero exit status if the
       commandline was invalid, if any of the variables did not exist or was a special read-only variable.

   Examples
       Print all global, exported variables:

          > set -gx

       Set the value of the variable _$foo_ to be 'hi'.:

          > set foo hi

       Append the value "there" to the variable $foo:

          > set -a foo there

       Remove _$smurf_ from the scope:

          > set -e smurf

       Remove _$smurf_ from the global and universal scopes:

          > set -e -Ug smurf

       Change the fourth element of the $PATH list to ~/bin:

          > set PATH[4] ~/bin

       Outputs the path to Python if type -p returns true:

          if set python_path (type -p python)
              echo "Python is at $python_path"
          end

       Setting a variable doesn't modify $status; a command substitution still will, though:

          > echo $status
          0
          > false
          > set foo bar
          > echo $status
          1
          > true
          > set foo banana (false)
          > echo $status
          1

       VAR=VALUE command sets a variable for just one command,  like  other  shells.   This  runs  fish  with  a
       temporary home directory:

          > HOME=(mktemp -d) fish

       (which is essentially the same as):

          > begin; set -lx HOME (mktemp -d); fish; end

   Notes
       • Fish  versions  prior to 3.0 supported the syntax set PATH[1] PATH[4] /bin /sbin, which worked like set
         PATH[1 4] /bin /sbin.

   set_color - set the terminal color
   Synopsis
       set_color [OPTIONS] VALUE

   Description
       set_color is used to control the color and styling of text in the terminal. VALUE describes that styling.
       VALUE can be a reserved color name like red or an RGB color value given as  3  or  6  hexadecimal  digits
       ("F27" or "FF2277"). A special keyword normal resets text formatting to terminal defaults.

       Valid colors include:

          • black, red, green, yellow, blue, magenta, cyan, whitebrblack, brred, brgreen, bryellow, brblue, brmagenta, brcyan, brwhite

       The  br-  (as in 'bright') forms are full-brightness variants of the 8 standard-brightness colors on many
       terminals. brblack has higher brightness than black - towards gray.

       An RGB value with three or six hex digits, such as A0FF33 or f2f  can  be  used.  Fish  will  choose  the
       closest  supported  color.  A  three  digit  value  is  equivalent  to specifying each digit twice; e.g.,
       set_color 2BC is the same as set_color 22BBCC. Hexadecimal RGB values  can  be  in  lower  or  uppercase.
       Depending on the capabilities of your terminal (and the level of support set_color has for it) the actual
       color may be approximated by a nearby matching reserved color name or set_color may not have an effect on
       color.

       A  second  color  may  be  given  as a desired fallback color. e.g. set_color 124212 brblue will instruct
       set_color to use brblue if a terminal is not capable of the exact shade of grey  desired.  This  is  very
       useful when an 8 or 16 color terminal might otherwise not use a color.

       The following options are available:

       -b or --background COLOR
              Sets the background color.

       -c or --print-colors
              Prints the given colors or a colored list of the 16 named colors.

       -o or --bold
              Sets bold mode.

       -d or --dim
              Sets dim mode.

       -i or --italics
              Sets italics mode.

       -r or --reverse
              Sets reverse mode.

       -u or --underline
              Sets underlined mode.

       -h or --help
              Displays help about using this command.

       Using the normal keyword will reset foreground, background, and all formatting back to default.

   Notes
       1. Using  the  normal keyword will reset both background and foreground colors to whatever is the default
          for the terminal.

       2. Setting the background color only affects subsequently written characters. Fish provides no way to set
          the background color for the entire terminal window. Configuring  the  window  background  color  (and
          other  attributes such as its opacity) has to be done using whatever mechanisms the terminal provides.
          Look for a config option.

       3. Some terminals use the --bold escape sequence to switch to a brighter color set rather than increasing
          the weight of text.

       4. set_color works  by  printing  sequences  of  characters  to  standard  output.  If  used  in  command
          substitution  or  a  pipe,  these  characters will also be captured. This may or may not be desirable.
          Checking the exit status of isatty stdout before using set_color  can  be  useful  to  decide  not  to
          colorize output in a script.

   Examples
          set_color red; echo "Roses are red"
          set_color blue; echo "Violets are blue"
          set_color 62A; echo "Eggplants are dark purple"
          set_color normal; echo "Normal is nice" # Resets the background too

   Terminal Capability Detection
       Fish uses some heuristics to determine what colors a terminal supports to avoid sending sequences that it
       won't understand.

       In particular it will:

       • Enable 256 colors if TERM contains "xterm", except for known exceptions (like MacOS 10.6 Terminal.app)

       • Enable  24-bit  ("true-color")  even  if  the $TERM entry only reports 256 colors. This includes modern
         xterm, VTE-based terminals like Gnome Terminal, Konsole and iTerm2.

       • Detect support for italics, dim, reverse and other modes.

       If terminfo reports 256 color support for a terminal, 256 color support will always be enabled.

       To force true-color support on or off, set fish_term24bit  to  "1"  for  on  and  0  for  off  -  set  -g
       fish_term24bit 1.

       To  debug color palette problems, tput colors may be useful to see the number of colors in terminfo for a
       terminal. Fish launched as fish -d term_support will include diagnostic messages that indicate the  color
       support mode in use.

       The  set_color  command  uses  the terminfo database to look up how to change terminal colors on whatever
       terminal is in use. Some systems have old and incomplete terminfo databases, and lack  color  information
       for   terminals   that   support   it.   Fish   assumes  that  all  terminals  can  use  the  ANSI  X3.64
       <https://en.wikipedia.org/wiki/ANSI_escape_code> escape sequences if the terminfo definition indicates  a
       color below 16 is not supported.

   source - evaluate contents of file
   Synopsis
       source FILE [ARGUMENTS ...]
       SOMECOMMAND | source
       . FILE [ARGUMENTS ...]

   Description
       source  evaluates the commands of the specified FILE in the current shell as a new block of code. This is
       different from starting a new process to perform the commands (i.e. fish < FILE) since the commands  will
       be  evaluated  by  the current shell, which means that changes in shell variables will affect the current
       shell. If additional arguments are specified after the file name, they will be  inserted  into  the  argv
       variable. The argv variable will not include the name of the sourced file.

       fish will search the working directory to resolve relative paths but will not search PATH .

       If  no  file is specified and a file or pipeline is connected to standard input, or if the file name - is
       used, source will read from standard input. If no file is specified and there is no  redirected  file  or
       pipeline on standard input, an error will be printed.

       The  exit  status  of source is the exit status of the last job to execute. If something goes wrong while
       opening or reading the file, source exits with a non-zero status.

       Some other shells only support the . alias (a single period).  The use of . is deprecated  in  favour  of
       source, and . will be removed in a future version of fish.

       source  creates  a  new  local scope; set --local within a sourced block will not affect variables in the
       enclosing scope.

       The -h or --help option displays help about using this command.

   Example
          source ~/.config/fish/config.fish
          # Causes fish to re-read its initialization file.

   Caveats
       In fish versions prior to 2.3.0, the argv variable would have a single element (the name of  the  sourced
       file)  if no arguments are present. Otherwise, it would contain arguments without the name of the sourced
       file. That behavior was very confusing and unlike other shells such as bash and zsh.

   status - query fish runtime information
   Synopsis
       status
       status is-login
       status is-interactive
       status is-interactive-read
       status is-block
       status is-breakpoint
       status is-command-substitution
       status is-no-job-control
       status is-full-job-control
       status is-interactive-job-control
       status current-command
       status current-commandline
       status filename
       status basename
       status dirname
       status fish-path
       status function
       status line-number
       status stack-trace
       status job-control CONTROL_TYPE
       status features
       status test-feature FEATURE
       status buildinfo

   Description
       With no arguments, status displays a summary of the current login and job control status of the shell.

       The following operations (subcommands) are available:

       is-command-substitution, -c or --is-command-substitution
              Returns 0 if fish is currently executing a command substitution.

       is-block, -b or --is-block
              Returns 0 if fish is currently executing a block of code.

       is-breakpoint
              Returns 0 if fish is currently showing a prompt in the context of a breakpoint command.  See  also
              the fish_breakpoint_prompt function.

       is-interactive, -i or --is-interactive
              Returns 0 if fish is interactive - that is, connected to a keyboard.

       is-interactive-read or --is-interactive-read
              Returns 0 if fish is running an interactive read builtin which is connected to a keyboard.

       is-login, -l or --is-login
              Returns  0  if fish is a login shell - that is, if fish should perform login tasks such as setting
              up PATH.

       is-full-job-control or --is-full-job-control
              Returns 0 if full job control is enabled.

       is-interactive-job-control or --is-interactive-job-control
              Returns 0 if interactive job control is enabled.

       is-no-job-control or --is-no-job-control
              Returns 0 if no job control is enabled.

       current-command
              Prints the name of the currently-running function or command, like the deprecated _ variable.

       current-commandline
              Prints the entirety of the currently-running commandline, inclusive of all jobs and operators.

       filename, current-filename, -f or --current-filename
              Prints the filename of the currently-running script. If  the  current  script  was  called  via  a
              symlink,  this  will return the symlink. If the current script was received by piping into source,
              then this will return -.

       basename
              Prints just the filename of the running script, without any path components before.

       dirname
              Prints just the path to the running script, without  the  actual  filename  itself.  This  can  be
              relative  to PWD (including just "."), depending on how the script was called. This is the same as
              passing the filename to dirname(3). It's useful if you want to use  other  files  in  the  current
              script's directory or similar.

       fish-path
              Prints  the  absolute  path  to  the  currently  executing instance of fish. This is a best-effort
              attempt and the exact output is down to what the platform gives fish. In some cases you might only
              get "fish".

       function or current-function
              Prints the name of the currently called function if able, when missing displays "Not  a  function"
              (or equivalent translated string).

       line-number, current-line-number, -n or --current-line-number
              Prints the line number of the currently running script.

       stack-trace, print-stack-trace, -t or --print-stack-trace
              Prints a stack trace of all function calls on the call stack.

       job-control, -j or --job-control CONTROL_TYPE
              Sets the job control type to CONTROL_TYPE, which can be none, full, or interactive.

       features
              Lists all available feature flags.

       test-feature FEATURE
              Returns 0 when FEATURE is enabled, 1 if it is disabled, and 2 if it is not recognized.

       buildinfo
              This  prints information on how fish was build - which architecture, which build system or profile
              was used, etc.  This is mainly useful for debugging.

   Notes
       For backwards compatibility most subcommands can also be  specified  as  a  long  or  short  option.  For
       example,  rather  than  status is-login you can type status --is-login. The flag forms are deprecated and
       may be removed in a future release (but not before fish 4.0).

       You can only specify one subcommand per invocation even if you use the flag form of the subcommand.

   string - manipulate strings
   Synopsis
       string collect [-a | --allow-empty] [-N | --no-trim-newlines] [STRING ...]
       string escape [-n | --no-quoted] [--style=] [STRING ...]
       string join [-q | --quiet] [-n | --no-empty] SEP [STRING ...]
       string join0 [-q | --quiet] [STRING ...]
       string length [-q | --quiet] [STRING ...]
       string lower [-q | --quiet] [STRING ...]
       string match [-a | --all] [-e | --entire] [-i | --ignore-case]
                    [-g | --groups-only] [-r | --regex] [-n | --index]
                    [-q | --quiet] [-v | --invert]
                    PATTERN [STRING ...]
       string pad [-r | --right] [(-c | --char) CHAR] [(-w | --width) INTEGER]
                  [STRING ...]
       string repeat [(-n | --count) COUNT] [(-m | --max) MAX] [-N | --no-newline]
                     [-q | --quiet] [STRING ...]
       string repeat [-N | --no-newline] [-q | --quiet] COUNT [STRING ...]
       string replace [-a | --all] [-f | --filter] [-i | --ignore-case]
                      [-r | --regex] [-q | --quiet] PATTERN REPLACE [STRING ...]
       string shorten [(-c | --char) CHARS] [(-m | --max) INTEGER]
                      [-N | --no-newline] [-l | --left] [-q | --quiet] [STRING ...]
       string split [(-f | --fields) FIELDS] [(-m | --max) MAX] [-n | --no-empty]
                    [-q | --quiet] [-r | --right] SEP [STRING ...]
       string split0 [(-f | --fields) FIELDS] [(-m | --max) MAX] [-n | --no-empty]
                     [-q | --quiet] [-r | --right] [STRING ...]
       string sub [(-s | --start) START] [(-e | --end) END] [(-l | --length) LENGTH]
                  [-q | --quiet] [STRING ...]
       string trim [-l | --left] [-r | --right] [(-c | --chars) CHARS]
                   [-q | --quiet] [STRING ...]
       string unescape [--style=] [STRING ...]
       string upper [-q | --quiet] [STRING ...]

   Description
       string performs operations on strings.

       STRING arguments are taken from the command line unless standard input is connected to a pipe or a  file,
       in  which  case  they  are read from standard input, one STRING per line. It is an error to supply STRING
       arguments on the command line and on standard input.

       Arguments beginning with - are normally interpreted as switches; -- causes the following arguments not to
       be treated as switches even if they begin with -. Switches and required arguments are recognized only  on
       the command line.

       Most  subcommands  accept  a  -q  or --quiet switch, which suppresses the usual output but exits with the
       documented status. In this case these commands will quit early, without  reading  all  of  the  available
       input.

       The following subcommands are available.

   "collect" subcommand
       string collect [-a | --allow-empty] [-N | --no-trim-newlines] [STRING ...]

       string  collect  collects its input into a single output argument, without splitting the output when used
       in a command substitution. This is useful when trying to collect multiline output  from  another  command
       into a variable. Exit status: 0 if any output argument is non-empty, or 1 otherwise.

       A  command  like  echo (cmd | string collect) is mostly equivalent to a quoted command substitution (echo
       "$(cmd)"). The main difference is that the former evaluates to zero or one elements  whereas  the  quoted
       command substitution always evaluates to one element due to string interpolation.

       If  invoked  with multiple arguments instead of input, string collect preserves each argument separately,
       where the number of output arguments is equal to the number of arguments given to string collect.

       Any  trailing  newlines  on  the  input  are  trimmed,  just   as   with   "$(cmd)"   substitution.   Use
       --no-trim-newlines  to  disable  this  behavior,  which  may be useful when running a command such as set
       contents (cat filename | string collect -N).

       With --allow-empty, string collect always prints one (empty) argument. This can be  used  to  prevent  an
       argument from disappearing.

   Examples
          >_ echo "zero $(echo one\ntwo\nthree) four"
          zero one
          two
          three four

          >_ echo \"(echo one\ntwo\nthree | string collect)\"
          "one
          two
          three"

          >_ echo \"(echo one\ntwo\nthree | string collect -N)\"
          "one
          two
          three
          "

          >_ echo foo(true | string collect --allow-empty)bar
          foobar

   "escape" and "unescape" subcommands
       string escape [-n | --no-quoted] [--style=] [STRING ...]
       string unescape [--style=] [STRING ...]

       string escape escapes each STRING in one of several ways.

       --style=script  (default)  alters  the  string  such  that  it  can be passed back to eval to produce the
       original argument again. By default, all special characters are escaped, and quotes are used to  simplify
       the  output when possible. If -n or --no-quoted is given, the simplifying quoted format is not used. Exit
       status: 0 if at least one string was escaped, or 1 otherwise.

       --style=var ensures the string can be used as a  variable  name  by  hex  encoding  any  non-alphanumeric
       characters. The string is first converted to UTF-8 before being encoded.

       --style=url ensures the string can be used as a URL by hex encoding any character which is not legal in a
       URL. The string is first converted to UTF-8 before being encoded.

       --style=regex escapes an input string for literal matching within a regex expression. The string is first
       converted to UTF-8 before being encoded.

       string  unescape  performs the inverse of the string escape command. If the string to be unescaped is not
       properly formatted it  is  ignored.  For  example,  doing  string  unescape  --style=var  (string  escape
       --style=var $str) will return the original string. There is no support for unescaping --style=regex.

   Examples
          >_ echo \x07 | string escape
          \cg

          >_ string escape --style=var 'a1 b2'\u6161
          a1_20_b2_E6_85_A1_

   "join" and "join0" subcommands
       string join [-q | --quiet] SEP [STRING ...]
       string join0 [-q | --quiet] [STRING ...]

       string  join  joins  its  STRING  arguments  into a single string separated by SEP, which can be an empty
       string. Exit status: 0 if at least one join was performed,  or  1  otherwise.  If  -n  or  --no-empty  is
       specified,  empty strings are excluded from consideration (e.g. string join -n + a b "" c would expand to
       a+b+c not a+b++c).

       string join0 joins its STRING arguments into a single string separated by the zero byte (NUL), and adds a
       trailing NUL. This is most useful in conjunction with tools that accept NUL-delimited input, such as sort
       -z. Exit status: 0 if at least one join was performed, or 1 otherwise.

       Because Unix uses NUL as the string terminator, passing the output of string join0 as an  argument  to  a
       command (via a command substitution) won't actually work. Fish will pass the correct bytes along, but the
       command won't be able to tell where the argument ends. This is a limitation of Unix' argument passing.

   Examples
          >_ seq 3 | string join ...
          1...2...3

          # Give a list of NUL-separated filenames to du (this is a GNU extension)
          >_ string join0 file1 file2 file\nwith\nmultiple\nlines | du --files0-from=-

          # Just put the strings together without a separator
          >_ string join '' a b c
          abc

   "length" subcommand
       string length [-q | --quiet] [-V | --visible] [STRING ...]

       string  length  reports  the length of each string argument in characters. Exit status: 0 if at least one
       non-empty STRING was given, or 1 otherwise.

       With -V or --visible, it uses the visible width of the arguments. That  means  it  will  discount  escape
       sequences  fish  knows about, account for $fish_emoji_width and $fish_ambiguous_width. It will also count
       each line (separated by \n) on its own, and with a carriage return (\r) count only the widest stretch  on
       a line. The intent is to measure the number of columns the STRING would occupy in the current terminal.

   Examples
          >_ string length 'hello, world'
          12

          >_ set str foo
          >_ string length -q $str; echo $status
          0
          # Equivalent to test -n "$str"

          >_ string length --visible (set_color red)foobar
          # the set_color is discounted, so this is the width of "foobar"
          6

          >_ string length --visible 🐟🐟🐟🐟
          # depending on $fish_emoji_width, this is either 4 or 8
          # in new terminals it should be
          8

          >_ string length --visible abcdef\r123
          # this displays as "123def", so the width is 6
          6

          >_ string length --visible a\nbc
          # counts "a" and "bc" as separate lines, so it prints width for each
          1
          2

   "lower" subcommand
       string lower [-q | --quiet] [STRING ...]

       string  lower  converts  each  string  argument  to  lowercase. Exit status: 0 if at least one string was
       converted to lowercase, else 1. This means that in conjunction with the -q  flag  you  can  readily  test
       whether a string is already lowercase.

   "match" subcommand
       string match [-a | --all] [-e | --entire] [-i | --ignore-case]
                    [-g | --groups-only] [-r | --regex] [-n | --index]
                    [-q | --quiet] [-v | --invert] [(-m | --max-matches) MAX]
                    PATTERN [STRING ...]

       string  match  tests each STRING against PATTERN and prints matching substrings. Only the first match for
       each STRING is reported unless -a or --all is given, in which case all matches are reported.

       If you specify the -e or --entire then each matching string is printed including any prefix or suffix not
       matched by the pattern (equivalent to grep without the -o flag). You can,  obviously,  achieve  the  same
       result  by  prepending  and  appending * or .* depending on whether or not you have specified the --regex
       flag. The --entire flag is simply a way to avoid having to complicate the pattern  in  that  fashion  and
       make  the  intent of the string match clearer. Without --entire and --regex, a PATTERN will need to match
       the entire STRING before it will be reported.

       Matching can be made case-insensitive with --ignore-case or -i.

       If --groups-only or -g is given, only the capturing groups will be reported - meaning the full match will
       be skipped. This is incompatible with --entire and --invert, and requires --regex.  It  is  useful  as  a
       simple cutting tool instead of string replace, so you can simply choose "this part" of a string.

       If  --index  or -n is given, each match is reported as a 1-based start position and a length. By default,
       PATTERN is interpreted as a glob pattern matched against each entire STRING argument. A glob  pattern  is
       only considered a valid match if it matches the entire STRING.

       If --regex or -r is given, PATTERN is interpreted as a Perl-compatible regular expression, which does not
       have  to  match  the  entire STRING. For a regular expression containing capturing groups, multiple items
       will be reported for each match, one for the entire match and one for each capturing  group.  With  this,
       only the matching part of the STRING will be reported, unless --entire is given.

       When  matching via regular expressions, string match automatically sets variables for all named capturing
       groups ((?<name>expression)). It will create a variable with the name of the group, in the default scope,
       for each named capturing group, and set it to the value of the  capturing  group  in  the  first  matched
       argument.  If a named capture group matched an empty string, the variable will be set to the empty string
       (like set var ""). If it did not match, the variable will be set to nothing (like set var).  When --regex
       is used with --all, this behavior changes. Each named variable will contain a list of matches,  with  the
       first  match  contained in the first element, the second match in the second, and so on. If the group was
       empty or did not match, the corresponding element will be an empty string.

       If --invert or -v is used the selected lines will be only those which do not match the given glob pattern
       or regular expression.

       If --max-matches MAX or -m MAX is used, string will stop checking for matches after MAX  lines  of  input
       have  matched. This can be used as an "early exit" optimization when processing long inputs but expecting
       a limited and fixed number of outputs that might be found considerably before the input stream  has  been
       exhausted. If combined with --invert or -v, considers only inverted matches.

       Exit status: 0 if at least one match was found, or 1 otherwise.

   Match Glob Examples
          >_ string match 'a' a
          a

          >_ string match 'a*b' axxb
          axxb

          >_ string match -i 'a*B' Axxb
          Axxb

          >_ string match -- '-*' -h foo --version bar
          # To match things that look like options, we need a `--`
          # to tell string its options end there.
          -h
          --version

          >_ echo 'ok?' | string match '*?'
          ok?

          # Note that only the second STRING will match here.
          >_ string match 'foo' 'foo1' 'foo' 'foo2'
          foo

          >_ string match -e 'foo' 'foo1' 'foo' 'foo2'
          foo1
          foo
          foo2

          >_ string match 'foo*' 'foo1' 'foo' 'foo2'
          foo1
          foo2

   Match Regex Examples
          >_ string match -r 'cat|dog|fish' 'nice dog'
          dog

          >_ string match -r -v "c.*[12]" {cat,dog}(seq 1 4)
          dog1
          dog2
          cat3
          dog3
          cat4
          dog4

          >_ string match -r -- '-.*' -h foo --version bar
          # To match things that look like options, we need a `--`
          # to tell string its options end there.
          -h
          --version

          >_ string match -r '(\d\d?):(\d\d):(\d\d)' 2:34:56
          2:34:56
          2
          34
          56

          >_ string match -r '^(\w{2,4})\1$' papa mud murmur
          papa
          pa
          murmur
          mur

          >_ string match -r -a -n at ratatat
          2 2
          4 2
          6 2

          >_ string match -r -i '0x[0-9a-f]{1,8}' 'int magic = 0xBadC0de;'
          0xBadC0de

          >_ echo $version
          3.1.2-1575-ga2ff32d90
          >_ string match -rq '(?<major>\d+).(?<minor>\d+).(?<revision>\d+)' -- $version
          >_ echo "You are using fish $major!"
          You are using fish 3!

          >_ string match -raq ' *(?<sentence>[^.!?]+)(?<punctuation>[.!?])?' "hello, friend. goodbye"
          >_ printf "%s\n" -- $sentence
          hello, friend
          goodbye
          >_ printf "%s\n" -- $punctuation
          .

          >_ string match -rq '(?<word>hello)' 'hi'
          >_ count $word
          0

   "pad" subcommand
       string pad [-r | --right] [(-c | --char) CHAR] [(-w | --width) INTEGER]
                  [STRING ...]

       string  pad  extends  each  STRING  to the given visible width by adding CHAR to the left. That means the
       width  of  all  visible  characters  added  together,  excluding  escape  sequences  and  accounting  for
       fish_emoji_width and fish_ambiguous_width. It is the amount of columns in a terminal the STRING occupies.

       The  escape  sequences reflect what fish knows about, and how it computes its output. Your terminal might
       support more escapes, or not support escape sequences that fish knows about.

       If -r or --right is given, add the padding after a string.

       If -c or --char is given, pad with CHAR instead of whitespace.

       The output is padded to the maximum width of all input strings. If -w or --width is given, use  at  least
       that.

   Examples
          >_ string pad -w 10 abc abcdef
                 abc
              abcdef

          >_ string pad --right --char=🐟 "fish are pretty" "rich. "
          fish are pretty
          rich.  🐟🐟🐟🐟

          >_ string pad -w$COLUMNS (date)
          # Prints the current time on the right edge of the screen.

   See also
       • The printf command can do simple padding, for example printf %10s\n works like string pad -w10.

       • string length with the --visible option can be used to show what fish thinks the width is.

   "shorten" subcommand
       string shorten [(-c | --char) CHARS] [(-m | --max) INTEGER]
                      [-N | --no-newline] [-l | --left] [-q | --quiet] [STRING ...]

       string  shorten  truncates  each  STRING  to the given visible width and adds an ellipsis to indicate it.
       "Visible width" means the width of all visible characters added together, excluding escape sequences  and
       accounting  for  fish_emoji_width and fish_ambiguous_width. It is the amount of columns in a terminal the
       STRING occupies.

       The escape sequences reflect what fish knows about, and how it computes its output. Your  terminal  might
       support more escapes, or not support escape sequences that fish knows about.

       If  -m  or --max is given, truncate at the given width. Otherwise, the lowest non-zero width of all input
       strings is used. A max of 0 means no shortening takes place, all STRINGs are printed as-is.

       If -N or --no-newline is given, only the first line (or last line with --left) of each  STRING  is  used,
       and  an  ellipsis  is  added  if  it was multiline. This only works for STRINGs being given as arguments,
       multiple lines given on stdin will be interpreted as separate STRINGs instead.

       If -c or --char is given, add CHAR instead of an ellipsis. This can  also  be  empty  or  more  than  one
       character.

       If  -l or --left is given, remove text from the left on instead, so this prints the longest suffix of the
       string that fits. With --no-newline, this will take from the last line instead of the first.

       If -q or --quiet is given, string shorten only  runs  for  the  return  value  -  if  anything  would  be
       shortened, it returns 0, else 1.

       The  default  ellipsis  is . If fish thinks your system is incapable because of your locale, it will use
       ... instead.

       The return value is 0 if any shortening occurred, 1 otherwise.

   Examples
          >_ string shorten foo foobar
          # No width was given, we infer, and "foo" is the shortest.
          foo
          fo…

          >_ string shorten --char="..." foo foobar
          # The target width is 3 because of "foo",
          # and our ellipsis is 3 too, so we can't really show anything.
          # This is the default ellipsis if your locale doesn't allow "…".
          foo
          ...

          >_ string shorten --char="" --max 4 abcdef 123456
          # Leaving the char empty makes us not add an ellipsis
          # So this truncates at 4 columns:
          abcd
          1234

          >_ touch "a multiline"\n"file"
          >_ for file in *; string shorten -N -- $file; end
          # Shorten the multiline file so we only show one line per file:
          a multiline…

          >_ ss -p | string shorten -m$COLUMNS -c ""
          # `ss` from Linux' iproute2 shows socket information, but prints extremely long lines.
          # This shortens input so it fits on the screen without overflowing lines.

          >_ git branch | string match -rg '^\* (.*)' | string shorten -m20
          # Take the current git branch and shorten it at 20 columns.
          # Here the branch is "builtin-path-with-expand"
          builtin-path-with-e…

          >_ git branch | string match -rg '^\* (.*)' | string shorten -m20 --left
          # Taking 20 columns from the right instead:
          …in-path-with-expand

   See alsostring's pad subcommand does the inverse of this command, adding padding to a specific width instead.

       • The printf command can do simple padding, for example printf %10s\n works like string pad -w10.

       • string length with the --visible option can be used to show what fish thinks the width is.

   "repeat" subcommand
       string repeat [(-n | --count) COUNT] [(-m | --max) MAX] [-N | --no-newline]
                     [-q | --quiet] [STRING ...]
       string repeat [-N | --no-newline] [-q | --quiet] COUNT [STRING ...]

       string repeat repeats the STRING -n or --count times. The -m or --max option will  limit  the  number  of
       outputted  characters  (excluding  the newline). This option can be used by itself or in conjunction with
       --count. If both --count and --max are present, max char will be  outputted  unless  the  final  repeated
       string  size  is  less  than max, in that case, the string will repeat until count has been reached. Both
       --count and --max will accept a number greater than or equal to zero, in the case of zero,  nothing  will
       be  outputted.  The  first  argument  is  interpreted  as  COUNT  if  --count or --max are not explicitly
       specified. If -N or --no-newline is given, the output won't contain a newline character at the end.  Exit
       status: 0 if yielded string is not empty, 1 otherwise.

   Examples
   Repeat Examples
          >_ string repeat -n 2 'foo '
          foo foo

          >_ echo foo | string repeat -n 2
          foofoo

          >_ string repeat -n 2 -m 5 'foo'
          foofo

          >_ string repeat -m 5 'foo'
          foofo

          >_ string repeat 2 'foo'
          foofoo

          >_ string repeat 2 -n 3
          222

   "replace" subcommand
       string replace [-a | --all] [-f | --filter] [-i | --ignore-case]
                      [-r | --regex] [(-m | --max-matches) MAX] [-q | --quiet]
                      PATTERN REPLACEMENT [STRING ...]

       string  replace  is  similar  to  string  match  but  replaces non-overlapping matching substrings with a
       replacement string and prints the result. By default, PATTERN is treated as a  literal  substring  to  be
       matched.

       If  -r  or  --regex  is  given,  PATTERN  is  interpreted  as  a  Perl-compatible regular expression, and
       REPLACEMENT can contain C-style escape sequences like t as well as  references  to  capturing  groups  by
       number or name as $n or ${n}.

       If  you specify the -f or --filter flag then each input string is printed only if a replacement was done.
       This is useful where you would otherwise use this idiom: a_cmd | string match pattern  |  string  replace
       pattern new_pattern. You can instead just write a_cmd | string replace --filter pattern new_pattern.

       If  --max-matches MAX or -m MAX is used, string replace will stop all processing after MAX lines of input
       have matched the specified pattern. In the event of --filter or -f, this means the  output  will  be  MAX
       lines  in  length.  This  can  be  used  as  an "early exit" optimization when processing long inputs but
       expecting a limited and fixed number of outputs that might be found considerably before the input  stream
       has been exhausted.

       Exit status: 0 if at least one replacement was performed, or 1 otherwise.

   Replace Literal Examples
          >_ string replace is was 'blue is my favorite'
          blue was my favorite

          >_ string replace 3rd last 1st 2nd 3rd
          1st
          2nd
          last

          >_ string replace -a ' ' _ 'spaces to underscores'
          spaces_to_underscores

   Replace Regex Examples
          >_ string replace -r -a '[^\d.]+' ' ' '0 one two 3.14 four 5x'
          0 3.14 5

          >_ string replace -r '(\w+)\s+(\w+)' '$2 $1 $$' 'left right'
          right left $

          >_ string replace -r '\s*newline\s*' '\n' 'put a newline here'
          put a
          here

   "split" and "split0" subcommands
       string split [(-f | --fields) FIELDS] [(-m | --max) MAX] [-n | --no-empty]
                    [-q | --quiet] [-r | --right] SEP [STRING ...]
       string split0 [(-f | --fields) FIELDS] [(-m | --max) MAX] [-n | --no-empty]
                     [-q | --quiet] [-r | --right] [STRING ...]

       string  split  splits  each  STRING on the separator SEP, which can be an empty string. If -m or --max is
       specified, at most MAX splits are done on each STRING. If -r or --right is given, splitting is  performed
       right-to-left.  This  is useful in combination with -m or --max. With -n or --no-empty, empty results are
       excluded from consideration (e.g. hello\n\nworld would expand to two strings and not three). Exit status:
       0 if at least one split was performed, or 1 otherwise.

       Use -f or --fields to print out specific fields. FIELDS is a  comma-separated  string  of  field  numbers
       and/or spans. Each field is one-indexed, and will be printed on separate lines. If a given field does not
       exist, then the command exits with status 1 and does not print anything, unless --allow-empty is used.

       See also the --delimiter option of the read command.

       string split0 splits each STRING on the zero byte (NUL). Options are the same as string split except that
       no separator is given.

       split0  has  the  important  property  that  its  output  is  not  further  split  when used in a command
       substitution, allowing for the command substitution to produce elements containing newlines. This is most
       useful when used with Unix tools that produce zero bytes, such as find -print0 or  sort  -z.  See  split0
       examples below.

   Examples
          >_ string split . example.com
          example
          com

          >_ string split -r -m1 / /usr/local/bin/fish
          /usr/local/bin
          fish

          >_ string split '' abc
          a
          b
          c

          >_ string split --allow-empty -f1,3-4,5 '' abcd
          a
          c
          d

   NUL Delimited Examples
          >_ # Count files in a directory, without being confused by newlines.
          >_ count (find . -print0 | string split0)
          42

          >_ # Sort a list of elements which may contain newlines
          >_ set foo beta alpha\ngamma
          >_ set foo (string join0 $foo | sort -z | string split0)
          >_ string escape $foo[1]
          alpha\ngamma

   "sub" subcommand
       string sub [(-s | --start) START] [(-e | --end) END] [(-l | --length) LENGTH]
                  [-q | --quiet] [STRING ...]

       string  sub  prints  a substring of each string argument. The start/end of the substring can be specified
       with -s/-e or --start/--end followed by a 1-based index value. Positive index values are relative to  the
       start  of  the  string and negative index values are relative to the end of the string. The default start
       value is 1. The length of the substring can be specified with -l or --length. If the length or end is not
       specified, the substring continues to the end of each STRING. Exit status: 0 if at  least  one  substring
       operation was performed, 1 otherwise. --length is mutually exclusive with --end.

   Examples
          >_ string sub --length 2 abcde
          ab

          >_ string sub -s 2 -l 2 abcde
          bc

          >_ string sub --start=-2 abcde
          de

          >_ string sub --end=3 abcde
          abc

          >_ string sub -e -1 abcde
          abcd

          >_ string sub -s 2 -e -1 abcde
          bcd

          >_ string sub -s -3 -e -2 abcde
          c

   "trim" subcommand
       string trim [-l | --left] [-r | --right] [(-c | --chars) CHARS]
                   [-q | --quiet] [STRING ...]

       string  trim  removes  leading  and  trailing whitespace from each STRING. If -l or --left is given, only
       leading whitespace is removed. If -r or --right is given, only trailing whitespace is trimmed.

       The -c or --chars switch causes the set of characters in CHARS to be removed instead of whitespace.  This
       is  a set of characters, not a string - if you pass -c foo, it will remove any "f" or "o", not just "foo"
       as a whole.

       Exit status: 0 if at least one character was trimmed, or 1 otherwise.

   Examples
          >_ string trim ' abc  '
          abc

          >_ string trim --right --chars=yz xyzzy zany
          x
          zan

   "upper" subcommand
       string upper [-q | --quiet] [STRING ...]

       string upper converts each string argument to uppercase. Exit status:  0  if  at  least  one  string  was
       converted  to  uppercase,  else  1.  This means that in conjunction with the -q flag you can readily test
       whether a string is already uppercase.

   Regular Expressions
       Both the match and replace subcommand support regular expressions  when  used  with  the  -r  or  --regex
       option. The dialect is that of PCRE2.

       In  general, special characters are special by default, so a+ matches one or more "a"s, while a\+ matches
       an "a" and then a "+". (a+)  matches  one  or  more  "a"s  in  a  capturing  group  ((?:XXXX)  denotes  a
       non-capturing group). For the replacement parameter of replace, $n refers to the n-th group of the match.
       In the match parameter, \n (e.g. \1) refers back to groups.

       Some features include repetitions:

       • * refers to 0 or more repetitions of the previous expression

       • + 1 or more

       • ? 0 or 1.

       • {n} to exactly n (where n is a number)

       • {n,m} at least n, no more than m.

       • {n,} n or more

       Character classes, some of the more important:

       • . any character except newline

       • \d a decimal digit and \D, not a decimal digit

       • \s whitespace and \S, not whitespace

       • \w a "word" character and \W, a "non-word" character

       • [...] (where "..." is some characters) is a character set

       • [^...] is the inverse of the given character set

       • [x-y] is the range of characters from x-y

       • [[:xxx:]] is a named character set

       • [[:^xxx:]] is the inverse of a named character set

       • [[:alnum:]]  : "alphanumeric"

       • [[:alpha:]]  : "alphabetic"

       • [[:ascii:]]  : "0-127"

       • [[:blank:]]  : "space or tab"

       • [[:cntrl:]]  : "control character"

       • [[:digit:]]  : "decimal digit"

       • [[:graph:]]  : "printing, excluding space"

       • [[:lower:]]  : "lower case letter"

       • [[:print:]]  : "printing, including space"

       • [[:punct:]]  : "printing, excluding alphanumeric"

       • [[:space:]]  : "white space"

       • [[:upper:]]  : "upper case letter"

       • [[:word:]]   : "same as w"

       • [[:xdigit:]] : "hexadecimal digit"

       Groups:

       • (...) is a capturing group

       • (?:...) is a non-capturing group

       • \n is a backreference (where n is the number of the group, starting with 1)

       • $n is a reference from the replacement expression to a group in the match expression.

       And some other things:

       • \b denotes a word boundary, \B is not a word boundary.

       • ^ is the start of the string or line, $ the end.

       • | is "alternation", i.e. the "or".

   Comparison to other tools
       Most  operations  string supports can also be done by external tools. Some of these include grep, sed and
       cut.

       If you are familiar with these, it is useful to know how string differs from them.

       In contrast to these classics, string reads input either from stdin or as arguments. string also does not
       deal with files, so it requires redirections to be used with them.

       In contrast to grep, string's match defaults to glob-mode, while replace defaults to literal matching. If
       set to regex-mode, they use PCRE regular expressions, which is comparable  to  grep's  -P  option.  match
       defaults  to  printing  just  the  match,  which  is  like grep with -o (use --entire to enable grep-like
       behavior).

       Like sed's s/old/new/ command, string replace  still  prints  strings  that  don't  match.  sed's  -n  in
       combination with a /p modifier or command is like string replace -f.

       string split somedelimiter is a replacement for tr somedelimiter \n.

   string-collect - join strings into one
   Synopsis
       string collect [-a | --allow-empty] [-N | --no-trim-newlines] [STRING ...]

   Description
       string  collect  collects its input into a single output argument, without splitting the output when used
       in a command substitution. This is useful when trying to collect multiline output  from  another  command
       into a variable. Exit status: 0 if any output argument is non-empty, or 1 otherwise.

       A  command  like  echo (cmd | string collect) is mostly equivalent to a quoted command substitution (echo
       "$(cmd)"). The main difference is that the former evaluates to zero or one elements  whereas  the  quoted
       command substitution always evaluates to one element due to string interpolation.

       If  invoked  with multiple arguments instead of input, string collect preserves each argument separately,
       where the number of output arguments is equal to the number of arguments given to string collect.

       Any  trailing  newlines  on  the  input  are  trimmed,  just   as   with   "$(cmd)"   substitution.   Use
       --no-trim-newlines  to  disable  this  behavior,  which  may be useful when running a command such as set
       contents (cat filename | string collect -N).

       With --allow-empty, string collect always prints one (empty) argument. This can be  used  to  prevent  an
       argument from disappearing.

   Examples
          >_ echo "zero $(echo one\ntwo\nthree) four"
          zero one
          two
          three four

          >_ echo \"(echo one\ntwo\nthree | string collect)\"
          "one
          two
          three"

          >_ echo \"(echo one\ntwo\nthree | string collect -N)\"
          "one
          two
          three
          "

          >_ echo foo(true | string collect --allow-empty)bar
          foobar

   string-escape - escape special characters
   Synopsis
       string escape [-n | --no-quoted] [--style=] [STRING ...]
       string unescape [--style=] [STRING ...]

   Description
       string escape escapes each STRING in one of several ways.

       --style=script  (default)  alters  the  string  such  that  it  can be passed back to eval to produce the
       original argument again. By default, all special characters are escaped, and quotes are used to  simplify
       the  output when possible. If -n or --no-quoted is given, the simplifying quoted format is not used. Exit
       status: 0 if at least one string was escaped, or 1 otherwise.

       --style=var ensures the string can be used as a  variable  name  by  hex  encoding  any  non-alphanumeric
       characters. The string is first converted to UTF-8 before being encoded.

       --style=url ensures the string can be used as a URL by hex encoding any character which is not legal in a
       URL. The string is first converted to UTF-8 before being encoded.

       --style=regex escapes an input string for literal matching within a regex expression. The string is first
       converted to UTF-8 before being encoded.

       string  unescape  performs the inverse of the string escape command. If the string to be unescaped is not
       properly formatted it  is  ignored.  For  example,  doing  string  unescape  --style=var  (string  escape
       --style=var $str) will return the original string. There is no support for unescaping --style=regex.

   Examples
          >_ echo \x07 | string escape
          \cg

          >_ string escape --style=var 'a1 b2'\u6161
          a1_20_b2_E6_85_A1_

   string-join - join strings with delimiter
   Synopsis
       string join [-q | --quiet] SEP [STRING ...]
       string join0 [-q | --quiet] [STRING ...]

   Description
       string  join  joins  its  STRING  arguments  into a single string separated by SEP, which can be an empty
       string. Exit status: 0 if at least one join was performed,  or  1  otherwise.  If  -n  or  --no-empty  is
       specified,  empty strings are excluded from consideration (e.g. string join -n + a b "" c would expand to
       a+b+c not a+b++c).

       string join0 joins its STRING arguments into a single string separated by the zero byte (NUL), and adds a
       trailing NUL. This is most useful in conjunction with tools that accept NUL-delimited input, such as sort
       -z. Exit status: 0 if at least one join was performed, or 1 otherwise.

       Because Unix uses NUL as the string terminator, passing the output of string join0 as an  argument  to  a
       command (via a command substitution) won't actually work. Fish will pass the correct bytes along, but the
       command won't be able to tell where the argument ends. This is a limitation of Unix' argument passing.

   Examples
          >_ seq 3 | string join ...
          1...2...3

          # Give a list of NUL-separated filenames to du (this is a GNU extension)
          >_ string join0 file1 file2 file\nwith\nmultiple\nlines | du --files0-from=-

          # Just put the strings together without a separator
          >_ string join '' a b c
          abc

   string-join0 - join strings with zero bytes
   Synopsis
       string join [-q | --quiet] SEP [STRING ...]
       string join0 [-q | --quiet] [STRING ...]

   Description
       string  join  joins  its  STRING  arguments  into a single string separated by SEP, which can be an empty
       string. Exit status: 0 if at least one join was performed,  or  1  otherwise.  If  -n  or  --no-empty  is
       specified,  empty strings are excluded from consideration (e.g. string join -n + a b "" c would expand to
       a+b+c not a+b++c).

       string join0 joins its STRING arguments into a single string separated by the zero byte (NUL), and adds a
       trailing NUL. This is most useful in conjunction with tools that accept NUL-delimited input, such as sort
       -z. Exit status: 0 if at least one join was performed, or 1 otherwise.

       Because Unix uses NUL as the string terminator, passing the output of string join0 as an  argument  to  a
       command (via a command substitution) won't actually work. Fish will pass the correct bytes along, but the
       command won't be able to tell where the argument ends. This is a limitation of Unix' argument passing.

   Examples
          >_ seq 3 | string join ...
          1...2...3

          # Give a list of NUL-separated filenames to du (this is a GNU extension)
          >_ string join0 file1 file2 file\nwith\nmultiple\nlines | du --files0-from=-

          # Just put the strings together without a separator
          >_ string join '' a b c
          abc

   string-length - print string lengths
   Synopsis
       string length [-q | --quiet] [-V | --visible] [STRING ...]

   Description
       string  length  reports  the length of each string argument in characters. Exit status: 0 if at least one
       non-empty STRING was given, or 1 otherwise.

       With -V or --visible, it uses the visible width of the arguments. That  means  it  will  discount  escape
       sequences  fish  knows about, account for $fish_emoji_width and $fish_ambiguous_width. It will also count
       each line (separated by \n) on its own, and with a carriage return (\r) count only the widest stretch  on
       a line. The intent is to measure the number of columns the STRING would occupy in the current terminal.

   Examples
          >_ string length 'hello, world'
          12

          >_ set str foo
          >_ string length -q $str; echo $status
          0
          # Equivalent to test -n "$str"

          >_ string length --visible (set_color red)foobar
          # the set_color is discounted, so this is the width of "foobar"
          6

          >_ string length --visible 🐟🐟🐟🐟
          # depending on $fish_emoji_width, this is either 4 or 8
          # in new terminals it should be
          8

          >_ string length --visible abcdef\r123
          # this displays as "123def", so the width is 6
          6

          >_ string length --visible a\nbc
          # counts "a" and "bc" as separate lines, so it prints width for each
          1
          2

   string-lower - convert strings to lowercase
   Synopsis
       string lower [-q | --quiet] [STRING ...]

   Description
       string  lower  converts  each  string  argument  to  lowercase. Exit status: 0 if at least one string was
       converted to lowercase, else 1. This means that in conjunction with the -q  flag  you  can  readily  test
       whether a string is already lowercase.

   string-match - match substrings
   Synopsis
       string match [-a | --all] [-e | --entire] [-i | --ignore-case]
                    [-g | --groups-only] [-r | --regex] [-n | --index]
                    [-q | --quiet] [-v | --invert] [(-m | --max-matches) MAX]
                    PATTERN [STRING ...]

   Description
       string  match  tests each STRING against PATTERN and prints matching substrings. Only the first match for
       each STRING is reported unless -a or --all is given, in which case all matches are reported.

       If you specify the -e or --entire then each matching string is printed including any prefix or suffix not
       matched by the pattern (equivalent to grep without the -o flag). You can,  obviously,  achieve  the  same
       result  by  prepending  and  appending * or .* depending on whether or not you have specified the --regex
       flag. The --entire flag is simply a way to avoid having to complicate the pattern  in  that  fashion  and
       make  the  intent of the string match clearer. Without --entire and --regex, a PATTERN will need to match
       the entire STRING before it will be reported.

       Matching can be made case-insensitive with --ignore-case or -i.

       If --groups-only or -g is given, only the capturing groups will be reported - meaning the full match will
       be skipped. This is incompatible with --entire and --invert, and requires --regex.  It  is  useful  as  a
       simple cutting tool instead of string replace, so you can simply choose "this part" of a string.

       If  --index  or -n is given, each match is reported as a 1-based start position and a length. By default,
       PATTERN is interpreted as a glob pattern matched against each entire STRING argument. A glob  pattern  is
       only considered a valid match if it matches the entire STRING.

       If --regex or -r is given, PATTERN is interpreted as a Perl-compatible regular expression, which does not
       have  to  match  the  entire STRING. For a regular expression containing capturing groups, multiple items
       will be reported for each match, one for the entire match and one for each capturing  group.  With  this,
       only the matching part of the STRING will be reported, unless --entire is given.

       When  matching via regular expressions, string match automatically sets variables for all named capturing
       groups ((?<name>expression)). It will create a variable with the name of the group, in the default scope,
       for each named capturing group, and set it to the value of the  capturing  group  in  the  first  matched
       argument.  If a named capture group matched an empty string, the variable will be set to the empty string
       (like set var ""). If it did not match, the variable will be set to nothing (like set var).  When --regex
       is used with --all, this behavior changes. Each named variable will contain a list of matches,  with  the
       first  match  contained in the first element, the second match in the second, and so on. If the group was
       empty or did not match, the corresponding element will be an empty string.

       If --invert or -v is used the selected lines will be only those which do not match the given glob pattern
       or regular expression.

       If --max-matches MAX or -m MAX is used, string will stop checking for matches after MAX  lines  of  input
       have  matched. This can be used as an "early exit" optimization when processing long inputs but expecting
       a limited and fixed number of outputs that might be found considerably before the input stream  has  been
       exhausted. If combined with --invert or -v, considers only inverted matches.

       Exit status: 0 if at least one match was found, or 1 otherwise.

   Examples
   Match Glob Examples
          >_ string match 'a' a
          a

          >_ string match 'a*b' axxb
          axxb

          >_ string match -i 'a*B' Axxb
          Axxb

          >_ string match -- '-*' -h foo --version bar
          # To match things that look like options, we need a `--`
          # to tell string its options end there.
          -h
          --version

          >_ echo 'ok?' | string match '*?'
          ok?

          # Note that only the second STRING will match here.
          >_ string match 'foo' 'foo1' 'foo' 'foo2'
          foo

          >_ string match -e 'foo' 'foo1' 'foo' 'foo2'
          foo1
          foo
          foo2

          >_ string match 'foo*' 'foo1' 'foo' 'foo2'
          foo1
          foo2

   Match Regex Examples
          >_ string match -r 'cat|dog|fish' 'nice dog'
          dog

          >_ string match -r -v "c.*[12]" {cat,dog}(seq 1 4)
          dog1
          dog2
          cat3
          dog3
          cat4
          dog4

          >_ string match -r -- '-.*' -h foo --version bar
          # To match things that look like options, we need a `--`
          # to tell string its options end there.
          -h
          --version

          >_ string match -r '(\d\d?):(\d\d):(\d\d)' 2:34:56
          2:34:56
          2
          34
          56

          >_ string match -r '^(\w{2,4})\1$' papa mud murmur
          papa
          pa
          murmur
          mur

          >_ string match -r -a -n at ratatat
          2 2
          4 2
          6 2

          >_ string match -r -i '0x[0-9a-f]{1,8}' 'int magic = 0xBadC0de;'
          0xBadC0de

          >_ echo $version
          3.1.2-1575-ga2ff32d90
          >_ string match -rq '(?<major>\d+).(?<minor>\d+).(?<revision>\d+)' -- $version
          >_ echo "You are using fish $major!"
          You are using fish 3!

          >_ string match -raq ' *(?<sentence>[^.!?]+)(?<punctuation>[.!?])?' "hello, friend. goodbye"
          >_ printf "%s\n" -- $sentence
          hello, friend
          goodbye
          >_ printf "%s\n" -- $punctuation
          .

          >_ string match -rq '(?<word>hello)' 'hi'
          >_ count $word
          0

   string-pad - pad strings to a fixed width
   Synopsis
       string pad [-r | --right] [(-c | --char) CHAR] [(-w | --width) INTEGER]
                  [STRING ...]

   Description
       string  pad  extends  each  STRING  to the given visible width by adding CHAR to the left. That means the
       width  of  all  visible  characters  added  together,  excluding  escape  sequences  and  accounting  for
       fish_emoji_width and fish_ambiguous_width. It is the amount of columns in a terminal the STRING occupies.

       The  escape  sequences reflect what fish knows about, and how it computes its output. Your terminal might
       support more escapes, or not support escape sequences that fish knows about.

       If -r or --right is given, add the padding after a string.

       If -c or --char is given, pad with CHAR instead of whitespace.

       The output is padded to the maximum width of all input strings. If -w or --width is given, use  at  least
       that.

   Examples
          >_ string pad -w 10 abc abcdef
                 abc
              abcdef

          >_ string pad --right --char=🐟 "fish are pretty" "rich. "
          fish are pretty
          rich.  🐟🐟🐟🐟

          >_ string pad -w$COLUMNS (date)
          # Prints the current time on the right edge of the screen.

   See Also
       • The printf command can do simple padding, for example printf %10s\n works like string pad -w10.

       • string length with the --visible option can be used to show what fish thinks the width is.

   string-repeat - multiply a string
   Synopsis
       string repeat [(-n | --count) COUNT] [(-m | --max) MAX] [-N | --no-newline]
                     [-q | --quiet] [STRING ...]
       string repeat [-N | --no-newline] [-q | --quiet] COUNT [STRING ...]

   Description
       string  repeat  repeats  the  STRING -n or --count times. The -m or --max option will limit the number of
       outputted characters (excluding the newline). This option can be used by itself or  in  conjunction  with
       --count.  If  both  --count  and  --max are present, max char will be outputted unless the final repeated
       string size is less than max, in that case, the string will repeat until count  has  been  reached.  Both
       --count  and  --max will accept a number greater than or equal to zero, in the case of zero, nothing will
       be outputted. The first argument is  interpreted  as  COUNT  if  --count  or  --max  are  not  explicitly
       specified.  If -N or --no-newline is given, the output won't contain a newline character at the end. Exit
       status: 0 if yielded string is not empty, 1 otherwise.

   Examples
   Repeat Examples
          >_ string repeat -n 2 'foo '
          foo foo

          >_ echo foo | string repeat -n 2
          foofoo

          >_ string repeat -n 2 -m 5 'foo'
          foofo

          >_ string repeat -m 5 'foo'
          foofo

          >_ string repeat 2 'foo'
          foofoo

          >_ string repeat 2 -n 3
          222

   string-replace - replace substrings
   Synopsis
       string replace [-a | --all] [-f | --filter] [-i | --ignore-case]
                      [-r | --regex] [(-m | --max-matches) MAX] [-q | --quiet]
                      PATTERN REPLACEMENT [STRING ...]

   Description
       string replace is similar to string  match  but  replaces  non-overlapping  matching  substrings  with  a
       replacement  string  and  prints  the result. By default, PATTERN is treated as a literal substring to be
       matched.

       If -r or --regex  is  given,  PATTERN  is  interpreted  as  a  Perl-compatible  regular  expression,  and
       REPLACEMENT  can  contain  C-style  escape  sequences like t as well as references to capturing groups by
       number or name as $n or ${n}.

       If you specify the -f or --filter flag then each input string is printed only if a replacement was  done.
       This  is  useful  where you would otherwise use this idiom: a_cmd | string match pattern | string replace
       pattern new_pattern. You can instead just write a_cmd | string replace --filter pattern new_pattern.

       If --max-matches MAX or -m MAX is used, string replace will stop all processing after MAX lines of  input
       have  matched  the  specified  pattern. In the event of --filter or -f, this means the output will be MAX
       lines in length. This can be used as an  "early  exit"  optimization  when  processing  long  inputs  but
       expecting  a limited and fixed number of outputs that might be found considerably before the input stream
       has been exhausted.

       Exit status: 0 if at least one replacement was performed, or 1 otherwise.

   Examples
   Replace Literal Examples
          >_ string replace is was 'blue is my favorite'
          blue was my favorite

          >_ string replace 3rd last 1st 2nd 3rd
          1st
          2nd
          last

          >_ string replace -a ' ' _ 'spaces to underscores'
          spaces_to_underscores

   Replace Regex Examples
          >_ string replace -r -a '[^\d.]+' ' ' '0 one two 3.14 four 5x'
          0 3.14 5

          >_ string replace -r '(\w+)\s+(\w+)' '$2 $1 $$' 'left right'
          right left $

          >_ string replace -r '\s*newline\s*' '\n' 'put a newline here'
          put a
          here

   string-shorten - shorten strings to a width, with an ellipsis
   Synopsis
       string shorten [(-c | --char) CHARS] [(-m | --max) INTEGER]
                      [-N | --no-newline] [-l | --left] [-q | --quiet] [STRING ...]

   Description
       string shorten truncates each STRING to the given visible width and adds  an  ellipsis  to  indicate  it.
       "Visible  width" means the width of all visible characters added together, excluding escape sequences and
       accounting for fish_emoji_width and fish_ambiguous_width. It is the amount of columns in a  terminal  the
       STRING occupies.

       The  escape  sequences reflect what fish knows about, and how it computes its output. Your terminal might
       support more escapes, or not support escape sequences that fish knows about.

       If -m or --max is given, truncate at the given width. Otherwise, the lowest non-zero width of  all  input
       strings is used. A max of 0 means no shortening takes place, all STRINGs are printed as-is.

       If  -N  or  --no-newline is given, only the first line (or last line with --left) of each STRING is used,
       and an ellipsis is added if it was multiline. This only works  for  STRINGs  being  given  as  arguments,
       multiple lines given on stdin will be interpreted as separate STRINGs instead.

       If  -c  or  --char  is  given,  add  CHAR instead of an ellipsis. This can also be empty or more than one
       character.

       If -l or --left is given, remove text from the left on instead, so this prints the longest suffix of  the
       string that fits. With --no-newline, this will take from the last line instead of the first.

       If  -q  or  --quiet  is  given,  string  shorten  only  runs  for the return value - if anything would be
       shortened, it returns 0, else 1.

       The default ellipsis is . If fish thinks your system is incapable because of your locale,  it  will  use
       ... instead.

       The return value is 0 if any shortening occurred, 1 otherwise.

   Examples
          >_ string shorten foo foobar
          # No width was given, we infer, and "foo" is the shortest.
          foo
          fo…

          >_ string shorten --char="..." foo foobar
          # The target width is 3 because of "foo",
          # and our ellipsis is 3 too, so we can't really show anything.
          # This is the default ellipsis if your locale doesn't allow "…".
          foo
          ...

          >_ string shorten --char="" --max 4 abcdef 123456
          # Leaving the char empty makes us not add an ellipsis
          # So this truncates at 4 columns:
          abcd
          1234

          >_ touch "a multiline"\n"file"
          >_ for file in *; string shorten -N -- $file; end
          # Shorten the multiline file so we only show one line per file:
          a multiline…

          >_ ss -p | string shorten -m$COLUMNS -c ""
          # `ss` from Linux' iproute2 shows socket information, but prints extremely long lines.
          # This shortens input so it fits on the screen without overflowing lines.

          >_ git branch | string match -rg '^\* (.*)' | string shorten -m20
          # Take the current git branch and shorten it at 20 columns.
          # Here the branch is "builtin-path-with-expand"
          builtin-path-with-e…

          >_ git branch | string match -rg '^\* (.*)' | string shorten -m20 --left
          # Taking 20 columns from the right instead:
          …in-path-with-expand

   See Alsostring's pad subcommand does the inverse of this command, adding padding to a specific width instead.

       • The printf command can do simple padding, for example printf %10s\n works like string pad -w10.

       • string length with the --visible option can be used to show what fish thinks the width is.

   string-split - split strings by delimiter
   Synopsis
       string split [(-f | --fields) FIELDS] [(-m | --max) MAX] [-n | --no-empty]
                    [-q | --quiet] [-r | --right] SEP [STRING ...]
       string split0 [(-f | --fields) FIELDS] [(-m | --max) MAX] [-n | --no-empty]
                     [-q | --quiet] [-r | --right] [STRING ...]

   Description
       string  split  splits  each  STRING on the separator SEP, which can be an empty string. If -m or --max is
       specified, at most MAX splits are done on each STRING. If -r or --right is given, splitting is  performed
       right-to-left.  This  is useful in combination with -m or --max. With -n or --no-empty, empty results are
       excluded from consideration (e.g. hello\n\nworld would expand to two strings and not three). Exit status:
       0 if at least one split was performed, or 1 otherwise.

       Use -f or --fields to print out specific fields. FIELDS is a  comma-separated  string  of  field  numbers
       and/or spans. Each field is one-indexed, and will be printed on separate lines. If a given field does not
       exist, then the command exits with status 1 and does not print anything, unless --allow-empty is used.

       See also the --delimiter option of the read command.

       string split0 splits each STRING on the zero byte (NUL). Options are the same as string split except that
       no separator is given.

       split0  has  the  important  property  that  its  output  is  not  further  split  when used in a command
       substitution, allowing for the command substitution to produce elements containing newlines. This is most
       useful when used with Unix tools that produce zero bytes, such as find -print0 or  sort  -z.  See  split0
       examples below.

   Examples
          >_ string split . example.com
          example
          com

          >_ string split -r -m1 / /usr/local/bin/fish
          /usr/local/bin
          fish

          >_ string split '' abc
          a
          b
          c

          >_ string split --allow-empty -f1,3-4,5 '' abcd
          a
          c
          d

   NUL Delimited Examples
          >_ # Count files in a directory, without being confused by newlines.
          >_ count (find . -print0 | string split0)
          42

          >_ # Sort a list of elements which may contain newlines
          >_ set foo beta alpha\ngamma
          >_ set foo (string join0 $foo | sort -z | string split0)
          >_ string escape $foo[1]
          alpha\ngamma

   string-split0 - split on zero bytes
   Synopsis
       string split [(-f | --fields) FIELDS] [(-m | --max) MAX] [-n | --no-empty]
                    [-q | --quiet] [-r | --right] SEP [STRING ...]
       string split0 [(-f | --fields) FIELDS] [(-m | --max) MAX] [-n | --no-empty]
                     [-q | --quiet] [-r | --right] [STRING ...]

   Description
       string  split  splits  each  STRING on the separator SEP, which can be an empty string. If -m or --max is
       specified, at most MAX splits are done on each STRING. If -r or --right is given, splitting is  performed
       right-to-left.  This  is useful in combination with -m or --max. With -n or --no-empty, empty results are
       excluded from consideration (e.g. hello\n\nworld would expand to two strings and not three). Exit status:
       0 if at least one split was performed, or 1 otherwise.

       Use -f or --fields to print out specific fields. FIELDS is a  comma-separated  string  of  field  numbers
       and/or spans. Each field is one-indexed, and will be printed on separate lines. If a given field does not
       exist, then the command exits with status 1 and does not print anything, unless --allow-empty is used.

       See also the --delimiter option of the read command.

       string split0 splits each STRING on the zero byte (NUL). Options are the same as string split except that
       no separator is given.

       split0  has  the  important  property  that  its  output  is  not  further  split  when used in a command
       substitution, allowing for the command substitution to produce elements containing newlines. This is most
       useful when used with Unix tools that produce zero bytes, such as find -print0 or  sort  -z.  See  split0
       examples below.

   Examples
          >_ string split . example.com
          example
          com

          >_ string split -r -m1 / /usr/local/bin/fish
          /usr/local/bin
          fish

          >_ string split '' abc
          a
          b
          c

          >_ string split --allow-empty -f1,3-4,5 '' abcd
          a
          c
          d

   NUL Delimited Examples
          >_ # Count files in a directory, without being confused by newlines.
          >_ count (find . -print0 | string split0)
          42

          >_ # Sort a list of elements which may contain newlines
          >_ set foo beta alpha\ngamma
          >_ set foo (string join0 $foo | sort -z | string split0)
          >_ string escape $foo[1]
          alpha\ngamma

   string-sub - extract substrings
   Synopsis
       string sub [(-s | --start) START] [(-e | --end) END] [(-l | --length) LENGTH]
                  [-q | --quiet] [STRING ...]

   Description
       string  sub  prints  a substring of each string argument. The start/end of the substring can be specified
       with -s/-e or --start/--end followed by a 1-based index value. Positive index values are relative to  the
       start  of  the  string and negative index values are relative to the end of the string. The default start
       value is 1. The length of the substring can be specified with -l or --length. If the length or end is not
       specified, the substring continues to the end of each STRING. Exit status: 0 if at  least  one  substring
       operation was performed, 1 otherwise. --length is mutually exclusive with --end.

   Examples
          >_ string sub --length 2 abcde
          ab

          >_ string sub -s 2 -l 2 abcde
          bc

          >_ string sub --start=-2 abcde
          de

          >_ string sub --end=3 abcde
          abc

          >_ string sub -e -1 abcde
          abcd

          >_ string sub -s 2 -e -1 abcde
          bcd

          >_ string sub -s -3 -e -2 abcde
          c

   string-trim - remove trailing whitespace
   Synopsis
       string trim [-l | --left] [-r | --right] [(-c | --chars) CHARS]
                   [-q | --quiet] [STRING ...]

   Description
       string  trim  removes  leading  and  trailing whitespace from each STRING. If -l or --left is given, only
       leading whitespace is removed. If -r or --right is given, only trailing whitespace is trimmed.

       The -c or --chars switch causes the set of characters in CHARS to be removed instead of whitespace.  This
       is  a set of characters, not a string - if you pass -c foo, it will remove any "f" or "o", not just "foo"
       as a whole.

       Exit status: 0 if at least one character was trimmed, or 1 otherwise.

   Examples
          >_ string trim ' abc  '
          abc

          >_ string trim --right --chars=yz xyzzy zany
          x
          zan

   string-unescape - expand escape sequences
   Synopsis
       string escape [-n | --no-quoted] [--style=] [STRING ...]
       string unescape [--style=] [STRING ...]

   Description
       string escape escapes each STRING in one of several ways.

       --style=script (default) alters the string such that it can  be  passed  back  to  eval  to  produce  the
       original  argument again. By default, all special characters are escaped, and quotes are used to simplify
       the output when possible. If -n or --no-quoted is given, the simplifying quoted format is not used.  Exit
       status: 0 if at least one string was escaped, or 1 otherwise.

       --style=var  ensures  the  string  can  be  used  as a variable name by hex encoding any non-alphanumeric
       characters. The string is first converted to UTF-8 before being encoded.

       --style=url ensures the string can be used as a URL by hex encoding any character which is not legal in a
       URL. The string is first converted to UTF-8 before being encoded.

       --style=regex escapes an input string for literal matching within a regex expression. The string is first
       converted to UTF-8 before being encoded.

       string unescape performs the inverse of the string escape command. If the string to be unescaped  is  not
       properly  formatted  it  is  ignored.  For  example,  doing  string  unescape  --style=var (string escape
       --style=var $str) will return the original string. There is no support for unescaping --style=regex.

   Examples
          >_ echo \x07 | string escape
          \cg

          >_ string escape --style=var 'a1 b2'\u6161
          a1_20_b2_E6_85_A1_

   string-upper - convert strings to uppercase
   Synopsis
       string upper [-q | --quiet] [STRING ...]

   Description
       string upper converts each string argument to uppercase. Exit status:  0  if  at  least  one  string  was
       converted  to  uppercase,  else  1.  This means that in conjunction with the -q flag you can readily test
       whether a string is already uppercase.

   suspend - suspend the current shell
   Synopsis
       suspend [--force]

   Description
       suspend suspends execution of the current shell  by  sending  it  a  SIGTSTP  signal,  returning  to  the
       controlling  process.  It can be resumed later by sending it a SIGCONT.  In order to prevent suspending a
       shell that doesn't have a controlling process, it will not suspend the shell if it is a login shell. This
       requirement is bypassed if the --force option is given or the shell is not interactive.

   switch - conditionally execute a block of commands
   Synopsis
       switch VALUE; [case [GLOB ...]; [COMMANDS ...]; ...] end

   Description
       switch performs one of several blocks of commands, depending on whether a specified value equals  one  of
       several globbed values. case is used together with the switch statement in order to determine which block
       should be executed.

       Each  case  command is given one or more parameters. The first case command with a parameter that matches
       the string specified in the switch command will be evaluated. case parameters may  contain  globs.  These
       need to be escaped or quoted in order to avoid regular glob expansion using filenames.

       Note that fish does not fall through on case statements. Only the first matching case is executed.

       Note  that break cannot be used to exit a case/switch block early like in other languages. It can only be
       used in loops.

       Note that command substitutions in a case statement will be evaluated even if its body is not taken.  All
       substitutions,  including  command  substitutions,  must  be  performed  before the value can be compared
       against the parameter.

   Example
       If the variable $animal contains the name of an animal, the following code would attempt to classify it:

          switch $animal
              case cat
                  echo evil
              case wolf dog human moose dolphin whale
                  echo mammal
              case duck goose albatross
                  echo bird
              case shark trout stingray
                  echo fish
              case '*'
                  echo I have no idea what a $animal is
          end

       If the above code was run with $animal set to whale, the output would be mammal.

   test - perform tests on files and text
   Synopsis
       test [EXPRESSION]
       [ [EXPRESSION] ]

   Description
       NOTE: This page documents the fish builtin test.  To see the documentation on any non-fish versions,  use
       command man test.

       test checks the given conditions and sets the exit status to 0 if they are true, 1 if they are false.

       The  first form (test) is preferred. For compatibility with other shells, the second form is available: a
       matching pair of square brackets ([ [EXPRESSION] ]).

       When using a variable or command substitution as an argument with test you should almost  always  enclose
       it  in  double-quotes, as variables expanding to zero or more than one argument will most likely interact
       badly with test.

       WARNING:
          For historical reasons, test supports the  one-argument  form  (test  foo),  and  this  will  also  be
          triggered  by e.g. test -n $foo if $foo is unset. We recommend you don't use the one-argument form and
          quote all variables or command substitutions used with test.

          This confusing misfeature will be removed in future. test -n without any additional argument  will  be
          false,  test  -z  will  be true and any other invocation with exactly one or zero arguments, including
          test -d and test "foo" will be an error.

          The same goes for [, e.g. [ "foo" ] and [ -d ] will be errors.

          This can be turned on already via the test-require-arg feature flag, and will  eventually  become  the
          default and then only option.

   Operators for files and directories
       -b FILE
              Returns true if FILE is a block device.

       -c FILE
              Returns true if FILE is a character device.

       -d FILE
              Returns true if FILE is a directory.

       -e FILE
              Returns true if FILE exists.

       -f FILE
              Returns true if FILE is a regular file.

       -g FILE
              Returns true if FILE has the set-group-ID bit set.

       -G FILE
              Returns true if FILE exists and has the same group ID as the current user.

       -k FILE
              Returns  true  if  FILE  has the sticky bit set. If the OS does not support the concept it returns
              false. See https://en.wikipedia.org/wiki/Sticky_bit.

       -L FILE
              Returns true if FILE is a symbolic link.

       -O FILE
              Returns true if FILE exists and is owned by the current user.

       -p FILE
              Returns true if FILE is a named pipe.

       -r FILE
              Returns true if FILE is marked as readable.

       -s FILE
              Returns true if the size of FILE is greater than zero.

       -S FILE
              Returns true if FILE is a socket.

       -t FD  Returns true if the file descriptor FD is a terminal (TTY).

       -u FILE
              Returns true if FILE has the set-user-ID bit set.

       -w FILE
              Returns true if FILE is marked as writable; note that this does not check  if  the  filesystem  is
              read-only.

       -x FILE
              Returns true if FILE is marked as executable.

   Operators to compare files and directories
       FILE1 -nt FILE2
              Returns true if FILE1 is newer than FILE2, or FILE1 exists and FILE2 does not.

       FILE1 -ot FILE2
              Returns true if FILE1 is older than FILE2, or FILE2 exists and FILE1 does not.

       FILE1 -ef FILE1
              Returns true if FILE1 and FILE2 refer to the same file.

   Operators for text strings
       STRING1 = STRING2
              Returns true if the strings STRING1 and STRING2 are identical.

       STRING1 != STRING2
              Returns true if the strings STRING1 and STRING2 are not identical.

       -n STRING
              Returns true if the length of STRING is non-zero.

       -z STRING
              Returns true if the length of STRING is zero.

   Operators to compare and examine numbers
       NUM1 -eq NUM2
              Returns true if NUM1 and NUM2 are numerically equal.

       NUM1 -ne NUM2
              Returns true if NUM1 and NUM2 are not numerically equal.

       NUM1 -gt NUM2
              Returns true if NUM1 is greater than NUM2.

       NUM1 -ge NUM2
              Returns true if NUM1 is greater than or equal to NUM2.

       NUM1 -lt NUM2
              Returns true if NUM1 is less than NUM2.

       NUM1 -le NUM2
              Returns true if NUM1 is less than or equal to NUM2.

       Both integers and floating point numbers are supported.

   Operators to combine expressions
       COND1 -a COND2
              Returns true if both COND1 and COND2 are true.

       COND1 -o COND2
              Returns true if either COND1 or COND2 are true.

       Expressions can be inverted using the ! operator:

       ! EXPRESSION
              Returns true if EXPRESSION is false, and false if EXPRESSION is true.

       Expressions can be grouped using parentheses.

       ( EXPRESSION )
              Returns the value of EXPRESSION.

       Note  that  parentheses will usually require escaping with \ (so they appear as \( and \)) to avoid being
       interpreted as a command substitution.

   Examples
       If the /tmp directory exists, copy the /etc/motd file to it:

          if test -d /tmp
              cp /etc/motd /tmp/motd
          end

       If the variable MANPATH is defined and not empty, print the contents. (If MANPATH is not defined, then it
       will expand to zero arguments, unless quoted.)

          if test -n "$MANPATH"
              echo $MANPATH
          end

       Be careful with unquoted variables:

          if test -n $MANPATH
              # This will also be reached if $MANPATH is unset,
              # because in that case we have `test -n`, so it checks if "-n" is non-empty, and it is.
              echo $MANPATH
          end

       This will change in a future release of fish, or already with the  test-require-arg  feature  flag  -  if
       $MANPATH is unset, if test -n $MANPATH will be false.

       Parentheses  and the -o and -a operators can be combined to produce more complicated expressions. In this
       example, success is printed if there is a /foo or /bar file as well as a /baz or /bat file.

          if test \( -f /foo -o -f /bar \) -a \( -f /baz -o -f /bat \)
              echo Success.
          end

       Numerical comparisons will simply fail if one of the operands is not a number:

          if test 42 -eq "The answer to life, the universe and everything"
              echo So long and thanks for all the fish # will not be executed
          end

       A common comparison is with status:

          if test $status -eq 0
              echo "Previous command succeeded"
          end

       The previous test can likewise be inverted:

          if test ! $status -eq 0
              echo "Previous command failed"
          end

       which is logically equivalent to the following:

          if test $status -ne 0
              echo "Previous command failed"
          end

   Standards
       Unlike many things in fish, test implements a subset of  the  IEEE  Std  1003.1-2008  (POSIX.1)  standard
       <https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html>. The following exceptions apply:

       • The < and > operators for comparing strings are not implemented.

       • With test-require-arg, the zero- and one-argument modes will behave differently.
          In  cases such as this, one can use command test to explicitly use the system's standalone test rather
          than this builtin test.

   See also
       Other commands that may be useful as a condition, and are often easier to use:

       • string - manipulate strings, which can do string operations including wildcard and  regular  expression
         matching

       • path  -  manipulate  and  check  paths,  which  can do file checks and operations, including filters on
         multiple paths at once

   time - measure how long a command or block takes
   Synopsis
       time COMMAND

   Description
       NOTE: This page documents the fish keyword time.  To see the documentation on any non-fish versions,  use
       command man time.

       time causes fish to measure how long a command takes and print the results afterwards. The command can be
       a simple fish command or a block. The results can not currently be redirected.

       For checking timing after a command has completed, check $CMD_DURATION.

       Your  system  most  likely  also  has  a time command. To use that use something like command time, as in
       command time sleep 10. Because it's not inside fish, it won't have access to fish functions and won't  be
       able to time blocks and such.

   How to interpret the output
       Time outputs a few different values. Let's look at an example:

          > time string repeat -n 10000000 y\n | command grep y >/dev/null
          ________________________________________________________
          Executed in  805.98 millis    fish           external
             usr time  798.88 millis  763.88 millis   34.99 millis
             sys time  141.22 millis   40.20 millis  101.02 millis

       The  time  after  "Executed  in" is what is known as the "wall-clock time". It is simply a measure of how
       long it took from the start of the command until  it  finished.  Typically  it  is  reasonably  close  to
       CMD_DURATION, except for a slight skew because the two are taken at slightly different times.

       The  other  times are all measures of CPU time. That means they measure how long the CPU was used in this
       part, and they count multiple cores separately. So a program with four threads using all CPU for a second
       will have a time of 4 seconds.

       The "usr" time is how much CPU time was spent inside the program itself, the "sys" time is how  long  was
       spent in the kernel on behalf of that program.

       The  "fish"  time  is  how much CPU was spent in fish, the "external" time how much was spent in external
       commands.

       So in this example, since string is a builtin, everything that string repeat did is  accounted  to  fish.
       Any time it spends doing syscalls like write() is accounted for in the fish/sys time.

       And  grep  here  is  explicitly  invoked  as  an  external  command,  so its times will be counted in the
       "external" column.

       Note that, as in this example, the CPU times can add up to more than the execution time. This is  because
       things can be done in parallel - grep can match while string repeat writes.

   Example
       (for obvious reasons exact results will vary on your system)

          >_ time sleep 1s

          ________________________________________________________
          Executed in    1,01 secs   fish           external
             usr time    2,32 millis    0,00 micros    2,32 millis
             sys time    0,88 millis  877,00 micros    0,00 millis

          >_ time for i in 1 2 3; sleep 1s; end

          ________________________________________________________
          Executed in    3,01 secs   fish           external
             usr time    9,16 millis    2,94 millis    6,23 millis
             sys time    0,23 millis    0,00 millis    0,23 millis

       Inline variable assignments need to follow the time keyword:

          >_ time a_moment=1.5m sleep $a_moment

          ________________________________________________________
          Executed in   90.00 secs      fish           external
             usr time    4.62 millis    4.62 millis    0.00 millis
             sys time    2.35 millis    0.41 millis    1.95 millis

   trap - perform an action when the shell receives a signal
   Synopsis
       trap [OPTIONS] [[ARG] REASON ... ]

   Description
       NOTE:  This page documents the fish builtin trap.  To see the documentation on any non-fish versions, use
       command man trap.

       trap is a wrapper around the fish event delivery framework. It exists for  backwards  compatibility  with
       POSIX shells. For other uses, it is recommended to define an event handler.

       The following parameters are available:

       ARG    Command to be executed on signal delivery.

       REASON Name of the event to trap. For example, a signal like INT or SIGINT, or the special symbol EXIT.

       -l or --list-signals
              Prints a list of signal names.

       -p or --print
              Prints all defined signal handlers.

       -h or --help
              Displays help about using this command.

       If  ARG  and  REASON  are  both  specified, ARG is the command to be executed when the event specified by
       REASON occurs (e.g., the signal is delivered).

       If ARG is absent (and there is a single REASON) or -, each specified signal  is  reset  to  its  original
       disposition  (the  value  it  had  upon  entrance  to  the  shell).  If ARG is the null string the signal
       specified by each REASON is ignored by the shell and by the commands it invokes.

       If ARG is not present and -p has been supplied, then the trap commands associated with  each  REASON  are
       displayed.  If  no  arguments  are  supplied  or  if  only  -p is given, trap prints the list of commands
       associated with each signal.

       Signal names are case insensitive and the SIG prefix is optional. Trapping a  signal  will  prevent  fish
       from exiting in response to that signal.

       The exit status is 1 if any REASON is invalid; otherwise trap returns 0.

   Example
          trap "status --print-stack-trace" SIGUSR1
          # Prints a stack trace each time the SIGUSR1 signal is sent to the shell.

   true - return a successful result
   Synopsis
       true

   Description
       true sets the exit status to 0.

       : (a single colon) is an alias for the true command.

   See Alsofalse command

       • $status variable

   type - locate a command and describe its type
   Synopsis
       type [OPTIONS] NAME [...]

   Description
       NOTE:  This page documents the fish builtin type.  To see the documentation on any non-fish versions, use
       command man type.

       With no options, type indicates how each NAME would be interpreted if used as a command name.

       The following options are available:

       -a or --all
              Prints all of possible definitions of the specified names.

       -s or --short
              Don't print function definitions when used with no options or with -a/--all.

       -f or --no-functions
              Suppresses function lookup.

       -t or --type
              Prints function,  builtin,  or  file  if  NAME  is  a  shell  function,  builtin,  or  disk  file,
              respectively.

       -p or --path
              Prints  the  path  to  NAME if NAME resolves to an executable file in PATH, the path to the script
              containing the definition of the function NAME if NAME resolves to a function loaded from  a  file
              on disk (i.e. not interactively defined at the prompt), or nothing otherwise.

       -P or --force-path
              Returns  the  path  to  the  executable file NAME, presuming NAME is found in the PATH environment
              variable, or nothing otherwise. --force-path explicitly resolves only the path to executable files
              in  PATH, regardless of whether NAME is shadowed by a function or builtin with the same name.

       -q or --query
              Suppresses all output; this is useful when testing the exit status.  For  compatibility  with  old
              fish versions this is also --quiet.

       -h or --help
              Displays help about using this command.

       The  -q,  -p,  -t  and  -P  flags  (and  their long flag aliases) are mutually exclusive. Only one can be
       specified at a time.

       type returns 0 if at least one entry was found,  1  otherwise,  and  2  for  invalid  options  or  option
       combinations.

   Example
          >_ type fg
          fg is a builtin

   ulimit - set or get resource usage limits
   Synopsis
       ulimit [OPTIONS] [LIMIT]

   Description
       ulimit  sets  or outputs the resource usage limits of the shell and any processes spawned by it. If a new
       limit value is omitted, the current value of the  limit  of  the  resource  is  printed;  otherwise,  the
       specified limit is set to the new value.

       Use one of the following switches to specify which resource limit to set or report:

       -b or --socket-buffers
              The maximum size of socket buffers.

       -c or --core-size
              The maximum size of core files created. By setting this limit to zero, core dumps can be disabled.

       -d or --data-size
              The maximum size of a process' data segment.

       -e or --nice
              Controls  the maximum nice value; on Linux, this value is subtracted from 20 to give the effective
              value.

       -f or --file-size
              The maximum size of files created by a process.

       -i or --pending-signals
              The maximum number of signals that may be queued.

       -l or --lock-size
              The maximum size that may be locked into memory.

       -m or --resident-set-size
              The maximum resident set size.

       -n or --file-descriptor-count
              The maximum number of open file descriptors.

       -q or --queue-size
              The maximum size of data in POSIX message queues.

       -r or --realtime-priority
              The maximum realtime scheduling priority.

       -s or --stack-size
              The maximum stack size.

       -t or --cpu-time
              The maximum amount of CPU time in seconds.

       -u or --process-count
              The maximum number of processes available to the current user.

       -w or --swap-size
              The maximum swap space available to the current user.

       -v or --virtual-memory-size
              The maximum amount of virtual memory available to the shell.

       -y or --realtime-maxtime
              The maximum contiguous realtime CPU time in microseconds.

       -K or --kernel-queues
              The maximum number of kqueues (kernel queues) for the current user.

       -P or --ptys
              The maximum number of pseudo-terminals for the current user.

       -T or --threads
              The maximum number of simultaneous threads for the current user.

       Note that not all these limits are available in all operating  systems;  consult  the  documentation  for
       setrlimit in your operating system.

       The  value  of  limit can be a number in the unit specified for the resource or one of the special values
       hard, soft, or unlimited, which stand for the current hard limit, the current soft limit, and  no  limit,
       respectively.

       If  limit  is  given,  it  is  the new value of the specified resource. If no option is given, then -f is
       assumed. Values are in kilobytes, except for -t, which is in seconds and -n and -u,  which  are  unscaled
       values.  The  exit status is 0 unless an invalid option or argument is supplied, or an error occurs while
       setting a new limit.

       ulimit also accepts the following options that determine what type of limit to set:

       -H or --hard
              Sets hard resource limit.

       -S or --soft
              Sets soft resource limit.

       A hard limit can only be decreased. Once it is set it cannot be increased; a soft limit may be  increased
       up  to  the value of the hard limit. If neither -H nor -S is specified, both the soft and hard limits are
       updated when assigning a new limit value, and the soft limit is used when reporting the current value.

       The following additional options are also understood by ulimit:

       -a or --all
              Prints all current limits.

       -h or --help
              Displays help about using this command.

       The fish implementation of ulimit should behave identically to the implementation  in  bash,  except  for
       these differences:

       • Fish ulimit supports GNU-style long options for all switches.

       • Fish  ulimit does not support the -p option for getting the pipe size. The bash implementation consists
         of a compile-time check that empirically guesses this number by writing  to  a  pipe  and  waiting  for
         SIGPIPE. Fish does not do this because this method of determining pipe size is unreliable. Depending on
         bash version, there may also be further additional limits to set in bash that do not exist in fish.

       • Fish  ulimit  does  not support getting or setting multiple limits in one command, except reporting all
         values using the -a switch.

   Example
       ulimit -Hs 64 sets the hard stack size limit to 64 kB.

   umask - set or get the file creation mode mask
   Synopsis
       umask [OPTIONS] [MASK]

   Description
       NOTE: This page documents the fish builtin umask.  To see the documentation on any non-fish versions, use
       command man umask.

       umask displays and manipulates the "umask", or file creation mode mask, which is  used  to  restrict  the
       default access to files.

       The umask may be expressed either as an octal number, which represents the rights that will be removed by
       default, or symbolically, which represents the only rights that will be granted by default.

       Access rights are explained in the manual page for the chmod(1) program.

       With no parameters, the current file creation mode mask is printed as an octal number.

       -S or --symbolic
              Prints the umask in symbolic form instead of octal form.

       -p or --as-command
              Outputs the umask in a form that may be reused as input.

       -h or --help
              Displays help about using this command.

       If  a  numeric mask is specified as a parameter, the current shell's umask will be set to that value, and
       the rights specified by that mask will be removed from new files and directories by default.

       If a symbolic mask is specified, the desired permission bits, and not the inverse, should be specified. A
       symbolic mask is a comma separated list of rights. Each right consists of three parts:

       • The first part specifies to whom this set of right applies, and can be one of u, g, o  or  a,  where  u
         specifies  the  user who owns the file, g specifies the group owner of the file, o specific other users
         rights and a specifies all three should be changed.

       • The second part of a right specifies the mode, and can be one of =, + or -, where = specifies that  the
         rights  should  be  set to the new value, + specifies that the specified right should be added to those
         previously specified and - specifies that the specified rights should be removed from those  previously
         specified.

       • The  third  part  of a right specifies what rights should be changed and can be any combination of r, w
         and x, representing read, write and execute rights.

       If the first and second parts are skipped, they are assumed to be a and =, respectively. As  an  example,
       r,u+w means all users should have read access and the file owner should also have write access.

       Note that symbolic masks currently do not work as intended.

   Example
       umask 177 or umask u=rw sets the file creation mask to read and write for the owner and no permissions at
       all for any other users.

   vared - interactively edit the value of an environment variable
   Synopsis
       vared VARIABLE_NAME

   Description
       vared  is used to interactively edit the value of an environment variable. Array variables as a whole can
       not be edited using vared, but individual list elements can.

       The -h or --help option displays help about using this command.

   Example
       vared PATH[3] edits the third element of the PATH list

   wait - wait for jobs to complete
   Synopsis
       wait [-n | --any] [PID | PROCESS_NAME] ...

   Description
       NOTE: This page documents the fish builtin wait.  To see the documentation on any non-fish versions,  use
       command man wait.

       wait waits for child jobs to complete.

       If a PID is specified, the command waits for the job that the process with that process ID belongs to.

       If a PROCESS_NAME is specified, the command waits for the jobs that the matched processes belong to.

       If neither a pid nor a process name is specified, the command waits for all background jobs.

       If the -n or --any flag is provided, the command returns as soon as the first job completes. If it is not
       provided, it returns after all jobs complete.

       The -h or --help option displays help about using this command.

   Example
          sleep 10 &
          wait $last_pid

       spawns sleep in the background, and then waits until it finishes.

          for i in (seq 1 5); sleep 10 &; end
          wait

       spawns five jobs in the background, and then waits until all of them finish.

          for i in (seq 1 5); sleep 10 &; end
          hoge &
          wait sleep

       spawns  five  sleep  jobs and hoge in the background, and then waits until all sleeps finish, and doesn't
       wait for hoge.

   while - perform a set of commands multiple times
   Synopsis
       while CONDITION; COMMANDS; end

   Description
       while repeatedly executes CONDITION, and if the exit status is 0, then executes COMMANDS.

       The exit status of the while loop is the exit status of the last iteration of the COMMANDS executed, or 0
       if none were executed. (This matches other shells and is POSIX-compatible.)

       You can use and or or for complex conditions. Even more complex control can be achieved with  while  true
       containing a break.

       The -h or --help option displays help about using this command.

   Example
          while test -f foo.txt; or test -f bar.txt ; echo file exists; sleep 10; end
          # outputs 'file exists' at 10 second intervals,
          # as long as the file foo.txt or bar.txt exists.

   Fish for bash users
       This  is  to give you a quick overview if you come from bash (or to a lesser extent other shells like zsh
       or ksh) and want to know how fish differs. Fish is intentionally not POSIX-compatible and as such some of
       the things you are used to work differently.

       Many things are similar - they both fundamentally expand commandlines to execute  commands,  have  pipes,
       redirections,  variables,  globs,  use  command output in various ways. This document is there to quickly
       show you the differences.

   Command substitutions
       Fish spells command substitutions as $(command) or (command), but not `command`.

       In addition, it only splits them on newlines instead of $IFS. If you want to split on something else, use
       string split, string split0 or string collect. If those are  used  as  the  last  command  in  a  command
       substitution the splits they create are carried over. So:

          for i in (find . -print0 | string split0)

       will correctly handle all possible filenames.

   Variables
       Fish  sets  and  erases  variables  with  set  instead of VAR=VAL and a variety of separate builtins like
       declare and unset and export. set takes options to determine the scope and exportedness of a variable:

          # Define $PAGER *g*lobal and e*x*ported,
          # so this is like ``export PAGER=less``
          set -gx PAGER less

          # Define $alocalvariable only locally,
          # like ``local alocalvariable=foo``
          set -l alocalvariable foo

       or to erase variables:

          set -e PAGER

       VAR=VAL statements are available as environment overrides:

          PAGER=cat git log

       Fish does not perform word splitting. Once a variable has been set to a value, that value stays as it is,
       so double-quoting variable expansions isn't the necessity it is in bash. [1]

       For instance, here's bash

          > foo="bar baz"
          > printf '"%s"\n' $foo
          # will print two lines, because we didn't double-quote
          # this is word splitting
          "bar"
          "baz"

       And here is fish:

          > set foo "bar baz"
          > printf '"%s"\n' $foo
          # foo was set as one element,
          # so it will be passed as one element, so this is one line
          "bar baz"

       All variables are "arrays" (we use the term "lists"),  and  expanding  a  variable  expands  to  all  its
       elements, with each element as its own argument (like bash's "${var[@]}":

          > set var "foo bar" banana
          > printf %s\n $var
          foo bar
          banana

       Specific elements of a list can be selected:

          echo $list[5..7]

       The arguments to set are ordinary, so you can also set a variable to the output of a command:

          # Set lines to all the lines in file, one element per line
          set lines (cat file)

       or a mixture of literal values and output:

          > set numbers 1 2 3 (seq 5 8) 9
          > printf '%s\n' $numbers
          1
          2
          3
          5
          6
          7
          8
          9

       A  = is unnecessary and unhelpful with set - set foo = bar will set the variable "foo" to two values: "="
       and "bar". set foo=bar will print an error.

       See Shell variables for more.

       [1]  zsh also does not perform word splitting by default (the SH_WORD_SPLIT option controls this)

   Wildcards (globs)
       Fish only supports the * and ** glob (and the deprecated ? glob) as syntax. If a glob  doesn't  match  it
       fails the command (like with bash's failglob) unless the command is for, set or count or the glob is used
       with  an  environment  override  (VAR=*  command),  in which case it expands to nothing (like with bash's
       nullglob option).

       Globbing doesn't happen on expanded variables, so:

          set foo "*"
          echo $foo

       will not match any files.

       There are no options to control globbing so it always behaves like that.

       The ** glob will match in subdirectories as well. In other shells this often needs to be turned  on  with
       an option, like setopt globstar in bash.

       Unlike  bash,  fish will also follow symlinks, and will sort the results in a natural sort, with included
       numbers compared as numbers. That means it will sort e.g.  music  tracks  correctly  even  if  they  have
       numbers like 1 instead of 01.

       See Wildcards for more.

   Quoting
       Fish  has  two quoting styles: "" and ''. Variables are expanded in double-quotes, nothing is expanded in
       single-quotes.

       There is no $'', instead the sequences that would transform are transformed when unquoted:

          > echo a\nb
          a
          b

       See Quotes for more.

   String manipulation
       Fish does not have ${foo%bar}, ${foo#bar} and ${foo/bar/baz}. Instead string manipulation is done by  the
       string builtin.

       For example, to replace "bar" with "baz":

          > string replace bar baz "bar luhrmann"
          baz luhrmann

       It can also split strings:

          > string split "," "foo,bar"
          foo
          bar

       Match regular expressions as a replacement for grep:

          > echo bababa | string match -r 'aba$'
          aba

       Pad strings to a given width, with arbitrary characters:

          > string pad -c x -w 20 "foo"
          xxxxxxxxxxxxxxxxxfoo

       Make strings lower/uppercase:

          > string lower Foo
          foo

          > string upper Foo
          FOO

       repeat strings, trim strings, escape strings or print a string's length or width (in terminal cells).

   Special variables
       Some bash variables and their closest fish equivalent:

       • $*, $@, $1 and so on: $argv$?: $status$$: $fish_pid$#: No variable, instead use count $argv$!: $last_pid$0: status filename$-: Mostly status is-interactive and status is-login

   Process substitution
       Instead of <(command) fish uses (command | psub). There is no equivalent to >(command).

       Note that both of these are bashisms, and most things can easily be expressed without. E.g. instead of:

          source (command | psub)

       just use:

          command | source

       as fish's source can read from stdin.

   Heredocs
       Fish does not have <<EOF "heredocs". Instead of

          cat <<EOF
          some string
          some more string
          EOF

       use:

          printf %s\n "some string" "some more string"

       or:

          echo "some string
          some more string"

          # or if you want the quotes on separate lines:

          echo "\
          some string
          some more string\
          "

       Quotes are followed across newlines.

       What "heredocs" do is:

       1. Read/interpret the string, with special rules, up to the terminator. [2]

       2. Write the resulting string to a temporary file.

       3. Start the command the heredoc is attached to with that file as stdin.

       This means it is essentially the same as just reading from a pipe, so:

          echo "foo" | cat

       is mostly the same as

          cat <<EOF
          foo
          EOF

       Just  like  with  heredocs,  the  command  has to be prepared to read from stdin. Sometimes this requires
       special options to be used, often giving a filename of - turns it on.

       For example:

          echo "xterm
          rxvt-unicode" | pacman --remove -

          # is the same as (the `-` makes pacman read arguments from stdin)
          pacman --remove xterm rxvt-unicode

       and could be written in other shells as

          # This "-" is still necessary - the heredoc is *also* passed over stdin!
          pacman --remove - << EOF
          xterm
          rxvt-unicode
          EOF

       So heredocs really are just minor syntactical sugar that introduces a lot of special rules, which is  why
       fish doesn't have them. Pipes are a core concept, and are simpler and compose nicer.

       [2]  For  example,  the  "EOF" is just a convention, the terminator can be an arbitrary string, something
            like "THISISTHEEND" also  works.  And  using  <<-  trims  leading  tab  characters  (but  not  other
            whitespace),  so  you  can indent the lines, but only with tabs. Substitutions (variables, commands)
            are done on the heredoc by default, but not if the terminator is quoted: cat << "EOF".

   Test (test, [, [[)
       Fish has a POSIX-compatible test or [ builtin. There is no [[ and test does not accept ==  as  a  synonym
       for =. It can compare floating point numbers, however.

       set -q can be used to determine if a variable exists or has a certain number of elements (set -q foo[2]).

   Arithmetic Expansion
       Fish does not have $((i+1)) arithmetic expansion, computation is handled by math:

          math $i + 1

       Unlike bash's arithmetic, it can handle floating point numbers:

          > math 5 / 2
          2.5

       And also has some functions, like for trigonometry:

          > math cos 2 x pi
          1

       You  can  pass arguments to math separately like above or in quotes. Because fish uses () parentheses for
       command substitutions, quoting is needed if you want to use them in your expression:

          > math '(5 + 2) * 4'

       Both * and x are valid ways to spell multiplication, but * needs to be quoted because  it  looks  like  a
       glob.

   Prompts
       Fish does not use the $PS1, $PS2 and so on variables. Instead the prompt is the output of the fish_prompt
       function,  plus  the fish_mode_prompt function if vi mode is enabled. The output of the fish_right_prompt
       function is used for the right-sided prompt.

       As an example, here's a relatively simple bash prompt:

          # <$HOSTNAME> <$PWD in blue> <Prompt Sign in Yellow> <Rest in default light white>
          PS1='\h\[\e[1;34m\]\w\[\e[m\] \[\e[1;32m\]\$\[\e[m\] '

       and a rough fish equivalent:

          function fish_prompt
              set -l prompt_symbol '$'
              fish_is_root_user; and set prompt_symbol '#'

              echo -s (prompt_hostname) \
              (set_color blue) (prompt_pwd) \
              (set_color yellow) $prompt_symbol (set_color normal)
          end

       This shows a few differences:

       • Fish provides set_color to color text. It can use the 16 named colors and also RGB  sequences  (so  you
         could also use set_color 5555FF)

       • Instead  of  introducing specific escapes like \h for the hostname, the prompt is simply a function. To
         achieve the effect of \h, fish provides helper functions like prompt_hostname, which prints a shortened
         version of the hostname.

       • Fish offers other helper functions for adding things to the prompt, like fish_vcs_prompt for  adding  a
         display  for  common  version  control  systems  (git,  mercurial,  svn),  and prompt_pwd for showing a
         shortened $PWD (the user's home directory becomes ~ and any path component is shortened).

       The default prompt is reasonably full-featured and its code can be read via type fish_prompt.

       Fish does not have $PS2 for continuation lines, instead it leaves the lines indented  to  show  that  the
       commandline isn't complete yet.

   Blocks and loops
       Fish's blocking constructs look a little different. They all start with a word, end in end and don't have
       a second starting word:

          for i in 1 2 3; do
             echo $i
          done

          # becomes

          for i in 1 2 3
             echo $i
          end

          while true; do
             echo Weeee
          done

          # becomes

          while true
             echo Weeeeeee
          end

          {
             echo Hello
          }

          # becomes

          begin
             echo Hello
          end

          if true; then
             echo Yes I am true
          else
             echo "How is true not true?"
          fi

          # becomes

          if true
             echo Yes I am true
          else
             echo "How is true not true?"
          end

          foo() {
             echo foo
          }

          # becomes

          function foo
              echo foo
          end

          # (bash allows the word "function",
          #  but this is an extension)

       Fish does not have an until. Use while not or while !.

   Subshells
       Bash has a feature called "subshells", where it will start another shell process for certain things. That
       shell  will  then  be independent and e.g. any changes it makes to variables won't be visible in the main
       shell.

       This includes things like:

          # A list of commands in `()` parentheses
          (foo; bar) | baz

          # Both sides of a pipe
          foo | while read -r bar; do
              # This will not be visible outside of the loop.
              VAR=VAL
              # This background process will not be, either
              baz &
          done

       Fish does not currently have subshells. You will have to find a different  solution.  The  isolation  can
       usually  be  achieved by just scoping variables (with set -l), but if you really do need to run your code
       in a new shell environment you can use fish -c 'your code here' to do so explicitly.

       () subshells are often confused with {} grouping, which does not use a subshell. When you  just  need  to
       group, you can use begin; end in fish:

          (foo; bar) | baz
          # when it should really have been:
          { foo; bar; } | baz
          # becomes
          begin; foo; bar; end | baz

       The pipe will simply be run in the same process, so while read loops can set variables outside:

          foo | while read bar
              set -g VAR VAL
              baz &
          end

          echo $VAR # will print VAL
          jobs # will show "baz"

       Subshells  are  also  frequently  confused  with command substitutions, which bash writes as `command` or
       $(command) and fish writes as $(command) or (command). Bash also uses subshells to implement them.

   Builtins and other commands
       By now it has become apparent that fish puts much more of a focus on its builtins and  external  commands
       rather than its syntax. So here are some helpful builtins and their rough equivalent in bash:

       • string  - this replaces most of the string transformation (${i%foo} et al) and can also be used instead
         of grep and sed and such.

       • math - this replaces $((i + 1)) arithmetic and can also do floats and some simple functions  (sine  and
         friends).

       • argparse  -  this  can  handle a script's option parsing, for which bash would probably use getopt (zsh
         provides zparseopts).

       • count can be used to count things and therefore replaces $# and can be used instead of wc.

       • status provides information about the shell status, e.g.  if  it's  interactive  or  what  the  current
         linenumber is. This replaces $- and $BASH_LINENO and other variables.

       • seq(1)  can  be  used  as a replacement for {1..10} range expansion. If your OS doesn't ship a seq fish
         includes a replacement function.

   Other facilities
       Bash has set -x or set -o xtrace to print all commands that are being executed. In fish,  this  would  be
       enabled by setting fish_trace.

       Or,  if  your  intention is to profile how long each line of a script takes, you can use fish --profile -
       see the page for the fish command.

   Tutorial
   Why fish?
       Fish is a fully-equipped command line shell (like bash or zsh) that  is  smart  and  user-friendly.  Fish
       supports powerful features like syntax highlighting, autosuggestions, and tab completions that just work,
       with nothing to learn or configure.

       If  you  want  to  make  your command line more productive, more useful, and more fun, without learning a
       bunch of arcane syntax and configuration options, then fish might be just what you're looking for!

   Getting started
       Once installed, just type in fish into your current shell to try it out!

       You will be greeted by the standard fish prompt, which means you are all set up and can start using fish:

          > fish
          Welcome to fish, the friendly interactive shell
          Type help for instructions on how to use fish
          you@hostname ~>

       This prompt that you see above is the fish default prompt: it shows your username, hostname, and  working
       directory. You can customize it, see how to change your prompt.

       From now on, we'll pretend your prompt is just a > to save space.

   Learning fish
       This tutorial assumes a basic understanding of command line shells and Unix commands, and that you have a
       working copy of fish.

       If  you  have a strong understanding of other shells, and want to know what fish does differently, search
       for the magic phrase unlike other shells, which is used to call out important differences.

       Or, if you want a quick overview over the differences to other shells like Bash, see Fish For Bash Users.

       For the full, detailed description of how to use fish interactively, see Interactive Use.

       For a comprehensive description of fish's scripting language, see The Fish Language.

   Running Commands
       Fish runs commands like other shells:  you  type  a  command,  followed  by  its  arguments.  Spaces  are
       separators:

          > echo hello world
          hello world

       This  runs  the  command  echo  with  the  arguments hello and world. In this case that's the same as one
       argument hello world, but in many cases it's not. If you need to pass an argument that includes a  space,
       you can escape with a backslash, or quote it using single or double quotes:

          > mkdir My\ Files
          # Makes a directory called "My Files", with a space in the name
          > cp ~/Some\ File 'My Files'
          # Copies a file called "Some File" in the home directory to "My Files"
          > ls "My Files"
          Some File

   Getting Help
       Run help to open fish's help in a web browser, and man with the page (like fish-language) to open it in a
       man  page.  You  can  also  ask  for help with a specific command, for example, help set to open in a web
       browser, or man set to see it in the terminal.

          > man set
          set - handle shell variables
            Synopsis...

       To open this section, use help getting-help.

       This only works for fish's own documentation for itself and its built-in commands (the  "builtins").  For
       any  other commands on your system, they should provide their own documentation, often in the man system.
       For example man ls should tell you about your computer's ls command.

   Syntax Highlighting
       You'll quickly notice that fish performs syntax highlighting as you type. Invalid  commands  are  colored
       red by default:

          > /bin/mkd

       A command may be invalid because it does not exist, or refers to a file that you cannot execute. When the
       command becomes valid, it is shown in a different color:

          > /bin/mkdir

       Valid file paths are underlined as you type them:

          > cat ~/somefi

       This tells you that there exists a file that starts with somefi, which is useful feedback as you type.

       These  colors,  and  many  more,  can  be changed by running fish_config, or by modifying color variables
       directly.

       For example, if you want to disable (almost) all coloring:

          fish_config theme choose none

       This picks the "none" theme. To see all themes:

          fish_config theme show

       Just running fish_config will open up a browser interface that allows you  to  pick  from  the  available
       themes.

   Autosuggestions
       As you type fish will suggest commands to the right of the cursor, in gray. For example:

          > /bin/hostname

       It knows about paths and options:

          > grep --ignore-case

       And history too. Type a command once, and you can re-summon it by just typing a few letters:

          > rsync -avze ssh . myname@somelonghost.com:/some/long/path/doo/dee/doo/dee/doo

       To  accept  the  autosuggestion,  hit right () or ctrl-f. To accept a single word of the autosuggestion,
       alt-right (). If the autosuggestion is not what you want, just ignore it.

       If you don't like autosuggestions, you can disable them by setting $fish_autosuggestion_enabled to 0:

          set -g fish_autosuggestion_enabled 0

   Tab Completions
       A rich set of tab completions work "out of the box".

       Press tab and fish will attempt to complete the command, argument, or path:

          > /pritab => /private/

       If there's more than one possibility, it will list them:

          > ~/stuff/stab
          ~/stuff/script.sh  (command)  ~/stuff/sources/  (directory)

       Hit tab again to cycle through the possibilities. The part  in  parentheses  there  (that  "command"  and
       "directory")  is  the  completion description. It's just a short hint to explain what kind of argument it
       is.

       fish can also complete many commands, like git branches:

          > git merge prtab => git merge prompt_designer
          > git checkout btab
          builtin_list_io_merge (Branch)  builtin_set_color (Branch) busted_events (Tag)

       Try hitting tab and see what fish can do!

   Variables
       Like other shells, a dollar sign followed by a variable name is replaced with the value of that variable:

          > echo My home directory is $HOME
          My home directory is /home/tutorial

       This is known as variable substitution, and it also happens in double quotes, but not single quotes:

          > echo "My current directory is $PWD"
          My current directory is /home/tutorial
          > echo 'My current directory is $PWD'
          My current directory is $PWD

       Unlike other shells, fish has an ordinary command to set variables: set, which takes a variable name, and
       then its value.

          > set name 'Mister Noodle'
          > echo $name
          Mister Noodle

       (Notice the quotes: without them, Mister and Noodle would have been separate arguments, and  $name  would
       have been made into a list of two elements.)

       Unlike other shells, variables are not further split after substitution:

          > mkdir $name
          > ls
          Mister Noodle

       In bash, this would have created two directories "Mister" and "Noodle". In fish, it created only one: the
       variable had the value "Mister Noodle", so that is the argument that was passed to mkdir, spaces and all.

       You can erase (or "delete") a variable with -e or --erase

          > set -e MyVariable
          > env | grep MyVariable
          (no output)

       For more, see Variable expansion.

   Exports (Shell Variables)
       Sometimes  you  need to have a variable available to an external command, often as a setting. For example
       many programs like git or man read the $PAGER variable to figure out your preferred  pager  (the  program
       that  lets  you  scroll  text). Other variables used like this include $BROWSER, $LANG (to configure your
       language) and $PATH. You'll note these are written in ALLCAPS, but that's just a convention.

       To give a variable to an external command, it needs to be "exported". This is done with a  flag  to  set,
       either --export or just -x.

          > set -x MyVariable SomeValue
          > env | grep MyVariable
          MyVariable=SomeValue

       It can also be unexported with --unexport or -u.

       This  works  the other way around as well! If fish is started by something else, it inherits that parents
       exported variables. So if your terminal emulator starts fish, and it exports $LANG  set  to  en_US.UTF-8,
       fish  will  receive that setting. And whatever started your terminal emulator also gave it some variables
       that it will then pass on unless it specifically decides not to. This is how fish  usually  receives  the
       values for things like $LANG, $PATH and $TERM, without you having to specify them again.

       Exported  variables  can  be local or global or universal - "exported" is not a scope! Usually you'd make
       them global via set -gx MyVariable SomeValue.

       For more, see Exporting variables.

   Lists
       The set command above used quotes to ensure that Mister Noodle was one  argument.  If  it  had  been  two
       arguments,  then  name  would  have  been  a list of length 2.  In fact, all variables in fish are really
       lists, that can contain any number of values, or none at all.

       Some variables, like $PWD, only have one value. By convention, we talk about that variable's  value,  but
       we really mean its first (and only) value.

       Other  variables,  like  $PATH,  really  do have multiple values. During variable expansion, the variable
       expands to become multiple arguments:

          > echo $PATH
          /usr/bin /bin /usr/sbin /sbin /usr/local/bin

       Variables whose name ends in "PATH" are automatically split on colons to become lists.  They  are  joined
       using colons when exported to subcommands. This is for compatibility with other tools, which expect $PATH
       to  use  colons.  You can also explicitly add this quirk to a variable with set --path, or remove it with
       set --unpath.

       Lists cannot contain other lists: there is no recursion.  A variable is a list of strings, full stop.

       Get the length of a list with count:

          > count $PATH
          5

       You can append (or prepend) to a list by setting the list to itself, with some additional arguments. Here
       we append /usr/local/bin to $PATH:

          > set PATH $PATH /usr/local/bin

       You can access individual elements with square brackets. Indexing starts at 1 from the beginning, and  -1
       from the end:

          > echo $PATH
          /usr/bin /bin /usr/sbin /sbin /usr/local/bin
          > echo $PATH[1]
          /usr/bin
          > echo $PATH[-1]
          /usr/local/bin

       You can also access ranges of elements, known as "slices":

          > echo $PATH[1..2]
          /usr/bin /bin
          > echo $PATH[-1..2]
          /usr/local/bin /sbin /usr/sbin /bin

       You can iterate over a list (or a slice) with a for loop:

          for val in $PATH
            echo "entry: $val"
          end
          # Will print:
          # entry: /usr/bin/
          # entry: /bin
          # entry: /usr/sbin
          # entry: /sbin
          # entry: /usr/local/bin

       One  particular  bit  is  that  you can use lists like Brace expansion. If you attach another string to a
       list, it'll combine every element of the list with the string:

          > set mydirs /usr/bin /bin
          > echo $mydirs/fish # this is just like {/usr/bin,/bin}/fish
          /usr/bin/fish /bin/fish

       This also means that, if the list is empty, there will be no argument:

          > set empty # no argument
          > echo $empty/this_is_gone # prints an empty line

       If you quote the list, it will be used as one string and so you'll get one argument even if it is empty.

       For more, see Lists.  For more on combining lists with strings  (or  even  other  lists),  see  cartesian
       products and Variable expansion.

   Wildcards
       Fish supports the familiar wildcard *. To list all JPEG files:

          > ls *.jpg
          lena.jpg
          meena.jpg
          santa maria.jpg

       You can include multiple wildcards:

          > ls l*.p*
          lena.png
          lesson.pdf

       The recursive wildcard ** searches directories recursively:

          > ls /var/**.log
          /var/log/system.log
          /var/run/sntp.log

       If that directory traversal is taking a long time, you can ctrl-c out of it.

       For more, see Wildcards.

   Pipes and Redirections
       You can pipe between commands with the usual vertical bar:

          > echo hello world | wc
                1       2      12

       stdin and stdout can be redirected via the familiar < and >. stderr is redirected with a 2>.

          > grep fish < /etc/shells > ~/output.txt 2> ~/errors.txt

       To redirect stdout and stderr into one file, you can use &>:

          > make &> make_output.txt

       For more, see Input and output redirections and Pipes.

   Command Substitutions
       Command  substitutions use the output of one command as an argument to another. Unlike other shells, fish
       does not use backticks `` for command substitutions. Instead, it  uses  parentheses  with  or  without  a
       dollar:

          > echo In (pwd), running $(uname)
          In /home/tutorial, running FreeBSD

       A common idiom is to capture the output of a command in a variable:

          > set os (uname)
          > echo $os
          Linux

       Command  substitutions  without  a dollar are not expanded within quotes, so the version with a dollar is
       simpler:

          > touch "testing_$(date +%s).txt"
          > ls *.txt
          testing_1360099791.txt

       Unlike other shells, fish does not split command substitutions on any whitespace (like spaces  or  tabs),
       only  newlines.  Usually  this  is  a  big  help  because  unix commands operate on a line-by-line basis.
       Sometimes it can be an issue with commands like pkg-config that  print  what  is  meant  to  be  multiple
       arguments on a single line. To split it on spaces too, use string split.

          > printf '%s\n' (pkg-config --libs gio-2.0)
          -lgio-2.0 -lgobject-2.0 -lglib-2.0
          > printf '%s\n' (pkg-config --libs gio-2.0 | string split -n " ")
          -lgio-2.0
          -lgobject-2.0
          -lglib-2.0

       If  you  need  a  command  substitutions  output  as one argument, without any splits, use quoted command
       substitution:

          > echo "first line
          second line" > myfile
          > set myfile "$(cat myfile)"
          > printf '|%s|' $myfile
          |first line
          second line|

       For more, see Command substitution.

   Separating Commands (Semicolon)
       Like other shells, fish allows multiple commands either on separate lines or the same line.

       To write them on the same line, use the semicolon (";").  That  means  the  following  two  examples  are
       equivalent:

          echo fish; echo chips

          # or
          echo fish
          echo chips

       This  is useful interactively to enter multiple commands. In a script it's easier to read if the commands
       are on separate lines.

   Exit Status
       When a command exits, it returns a status code as a non-negative integer (that's a whole number >= 0).

       Unlike other shells, fish stores the exit status of the last command in $status instead of $?.

          > false
          > echo $status
          1

       This indicates how the command fared - 0 usually  means  success,  while  the  others  signify  kinds  of
       failure.  For  instance  fish's set --query returns the number of variables it queried that weren't set -
       set --query PATH usually returns 0, set --query arglbargl boogagoogoo usually returns 2.

       There is also a $pipestatus list variable for the exit statuses [1] of processes in a pipe.

       For more, see The status variable.

       [1]  or "stati" if you prefer, or "statūs" if you've time-travelled from ancient Rome or work as a  latin
            teacher

   Combiners (And, Or, Not)
       fish supports the familiar && and || to combine commands, and ! to negate them:

          > ./configure && make && sudo make install

       Here,  make  is only executed if ./configure succeeds (returns 0), and sudo make install is only executed
       if both ./configure and make succeed.

       fish also supports and, or, and not. The first two are job modifiers and have lower  precedence.  Example
       usage:

          > cp file1 file1_bak && cp file2 file2_bak; and echo "Backup successful"; or echo "Backup failed"
          Backup failed

       As mentioned in the section on the semicolon, this can also be written in multiple lines, like so:

          cp file1 file1_bak && cp file2 file2_bak
          and echo "Backup successful"
          or echo "Backup failed"

   Conditionals (If, Else, Switch)
       Use if and else to conditionally execute code, based on the exit status of a command.

          if grep fish /etc/shells
              echo Found fish
          else if grep bash /etc/shells
              echo Found bash
          else
              echo Got nothing
          end

       To  compare strings or numbers or check file properties (whether a file exists or is writeable and such),
       use test, like

          if test "$fish" = "flounder"
              echo FLOUNDER
          end

          # or

          if test "$number" -gt 5
              echo $number is greater than five
          else
              echo $number is five or less
          end

          # or

          # This test is true if the path /etc/hosts exists
          # - it could be a file or directory or symlink (or possibly something else).
          if test -e /etc/hosts
              echo We most likely have a hosts file
          else
              echo We do not have a hosts file
          end

       Combiners can also be used to make more complex conditions, like

          if command -sq fish; and grep fish /etc/shells
              echo fish is installed and configured
          end

       For even more complex conditions, use begin and end to group parts of them.

       There is also a switch command:

          switch (uname)
          case Linux
              echo Hi Tux!
          case Darwin
              echo Hi Hexley!
          case FreeBSD NetBSD DragonFly
              echo Hi Beastie!
          case '*'
              echo Hi, stranger!
          end

       As you see, case does not fall through, and can accept multiple arguments or (quoted) wildcards.

       For more, see Conditions.

   Functions
       A fish function is a list of  commands,  which  may  optionally  take  arguments.  Unlike  other  shells,
       arguments are not passed in "numbered variables" like $1, but instead in a single list $argv. To create a
       function, use the function builtin:

          function say_hello
              echo Hello $argv
          end
          say_hello
          # prints: Hello
          say_hello everybody!
          # prints: Hello everybody!

       Unlike other shells, fish does not have aliases or special prompt syntax. Functions take their place. [2]

       You  can  list  the names of all functions with the functions builtin (note the plural!). fish starts out
       with a number of functions:

          > functions
          N_, abbr, alias, bg, cd, cdh, contains_seq, dirh, dirs, disown, down-or-search, edit_command_buffer, export, fg, fish_add_path, fish_breakpoint_prompt, fish_clipboard_copy, fish_clipboard_paste, fish_config, fish_default_key_bindings, fish_default_mode_prompt, fish_git_prompt, fish_hg_prompt, fish_hybrid_key_bindings, fish_indent, fish_is_root_user, fish_job_summary, fish_key_reader, fish_md5, fish_mode_prompt, fish_npm_helper, fish_opt, fish_print_git_action, fish_print_hg_root, fish_prompt, fish_sigtrap_handler, fish_svn_prompt, fish_title, fish_update_completions, fish_vcs_prompt, fish_vi_cursor, fish_vi_key_bindings, funced, funcsave, grep, help, history, hostname, isatty, kill, la, ll, ls, man, nextd, open, popd, prevd, prompt_hostname, prompt_pwd, psub, pushd, realpath, seq, setenv, suspend, trap, type, umask, up-or-search, vared, wait

       You can see the source for any function by passing its name to functions:

          > functions ls
          function ls --description 'List contents of directory'
              command ls -G $argv
          end

       For more, see Functions.

       [2]  There is a function called alias, but it's just a shortcut to make  functions.  fish  also  provides
            abbreviations, through the abbr command.

   Loops
       While loops:

          while true
              echo "Loop forever"
          end
          # Prints:
          # Loop forever
          # Loop forever
          # Loop forever
          # yes, this really will loop forever. Unless you abort it with ctrl-c.

       For loops can be used to iterate over a list. For example, a list of files:

          for file in *.txt
              cp $file $file.bak
          end

       Iterating over a list of numbers can be done with seq:

          for x in (seq 5)
              touch file_$x.txt
          end

       For more, see Loops and blocks.

   Prompt
       Unlike  other  shells,  there  is  no prompt variable like PS1. To display your prompt, fish executes the
       fish_prompt function and uses its output as the  prompt.  And  if  it  exists,  fish  also  executes  the
       fish_right_prompt function and uses its output as the right prompt.

       You can define your own prompt from the command line:

          > function fish_prompt; echo "New Prompt % "; end
          New Prompt % _

       Then,  if  you  are happy with it, you can save it to disk by typing funcsave fish_prompt. This saves the
       prompt in ~/.config/fish/functions/fish_prompt.fish. (Or, if you want, you can create that file  manually
       from the start.)

       Multiple lines are OK. Colors can be set via set_color, passing it named ANSI colors, or hex RGB values:

          function fish_prompt
              set_color purple
              date "+%m/%d/%y"
              set_color F00
              echo (pwd) '>' (set_color normal)
          end

       This prompt would look like:

          02/06/13
          /home/tutorial > _

       You  can choose among some sample prompts by running fish_config for a web UI or fish_config prompt for a
       simpler version inside your terminal.

   $PATH
       $PATH is an environment variable containing the directories that fish searches for commands. Unlike other
       shells, $PATH is a list, not a colon-delimited string.

       Fish takes care to set $PATH to a default, but typically it is just inherited from fish's parent  process
       and is set to a value that makes sense for the system - see Exports.

       To prepend /usr/local/bin and /usr/sbin to $PATH, you can write:

          > set PATH /usr/local/bin /usr/sbin $PATH

       To remove /usr/local/bin from $PATH, you can write:

          > set PATH (string match -v /usr/local/bin $PATH)

       For  compatibility  with  other  shells  and  external commands, $PATH is a path variable, and so will be
       joined with colons (not spaces) when you quote it:

          > echo "$PATH"
          /usr/local/sbin:/usr/local/bin:/usr/bin

       and it will be exported like that, and when fish starts it splits the $PATH it receives into  a  list  on
       colon.

       You can do so directly in config.fish, like you might do in other shells with .profile. See this example.

       A  faster  way  is  to  use  the fish_add_path function, which adds given directories to the path if they
       aren't already included. It does this by modifying the  $fish_user_paths  universal  variable,  which  is
       automatically prepended to $PATH. For example, to permanently add /usr/local/bin to your $PATH, you could
       write:

          > fish_add_path /usr/local/bin

       The  advantage  is  that  you don't have to go mucking around in files: just run this once at the command
       line, and it will affect the current session and all future instances too. You can also add this line  to
       config.fish, as it only adds the component if necessary.

       Or  you  can  modify  $fish_user_paths  yourself,  but  you  should  be  careful  not  to  append  to  it
       unconditionally in config.fish, or it will grow longer and longer.

   Startup (Where's .bashrc?)
       Fish starts by executing commands in ~/.config/fish/config.fish. You can create it if it does not exist.

       It is possible to directly create functions and variables in config.fish file, using the  commands  shown
       above. For example:

          > cat ~/.config/fish/config.fish

          set -x PATH $PATH /sbin/

          function ll
              ls -lh $argv
          end

       However, it is more common and efficient to use  autoloading functions and universal variables.

       If   you   want   to   organize   your  configuration,  fish  also  reads  commands  in  .fish  files  in
       ~/.config/fish/conf.d/. See Configuration Files for the details.

   Autoloading Functions
       When fish encounters a command, it attempts to autoload a function for that command,  by  looking  for  a
       file with the name of that command in ~/.config/fish/functions/.

       For   example,   if  you  wanted  to  have  a  function  ll,  you  would  add  a  text  file  ll.fish  to
       ~/.config/fish/functions:

          > cat ~/.config/fish/functions/ll.fish
          function ll
              ls -lh $argv
          end

       This is the preferred way to define your prompt as well:

          > cat ~/.config/fish/functions/fish_prompt.fish
          function fish_prompt
              echo (pwd) "> "
          end

       See the documentation for funced  and  funcsave  for  ways  to  create  these  files  automatically,  and
       $fish_function_path to control their location.

   Universal Variables
       A  universal  variable  is  a variable whose value is shared across all instances of fish, now and in the
       future – even after a reboot. You can make a variable universal with set -U:

          > set -U EDITOR vim

       Now in another shell:

          > echo $EDITOR
          vim

       You only need to set universal variables once interactively. There is no need to add them to your  config
       files. For more details, see Universal Variables.

   Ready for more?
       If  you  want  to  learn  more  about  fish, there is lots of detailed documentation, the official gitter
       channel       <https://gitter.im/fish-shell/fish-shell>,       an       official       mailing       list
       <https://lists.sourceforge.net/lists/listinfo/fish-users>,  and the github page <https://github.com/fish-
       shell/fish-shell/>.

   Writing your own completions
       To specify a completion, use the complete command. complete takes as a parameter the name of the  command
       to  specify  a  completion  for.  For  example,  to  add  a  completion for the program myprog, start the
       completion command with complete -c myprog ...

       For a  complete  description  of  the  various  switches  accepted  by  the  complete  command,  see  the
       documentation for the complete builtin, or write complete --help inside the fish shell.

       To  provide a list of possible completions for myprog, use the -a switch. If myprog accepts the arguments
       start and stop, this can be specified as complete -c myprog -a 'start  stop'.  The  argument  to  the  -a
       switch  is  always  a  single  string.  At  completion time, it will be tokenized on spaces and tabs, and
       variable expansion, command substitution and other forms of parameter expansion will take place:

          # If myprog can list the valid outputs with the list-outputs subcommand:
          complete -c myprog -l output -a '(myprog list-outputs)'

       fish has a special syntax to support specifying switches accepted by a command. The switches -s,  -l  and
       -o  are  used  to specify a short switch (single character, such as -l), a gnu style long switch (such as
       --color) and an old-style long switch (with one -, like -shuffle), respectively. If the command  'myprog'
       has an option that can be written as -o or --output, that is:

          complete -c myprog -s o -l output

       If  this  option  takes  an  optional  argument,  you  would also add --argument or -a, and give that the
       possible arguments:

          complete -c myprog -s o -l output -a "yes no"

       This offers the arguments "yes" and "no" for:

          > myprog -o<TAB>
          > myprog --output=<TAB>

       By default, option arguments are optional, so the candidates are  only  offered  directly  attached  like
       that, so they aren't given in this case:

          > myprog -o <TAB>

       Usually options require a parameter, so you would give --require-parameter / -r:

          complete -c myprog -s o -l output -ra "yes no"

       which offers yes/no in these cases:

          > myprog -o<TAB>
          > myprog --output=<TAB>
          > myprog -o <TAB>
          > myprog --output <TAB>

       Fish  will  also  offer  files  by  default, in addition to the arguments you specified. You would either
       inhibit file completion for a single option:

          complete -c myprog -s o -l output --no-files -ra "yes no"

       or with a specific condition:

          complete -c myprog -f --condition '__fish_seen_subcommand_from somesubcommand'

       or you can disable file completions globally for the command:

          complete -c myprog -f

       If you have disabled them globally, you can enable them just for a specific condition or option with  the
       --force-files / -F option:

          # Disable files by default
          complete -c myprog -f
          # but reenable them for --config-file
          complete -c myprog -l config-file --force-files -r

       As a more comprehensive example, here's a commented excerpt of the completions for systemd's timedatectl:

          # All subcommands that timedatectl knows - this is useful for later.
          set -l commands status set-time set-timezone list-timezones set-local-rtc set-ntp

          # Disable file completions for the entire command
          # because it does not take files anywhere
          # Note that this can be undone by using "-F".
          #
          # File completions also need to be disabled
          # if you want to have more control over what files are offered
          # (e.g. just directories, or just files ending in ".mp3").
          complete -c timedatectl -f

          # This line offers the subcommands
          # -"status",
          # -"set-timezone",
          # -"set-time"
          # -"list-timezones"
          # if no subcommand has been given so far.
          #
          # The `-n`/`--condition` option takes script as a string, which it executes.
          # If it returns true, the completion is offered.
          # Here the condition is the `__fish_seen_subcommands_from` helper function.
          # It returns true if any of the given commands is used on the commandline,
          # as determined by a simple heuristic.
          # For more complex uses, you can write your own function.
          # See e.g. the git completions for an example.
          #
          complete -c timedatectl -n "not __fish_seen_subcommand_from $commands" \
              -a "status set-time set-timezone list-timezones"

          # If the "set-timezone" subcommand is used,
          # offer the output of `timedatectl list-timezones` as completions.
          # Each line of output is used as a separate candidate,
          # and anything after a tab is taken as the description.
          # It's often useful to transform command output with `string` into that form.
          complete -c timedatectl -n "__fish_seen_subcommand_from set-timezone" \
              -a "(timedatectl list-timezones)"

          # Completion candidates can also be described via `-d`,
          # which is useful if the description is constant.
          # Try to keep these short, because that means the user gets to see more at once.
          complete -c timedatectl -n "not __fish_seen_subcommand_from $commands" \
              -a "set-local-rtc" -d "Maintain RTC in local time"

          # We can also limit options to certain subcommands by using conditions.
          complete -c timedatectl -n "__fish_seen_subcommand_from set-local-rtc" \
              -l adjust-system-clock -d 'Synchronize system clock from the RTC'

          # These are simple options that can be used everywhere.
          complete -c timedatectl -s h -l help -d 'Print a short help text and exit'
          complete -c timedatectl -l version -d 'Print a short version string and exit'
          complete -c timedatectl -l no-pager -d 'Do not pipe output into a pager'

       For   examples   of   how   to   write   your   own   complex   completions,  study  the  completions  in
       /usr/share/fish/completions. (The exact path depends on  your  chosen  installation  prefix  and  may  be
       slightly different)

   Useful functions for writing completions
       fish  ships  with several functions that may be useful when writing command-specific completions. Most of
       these function names begin with the string __fish_. Such functions are internal to fish  and  their  name
       and interface may change in future fish versions. A few of these functions are described here.

       Functions beginning with the string __fish_print_ print a newline separated list of strings. For example,
       __fish_print_filesystems   prints   a   list   of  all  known  file  systems.  Functions  beginning  with
       __fish_complete_ print out a newline separated list of completions with descriptions. The description  is
       separated from the completion by a tab character.

       • __fish_complete_directories  STRING  DESCRIPTION  performs  path  completion  on  STRING, allowing only
         directories, and giving them the description DESCRIPTION.

       • __fish_complete_path STRING DESCRIPTION performs path completion on STRING, giving them the description
         DESCRIPTION.

       • __fish_complete_groups prints a list of all user groups with the groups members as description.

       • __fish_complete_pids prints a list of all processes IDs with the command name as description.

       • __fish_complete_suffix SUFFIX performs file completion but sorts files ending in SUFFIX first. This  is
         useful in conjunction with complete --keep-order.

       • __fish_complete_users prints a list of all users with their full name as description.

       • __fish_print_filesystems prints a list of all known file systems. Currently, this is a static list, and
         not dependent on what file systems the host operating system actually understands.

       • __fish_print_hostnames  prints  a list of all known hostnames. This function searches the fstab for nfs
         servers, ssh for known hosts and checks the /etc/hosts file.

       • __fish_print_interfaces prints a list of all known network interfaces.

   Where to put completions
       Completions can be defined on the  commandline  or  in  a  configuration  file,  but  they  can  also  be
       automatically  loaded.  Fish  automatically  searches  through  any  directories  in  the  list  variable
       $fish_complete_path, and any completions defined are automatically loaded when needed. A completion  file
       must have a filename consisting of the name of the command to complete and the suffix .fish.

       By default, Fish searches the following for completions, using the first available file that it finds:

       • A directory for end-users to keep their own completions, usually ~/.config/fish/completions (controlled
         by the XDG_CONFIG_HOME environment variable);

       • A  directory  for  systems  administrators  to install completions for all users on the system, usually
         /etc/fish/completions;

       • A     user-specified     directory      for      third-party      vendor      completions,      usually
         ~/.local/share/fish/vendor_completions.d (controlled by the XDG_DATA_HOME environment variable);

       • A  directory for third-party software vendors to ship their own completions for their software, usually
         /usr/share/fish/vendor_completions.d;

       • The completions shipped with fish, usually installed in /usr/share/fish/completions; and

       • Completions  automatically  generated  from  the  operating  system's   manual,   usually   stored   in
         ~/.cache/fish/generated_completions (controlled by XDG_CACHE_HOME environment variable).

       These  paths  are  controlled  by  parameters  set  at build, install, or run time, and may vary from the
       defaults listed above.

       This  wide  search  may  be  confusing.  If  you  are  unsure,  your  completions  probably   belong   in
       ~/.config/fish/completions.

       If  you  have  written  new  completions  for a common Unix command, please consider sharing your work by
       submitting it via the instructions in Further help and development.

       If you are developing another program and would like to ship completions with your program, install  them
       to  the  "vendor"  completions  directory.  As  this  path  may vary from system to system, the pkgconfig
       framework should be used to discover this path with the output of  pkg-config  --variable  completionsdir
       fish.

   Writing your own prompt
       WARNING:
          This  document  uses  formatting to show what a prompt would look like. If you are viewing this in the
          man page, you probably want to switch to looking at the html version instead. Run  help  custom-prompt
          to view it in a web browser.

       Fish ships a number of prompts that you can view with the fish_config command, and many users have shared
       their prompts online.

       However,  you  can  also  write your own, or adjust an existing prompt. This is a good way to get used to
       fish's scripting language.

       Unlike other shells, fish's prompt is built by running a function - fish_prompt. Or,  more  specifically,
       three functions:

       • fish_prompt, which is the main prompt function

       • fish_right_prompt, which is shown on the right side of the terminal.

       • fish_mode_prompt, which is shown if vi mode is used.

       These functions are run, and whatever they print is displayed as the prompt (minus one trailing newline).

       Here, we will just be writing a simple fish_prompt.

   Our first prompt
       Let's look at a very simple example:

          function fish_prompt
              echo $PWD '>'
          end

       This  prints  the  current working directory (PWD) and a > symbol to show where the prompt ends. The > is
       quoted because otherwise it would signify a redirection.

       Because we've used echo, it adds spaces between the two so it ends up looking like (assuming  _  is  your
       cursor):

          /home/tutorial >_

   Formatting
       echo adds spaces between its arguments. If you don't want those, you can use string join like this:

          function fish_prompt
              string join '' -- $PWD '>'
          end

       The  -- indicates to string that no options can come after it, in case we extend this with something that
       can start with a -.

       There are other ways to remove the space, including echo -s and printf.

   Adding color
       This prompt is functional, but a bit boring. We could add some color.

       Fortunately, fish offers the set_color command, so you can do:

          echo (set_color red)foo

       set_color can also handle RGB colors like set_color 23b455, and other formatting options  including  bold
       and italics.

       So, taking our previous prompt and adding some color:

          function fish_prompt
              string join '' -- (set_color green) $PWD (set_color normal) '>'
          end

       A "normal" color tells the terminal to go back to its normal formatting options.

       set_color  works  by  producing  an  escape  sequence,  which  is  a special piece of text that terminals
       interpret as instructions - for example, to change color. So set_color red produces the same effect as:

          echo \e\[31m

       Although you can write your own escape sequences by hand, it's much easier to use set_color.

   Shortening the working directory
       This is fine, but our PWD can be a bit long, and we  are  typically  only  interested  in  the  last  few
       directories.  We  can  shorten  this  with  the  prompt_pwd  helper that will give us a shortened working
       directory:

          function fish_prompt
              string join '' -- (set_color green) (prompt_pwd) (set_color normal) '>'
          end

       prompt_pwd takes options to control how much to shorten. For instance, if we want to display the last two
       directories, we'd use prompt_pwd --full-length-dirs 2:

          function fish_prompt
              string join '' -- (set_color green) (prompt_pwd --full-length-dirs 2) (set_color normal) '>'
          end

       With a current directory of "/home/tutorial/Music/Lena Raine/Oneknowing", this would print

          ~/M/Lena Raine/Oneknowing>_

   Status
       One important bit of information that every command returns is the status. This is a whole number from  0
       to  255,  and  usually  it is used as an error code - 0 if the command returned successfully, or a number
       from 1 to 255 if not.

       It's useful to display this in your prompt, but showing it when it's 0 seems kind of wasteful.

       First of all, since every command (except for set) changes the status, you need to store it for later use
       as the first thing in your prompt. Use a local variable so it will be confined to your prompt function:

          set -l last_status $status

       And after that, you can set a string if it is not zero:

          # Prompt status only if it's not 0
          set -l stat
          if test $last_status -ne 0
              set stat (set_color red)"[$last_status]"(set_color normal)
          end

       And to print it, we add it to our string join:

          string join '' -- (set_color green) (prompt_pwd) (set_color normal) $stat '>'

       If $last_status was 0, $stat is empty, and so it will simply disappear.

       So our entire prompt is now:

          function fish_prompt
              set -l last_status $status
              # Prompt status only if it's not 0
              set -l stat
              if test $last_status -ne 0
                  set stat (set_color red)"[$last_status]"(set_color normal)
              end

              string join '' -- (set_color green) (prompt_pwd) (set_color normal) $stat '>'
          end

       And it looks like:

          ~/M/L/Oneknowing[1]>_

       after we run false (which returns 1).

   Save the prompt
       Once you are happy with your prompt, you can save it with funcsave fish_prompt (see funcsave -  save  the
       definition    of    a    function    to    the    user's    autoload    directory)   or   write   it   to
       ~/.config/fish/functions/fish_prompt.fish yourself.

       If you want to edit it again, open that file or use funced fish_prompt (see  funced  -  edit  a  function
       interactively).

   Where to go from here?
       We have now built a simple but working and usable prompt, but of course more can be done.

       •

         Fish offers more helper functions:prompt_login  to  describe the user/hostname/container or prompt_hostname to describe just the
                  host

                • fish_is_root_user to help with changing the symbol for root.

                • fish_vcs_prompt to show version control information (or  fish_git_prompt  /  fish_hg_prompt  /
                  fish_svn_prompt to limit it to specific systems)

       • You  can  add  a  right  prompt  by  changing  fish_right_prompt  or  a  vi  mode  prompt  by  changing
         fish_mode_prompt.

       •

         Some prompts have interesting or advanced features

                • Add the time when the prompt was printed

                • Show various integrations like python's venv

                • Color the parts differently.

       You can look at fish's sample prompts for inspiration. Open up fish_config, find one you  like  and  pick
       it. For example:

          fish_config prompt show # <- shows all the sample prompts
          fish_config prompt choose disco # <- this picks the "disco" prompt for this session
          funced fish_prompt # <- opens fish_prompt in your editor, and reloads it once the editor exits

   Design
       This  is  a  description of the design principles that have been used to design fish. The fish design has
       three high level goals. These are:

       1. Everything that can be done in other shell languages should be possible to do in fish, though fish may
          rely on external commands in doing so.

       2. Fish should be user-friendly, but not at the expense of expressiveness. Most tradeoffs  between  power
          and ease of use can be avoided with careful design.

       3. Whenever possible without breaking the above goals, fish should follow POSIX.

       To achieve these high-level goals, the fish design relies on a number of more specific design principles.
       These are presented below, together with a rationale and a few examples for each.

   The law of orthogonality
       The  shell  language should have a small set of orthogonal features. Any situation where two features are
       related but not identical, one of them should be removed, and the  other  should  be  made  powerful  and
       general enough to handle all common use cases of either feature.

       Rationale:  Related  features make the language larger, which makes it harder to learn. It also increases
       the size of the source code, making the program harder to maintain and update.

       Examples:

       • Here documents are too similar to using echo inside of a pipeline.

       • Subshells, command substitution and process substitution  are  strongly  related.  fish  only  supports
         command substitution, the others can be achieved either using a block or the psub shellscript function.

       • Having  both  aliases  and  functions  is confusing, especially since both of them have limitations and
         problems. fish functions have none of the drawbacks of either syntax.

       • The many Posix quoting styles are silly, especially $.

   The law of responsiveness
       The shell should attempt to remain responsive to the user at all times, even in the face of contended  or
       unresponsive  filesystems. It is only acceptable to block in response to a user initiated action, such as
       running a command.

       Rationale: Bad performance increases user-facing complexity, because it trains  users  to  recognize  and
       route around slow use cases. It is also incredibly frustrating.

       Examples:

       • Features   like   syntax   highlighting  and  autosuggestions  must  perform  all  of  their  disk  I/O
         asynchronously.

       • Startup should minimize forks and disk I/O, so that fish can be started even if  the  system  is  under
         load.

   Configurability is the root of all evil
       Every  configuration  option  in  a  program is a place where the program is too stupid to figure out for
       itself what the user really wants, and should be considered  a  failure  of  both  the  program  and  the
       programmer who implemented it.

       Rationale:  Different  configuration  options  are a nightmare to maintain, since the number of potential
       bugs caused by specific configuration combinations quickly becomes an issue. Configuration options  often
       imply assumptions about the code which change when reimplementing the code, causing issues with backwards
       compatibility. But mostly, configuration options should be avoided since they simply should not exist, as
       the program should be smart enough to do what is best, or at least a good enough approximation of it.

       Examples:

       • Fish  allows  the  user to set various syntax highlighting colors. This is needed because fish does not
         know what colors the terminal uses by default, which might make  some  things  unreadable.  The  proper
         solution  would be for text color preferences to be defined centrally by the user for all programs, and
         for the terminal emulator to send these color properties to fish.

       • Fish does not allow you to set the number of history  entries,  different  language  substyles  or  any
         number of other common shell configuration options.

       A  special  note  on  the evils of configurability is the long list of very useful features found in some
       shells, that are not turned on by default. Both zsh and bash support command-specific completions, but no
       such completions are shipped with bash by default, and they are turned  off  by  default  in  zsh.  Other
       features  that  zsh  supports  that  are disabled by default include tab-completion of strings containing
       wildcards, a sane completion pager and a history file.

   The law of user focus
       When designing a program, one should first think about how to make an  intuitive  and  powerful  program.
       Implementation issues should only be considered once a user interface has been designed.

       Rationale:  This  design  rule  is  different than the others, since it describes how one should go about
       designing new features, not what the features should be. The problem with focusing on what can  be  done,
       and  what is easy to do, is that too much of the implementation is exposed. This means that the user must
       know a great deal about the underlying system to be able to guess how the shell works, it also means that
       the language will often be rather low-level.

       Examples:

       • There should only be one type of input to  the  shell,  lists  of  commands.  Loops,  conditionals  and
         variable assignments are all performed through regular commands.

       • The  differences  between  built-in  commands  and  shellscript  functions  should  be made as small as
         possible. Built-ins and shellscript functions should have exactly the same types of argument  expansion
         as  other commands, should be possible to use in any position in a pipeline, and should support any I/O
         redirection.

       • Instead of forking when performing command substitution to provide a  fake  variable  scope,  all  fish
         commands are performed from the same process, and fish instead supports true scoping.

       • All blocks end with the end built-in.

   The law of discoverability
       A program should be designed to make its features as easy as possible to discover for the user.

       Rationale: A program whose features are discoverable turns a new user into an expert in a shorter span of
       time, since the user will become an expert on the program simply by using it.

       The  main  benefit  of  a  graphical  program  over a command-line-based program is discoverability. In a
       graphical program, one can discover all the common features by simply looking at the user  interface  and
       guessing what the different buttons, menus and other widgets do. The traditional way to discover features
       in  command-line  programs  is  through  manual  pages.  This requires both that the user starts to use a
       different program, and then they remember the new information until the  next  time  they  use  the  same
       program.

       Examples:

       • Everything should be tab-completable, and every tab completion should have a description.

       • Every syntax error and error in a built-in command should contain an error message describing what went
         wrong  and  a  relevant  help  page.  Whenever  possible,  errors  should  be flagged red by the syntax
         highlighter.

       • The help manual should be easy to read, easily available from the  shell,  complete  and  contain  many
         examples

       • The  language  should  be  uniform, so that once the user understands the command/argument syntax, they
         will know the whole language, and be able to use tab-completion to discover new features.

   Release notes
   fish 4.0.2 (released April 20, 2025)
       This release of fish fixes a number of issues identified in fish 4.0.1:

       • Completions are  quoted,  rather  than  backslash-escaped,  only  if  the  completion  is  unambiguous.
         Continuing   to  edit  the  token  is  therefore  easier  (#11271  <https://github.com/fish-shell/fish-
         shell/issues/11271>). This changes the behavior introduced in 4.0.0 where all completions were quoted.

       • The warning when the terminfo database can't be found has been downgraded to a log message.  fish  will
         act  as if the terminal behaves like xterm-256color, which is correct for the vast majority of cases (‐
         #11277   <https://github.com/fish-shell/fish-shell/issues/11277>,   #11290    <https://github.com/fish-
         shell/fish-shell/issues/11290>).

       • Key  combinations  using  the  super (Windows/command) key can now (actually) be bound using the super-
         prefix (#11217 <https://github.com/fish-shell/fish-shell/issues/11217>). This was listed in the release
         notes for 4.0.1 but did not work correctly.

       • function is stricter about argument parsing, rather than allowing additional parameters to be  silently
         ignored (#11295 <https://github.com/fish-shell/fish-shell/issues/11295>).

       • Using  parentheses in the test builtin works correctly, following a regression in 4.0.0 where they were
         not recognized (#11387 <https://github.com/fish-shell/fish-shell/issues/11387>).

       • delete in Vi mode when Num  Lock  is  active  will  work  correctly  (#11303  <https://github.com/fish-
         shell/fish-shell/issues/11303>).

       • Abbreviations    cannot    alter    the    command-line    contents,   preventing   a   crash   (#11324
         <https://github.com/fish-shell/fish-shell/issues/11324>).

       • Improvements   to   various   completions,   including   new   completions   for    wl-randr    (#11301
         <https://github.com/fish-shell/fish-shell/issues/11301>),    performance    improvements    for   cargo
         completions    by    avoiding    network    requests    (#11347    <https://github.com/fish-shell/fish-
         shell/issues/11347>),  and  other  improvements for  btrfs (#11320 <https://github.com/fish-shell/fish-
         shell/issues/11320>), cryptsetup (#11315 <https://github.com/fish-shell/fish-shell/issues/11315>),  git
         (#11319   <https://github.com/fish-shell/fish-shell/issues/11319>,   #11322   <https://github.com/fish-
         shell/fish-shell/issues/11322>, #11323 <https://github.com/fish-shell/fish-shell/issues/11323>), jj  (‐
         #11046    <https://github.com/fish-shell/fish-shell/issues/11046>),    and    systemd-analyze   (#11314
         <https://github.com/fish-shell/fish-shell/issues/11314>).

       • The Mercurial (hg) prompt can handle working directories that contain an embedded newline, rather  than
         producing errors (#11348 <https://github.com/fish-shell/fish-shell/issues/11348>).

       • A  number  of crashes have been fixed. Triggers include prompts containing backspace characters (#11280
         <https://github.com/fish-shell/fish-shell/issues/11280>),     history     pager     search      (#11355
         <https://github.com/fish-shell/fish-shell/issues/11355>),     invalid    UTF-8    in    read    (#11383
         <https://github.com/fish-shell/fish-shell/issues/11383>),  and  the  kill-selection   binding   (#11367
         <https://github.com/fish-shell/fish-shell/issues/11367>).

       • A  race  condition  in  the  test  suite  has  been  fixed (#11254 <https://github.com/fish-shell/fish-
         shell/issues/11254>), and a test for  fish  versioning  relaxed  to  support  downstream  distributors'
         modifications (#11173 <https://github.com/fish-shell/fish-shell/issues/11173>).

       • Small             improvements            to            the            documentation            (#11264
         <https://github.com/fish-shell/fish-shell/issues/11264>,  #11329   <https://github.com/fish-shell/fish-
         shell/issues/11329>, #11361 <https://github.com/fish-shell/fish-shell/issues/11361>).

                                                         ----

   fish 4.0.1 (released March 12, 2025)
       This release of fish includes the following improvements compared to fish 4.0.0:

       • Key  combinations  using  the  super (Windows/command) key can be bound using the super- prefix (#11217
         <https://github.com/fish-shell/fish-shell/issues/11217>).

       • Konsole's menu shows the "Open folder with" option again  (#11198  <https://github.com/fish-shell/fish-
         shell/issues/11198>).

       •

         $fish_color_search_match will now only be applied to the foreground color if it has an explicit
         foreground. For example, this allows setting::
                set -g fish_color_search_match --reverse

       • Cursor  shape commands (\e[2 q) are no longer sent in non-interactive shells or in redirections (#11255
         <https://github.com/fish-shell/fish-shell/issues/11255>).

       • status gained a is-interactive-read subcommand, to check whether the script is  being  called  from  an
         interactive read invocation.

       • fish's  background  tasks  are  now started in a way that avoids an error on macOS Terminal.app (#11181
         <https://github.com/fish-shell/fish-shell/issues/11181>).

       • Using key combinations within qemu should work correctly.

       • Prompts containing control characters no longer  cause  incorrect  display  of  command  lines  (#11252
         <https://github.com/fish-shell/fish-shell/issues/11252>).

       • Cancelling  the  command-line  in  Vi  mode  displays correctly again (#11261 <https://github.com/fish-
         shell/fish-shell/issues/11261>).

       • The acidhub prompt properly displays the git branch again (#11179  <https://github.com/fish-shell/fish-
         shell/issues/11179>).

       • Completions  for  wine  correctly  include  files  again  (#11202  <https://github.com/fish-shell/fish-
         shell/issues/11202>).

       • On macOS, paths from /etc/paths and /etc/manpaths  containing  colons  are  handled  correctly  (#10684
         <https://github.com/fish-shell/fish-shell/issues/10684>).  This functionality was included in the 4.0.0
         release notes but was missing from the source code.

       • The XTerm modifyOtherKeys keyboard encoding is no longer used  under  WezTerm,  as  it  does  not  work
         correctly in all layouts (#11204 <https://github.com/fish-shell/fish-shell/issues/11204>).

       • kbd:option-left  and  other  similar  keys  should  now work in iTerm versions before 3.5.12; the kitty
         keyboard protocol is  now  disabled  on  these  versions  (#11192  <https://github.com/fish-shell/fish-
         shell/issues/11192>).

       • The  kitty  keyboard protocol is no longer used under Midnight Commander, as it does not work correctly
         (#10640 <https://github.com/fish-shell/fish-shell/issues/10640>).

       • fish now sends the commandline along with the OSC 133 semantic  prompt  command  start  sequence.  This
         fixes a test in the kitty terminal (#11203 <https://github.com/fish-shell/fish-shell/issues/11203>).

       • Git  completions  for  third-party  commands  like  "git-absorb"  are completed correctly again (#11205
         <https://github.com/fish-shell/fish-shell/issues/11205>).

       • Completions for diskutil  no  longer  produce  an  error  (#11201  <https://github.com/fish-shell/fish-
         shell/issues/11201>).

       • The   output  of  certain  error  messages  no  longer  prints  newlines  to  standard  output  (#11248
         <https://github.com/fish-shell/fish-shell/issues/11248>).

       • A  number  of  crashes  have  been  fixed,  including  file  names  longer  than  255   bytes   (#11221
         <https://github.com/fish-shell/fish-shell/issues/11221>),  using  fish  on  a  btrfs filesystem (#11219
         <https://github.com/fish-shell/fish-shell/issues/11219>), history files that do not have  the  expected
         format  (#11236  <https://github.com/fish-shell/fish-shell/issues/11236>),  and  pasting  into an empty
         command line (#11256 <https://github.com/fish-shell/fish-shell/issues/11256>).

                                                         ----

   fish 4.0.0 (released February 27, 2025)
       fish's  core  code  has  been  ported  from  C++  to  Rust  (#9512   <https://github.com/fish-shell/fish-
       shell/issues/9512>).  This  means  a  large  change in dependencies and how to build fish. However, there
       should be no direct impact on users. Packagers should see the For Distributors section at the end.

   Notable backwards-incompatible changes
       • As part of a larger binding rework, bind gained a new key notation.  In most  cases  the  old  notation
         should  keep  working,  but  in  rare  cases  you  may  have to change a bind invocation to use the new
         notation.  See below for details.

       • ctrl-c now calls a new bind function called clear-commandline. The old behavior, which  leaves  a  "^C"
         marker,    is    available    as    cancel-commandline   (#10935   <https://github.com/fish-shell/fish-
         shell/issues/10935>)

       • random will produce different values from previous versions of fish when used with the same  seed,  and
         will work more sensibly with small seed numbers.  The seed was never guaranteed to give the same result
         across  systems,  so  we  do  not  expect  this to have a large impact (#9593 <https://github.com/fish-
         shell/fish-shell/issues/9593>).

       • Variables in command position that expand to a subcommand keyword are now forbidden  to  fix  a  likely
         user   error.    For  example,  set  editor  command  emacs;  $editor  is  no  longer  allowed  (#10249
         <https://github.com/fish-shell/fish-shell/issues/10249>).

       • functions --handlers will now list handlers in a different order.  Now it is definition order, first to
         last, where before it was last to first.  This was never specifically defined,  and  we  recommend  not
         relying on a specific order (#9944 <https://github.com/fish-shell/fish-shell/issues/9944>).

       • The  qmark-noglob  feature,  introduced in fish 3.0, is enabled by default. That means ? will no longer
         act as a single-character glob.  You can, for the time being, turn it back on by adding no-qmark-noglob
         to fish_features and restarting fish:

            set -Ua fish_features no-qmark-noglob

         The flag will eventually be made read-only, making it impossible to turn off.

       • Terminals that fail to  ignore  unrecognized  OSC  or  CSI  sequences  may  display  garbage.  We  know
         cool-retro-term and emacs' ansi-term are affected, but most mainstream terminals are not.

       • fish  no  longer searches directories from the Windows system/user $PATH environment variable for Linux
         executables. To execute Linux binaries by name (i.e. not with a  relative  or  absolute  path)  from  a
         Windows  folder,  make  sure  the  /mnt/c/... path is explicitly added to $fish_user_paths and not just
         automatically   appended   to   $PATH   by   wsl.exe    (#10506    <https://github.com/fish-shell/fish-
         shell/issues/10506>).

       • Under  Microsoft  Windows  Subsystem  for  Linux  1  (not  WSL 2), backgrounded jobs that have not been
         disowned and do not terminate on their own after a SIGHUP + SIGCONT sequence will be explicitly  killed
         by fish on exit (after the usual prompt to close or disown them) to work around a WSL 1 deficiency that
         sees  backgrounded  processes  that  run  into  SIGTTOU remain in a suspended state indefinitely (#5263
         <https://github.com/fish-shell/fish-shell/issues/5263>).  The  workaround  is  to   explicitly   disown
         processes you wish to outlive the shell session.

   Notable improvements and fixes
       • fish   now   requests   XTerm's   modifyOtherKeys  keyboard  encoding  and  kitty  keyboard  protocol's
         <https://sw.kovidgoyal.net/kitty/keyboard-protocol/>       progressive       enhancements       (#10359
         <https://github.com/fish-shell/fish-shell/issues/10359>).   Depending  on terminal support, this allows
         to binding more key combinations, including arbitrary combinations of modifiers ctrl,  alt  and  shift,
         and distinguishing (for example) ctrl-i from tab.

         Additionally,  bind  now supports a human-readable syntax in addition to byte sequences.  This includes
         modifier names, and names for keys like enter and backspace.  For example

         • bind up 'do something' binds the up-arrow key instead of a two-key sequence ("u" and then "p")

         • bind ctrl-x,alt-c 'do something' binds a sequence of two keys.

         Any key argument that starts with an ASCII control character (like \e or \cX) or is up to 3  characters
         long,  not  a  named  key,  and  does  not contain , or - will be interpreted in the old syntax to keep
         compatibility for the majority of bindings.

         Keyboard protocols can be turned off by disabling the "keyboard-protocols" feature flag:

            set -Ua fish_features no-keyboard-protocols

         This is a temporary measure to work around buggy terminals (#11056 <https://github.com/fish-shell/fish-
         shell/issues/11056>), which appear to be relatively rare.  Use this if something  like  "=0"  or  "=5u"
         appears in your commandline mysteriously.

       • fish  can  now  be  built  as  a  self-installing  binary  (#10367 <https://github.com/fish-shell/fish-
         shell/issues/10367>). That means it can be easily built on one system and copied to another,  where  it
         can extract supporting files.  To do this, run:

            cargo install --path . # in a clone of the fish repository
            # or `cargo build --release` and copy target/release/fish{,_indent,_key_reader} wherever you want

         The    first    time   it   runs   interactively,   it   will   extract   all   the   data   files   to
         ~/.local/share/fish/install/. A specific path can be used for the data files with  fish  --install=PATH
         To uninstall, remove the fish binaries and that directory.

         This build system is experimental; the main build system, using cmake, remains the recommended approach
         for packaging and installation to a prefix.

       • A new function fish_should_add_to_history can be overridden to decide whether a command should be added
         to the history (#10302 <https://github.com/fish-shell/fish-shell/issues/10302>).

       • Bindings  can  now  mix  special  input  functions  and  shell  commands,  so  bind  ctrl-g expand-abbr
         "commandline -i \n" works as expected (#8186 <https://github.com/fish-shell/fish-shell/issues/8186>).

       • Special input functions run from bindings via commandline -f are now applied  immediately,  instead  of
         after  the currently executing binding (#3031 <https://github.com/fish-shell/fish-shell/issues/3031>, ‐
         #10126 <https://github.com/fish-shell/fish-shell/issues/10126>).   For  example,  commandline  -i  foo;
         commandline | grep foo succeeds now.

       • Undo  history  is  no  longer  truncated  after  every  command, but kept for the lifetime of the shell
         process.

       • The  ctrl-r  history  search  now  uses  glob   syntax   (#10131   <https://github.com/fish-shell/fish-
         shell/issues/10131>).

       • The  ctrl-r  history  search now operates only on the line or command substitution at cursor, making it
         easier to combine commands from history (#9751 <https://github.com/fish-shell/fish-shell/issues/9751>).

       • Abbreviations can now be restricted to specific commands. For instance:

            abbr --add --command git back 'reset --hard HEAD^'

         will  expand  "back"  to  reset  --hard  HEAD^,   but   only   when   the   command   is   git   (#9411
         <https://github.com/fish-shell/fish-shell/issues/9411>).

   Deprecations and removed featurescommandline  --tokenize (short option -o) has been deprecated in favor of commandline --tokens-expanded
         (short option -x) which expands variables and other shell syntax, removing the  need  to  use  eval  in
         completion scripts (#10212 <https://github.com/fish-shell/fish-shell/issues/10212>).

       • Two new feature flags:

         • remove-percent-self  (see status features) disables PID expansion of %self, which has been supplanted
           by $fish_pid (#10262 <https://github.com/fish-shell/fish-shell/issues/10262>).

         • test-require-arg disables test's one-argument mode. That means test -n without an additional argument
           will return false, test -z will keep returning true. Any other option without an  argument,  anything
           that  is not an option and no argument will be an error. This also goes for [, test's alternate name.
           This is a frequent source of confusion and so we are breaking with POSIX explicitly in  this  regard.
           In  addition to the feature flag, there is a debug category "deprecated-test". Running fish with fish
           -d deprecated-test will show warnings whenever a test invocation that would change is  used.  (#10365
           <https://github.com/fish-shell/fish-shell/issues/10365>).

         These can be enabled with:

            set -Ua fish_features remove-percent-self test-require-arg

         We intend to enable them by default in future, and after that eventually make them read-only.

       • Specifying key names as terminfo names (using the bind -k syntax) is deprecated and may be removed in a
         future version.

       • When  a  terminal  pastes  text into fish using bracketed paste, fish used to switch to a special paste
         bind mode.  This bind mode has been removed. The behavior on paste is no longer configurable.

       • When an interactive fish is stopped or terminated by  a  signal  that  cannot  be  caught  (SIGSTOP  or
         SIGKILL),  it  may  leave  the  terminal  in  a state where keypresses with modifiers are sent as CSI u
         sequences, instead of traditional control  characters  or  escape  sequences  that  are  recognized  by
         Readline  and  compatible  programs,  such  as bash and python.  If this happens, you can use the reset
         command from ncurses to restore the terminal state.

       • fish_key_reader --verbose no longer shows timing information.

       • Terminal information is no longer read from hashed terminfo databases,  or  termcap  databases  (#10269
         <https://github.com/fish-shell/fish-shell/issues/10269>). The vast majority of systems use a non-hashed
         terminfo database, which is still supported.

       • source    returns    an    error   if   used   without   a   filename   or   pipe/redirection   (#10774
         <https://github.com/fish-shell/fish-shell/issues/10774>).

   Scripting improvementsfor  loops  will  no  longer  remember  local   variables   from   the   previous   iteration   (#10525
         <https://github.com/fish-shell/fish-shell/issues/10525>).

       • A  new  history  append  subcommand  appends  a  command  to  the  history, without executing it (#4506
         <https://github.com/fish-shell/fish-shell/issues/4506>).

       • A new redirection: <? /path/to/file will try opening the file as  input,  and  if  it  doesn't  succeed
         silently  uses  /dev/null  instead.   This  can help with checks like test -f /path/to/file; and string
         replace foo bar < /path/to/file. (#10387 <https://github.com/fish-shell/fish-shell/issues/10387>)

       • A new option  commandline  --tokens-raw  prints  a  list  of  tokens  without  any  unescaping  (#10212
         <https://github.com/fish-shell/fish-shell/issues/10212>).

       • A new option commandline --showing-suggestion tests whether an autosuggestion is currently displayed (‐
         #10586 <https://github.com/fish-shell/fish-shell/issues/10586>).

       • functions  and  type  now  show  that  a function was copied and its source, rather than solely Defined
         interactively (#6575 <https://github.com/fish-shell/fish-shell/issues/6575>).

       • Stack trace now shows line numbers for  copied  functions  (#6575  <https://github.com/fish-shell/fish-
         shell/issues/6575>).

       • foo  &  &&  bar is now a syntax error, like in other shells (#9911 <https://github.com/fish-shell/fish-
         shell/issues/9911>).

       • if  -e  foo;  end  now  prints  a  more  accurate  error  (#10000  <https://github.com/fish-shell/fish-
         shell/issues/10000>).

       • cd  into  a  directory  that  is  not readable but accessible (permissions --x) is now possible (#10432
         <https://github.com/fish-shell/fish-shell/issues/10432>).

       • An integer  overflow  in  string  repeat  leading  to  a  near-infinite  loop  has  been  fixed  (#9899
         <https://github.com/fish-shell/fish-shell/issues/9899>).

       • string  shorten behaves better in the presence of non-printable characters, including fixing an integer
         overflow  that  shortened  strings  more  than  intended  (#9854   <https://github.com/fish-shell/fish-
         shell/issues/9854>).

       • string  pad  no  longer  allows  non-printable  characters  as padding (#9854 <https://github.com/fish-
         shell/fish-shell/issues/9854>).

       • string  repeat  now  allows  omission  of  -n  when  the  first  argument   is   an   integer   (#10282
         <https://github.com/fish-shell/fish-shell/issues/10282>).

       • string  match  and replace have a new --max-matches option to return as soon as the specified number of
         matches   have   been   identified,   which   can    improve    performance    in    scripts    (#10587
         <https://github.com/fish-shell/fish-shell/issues/10587>).

       • functions  --handlers-type  caller-exit  once  again  lists functions defined as function --on-job-exit
         caller, rather than them being listed by functions --handlers-type process-exit.

       • A new set --no-event option sets or erases variables without triggering a variable event. This  can  be
         useful   to  change  a  variable  in  an  event  handler  (#10480  <https://github.com/fish-shell/fish-
         shell/issues/10480>).

       • Commas in command substitution output are no longer used as separators in brace expansion, preventing a
         surprising expansion in some cases (#5048 <https://github.com/fish-shell/fish-shell/issues/5048>).

       • Universal variables can now store strings containing invalid  UTF-8  (#10313  <https://github.com/fish-
         shell/fish-shell/issues/10313>).

       • A  new  path  basename  -E  option that causes it to return the basename ("filename" with the directory
         prefix removed) with the final extension (if any) also removed. This  is  a  shorter  version  of  path
         change-extension    ""    (path    basename    $foo)    (#10521    <https://github.com/fish-shell/fish-
         shell/issues/10521>).

       • A new math --scale-mode option to select truncate, round, floor, ceiling as you wish; the default value
         is truncate. (#9117 <https://github.com/fish-shell/fish-shell/issues/9117>).

       • random is now less strict about its arguments, allowing a start larger or equal  to  the  end.  (#10879
         <https://github.com/fish-shell/fish-shell/issues/10879>)

       • function  --argument-names  now  produces  an  error  if a read-only variable name is used, rather than
         simply ignoring it (#10842 <https://github.com/fish-shell/fish-shell/issues/10842>).

       • Tilde expansion in braces (that is, {~,}) works correctly (#10610  <https://github.com/fish-shell/fish-
         shell/issues/10610>).

   Interactive improvements
       • Autosuggestions  were  sometimes not shown after recalling a line from history, which has been fixed (‐
         #10287 <https://github.com/fish-shell/fish-shell/issues/10287>).

       • Up-arrow search matches -- which are highlighted in reverse colors -- are no longer syntax-highlighted,
         to fix bad contrast with the search match highlighting.

       • Command abbreviations (those with --position command or without a --position)  now  also  expand  after
         decorators like command (#10396 <https://github.com/fish-shell/fish-shell/issues/10396>).

       • Abbreviations  now expand after process separators like ; and |. This fixes a regression in version 3.6
         (#9730 <https://github.com/fish-shell/fish-shell/issues/9730>).

       • When exporting interactively defined functions (using type, functions or funcsave) the function body is
         now indented, to match the interactive command line editor (#8603  <https://github.com/fish-shell/fish-
         shell/issues/8603>).

       • ctrl-x    (fish_clipboard_copy)    on    multiline    commands   now   includes   indentation   (#10437
         <https://github.com/fish-shell/fish-shell/issues/10437>).

       • ctrl-v (fish_clipboard_paste) now strips ASCII control  characters  from  the  pasted  text.   This  is
         consistent with normal keyboard input (#5274 <https://github.com/fish-shell/fish-shell/issues/5274>).

       • When a command like fg %2 fails to find the given job, it no longer behaves as if no job spec was given
         (#9835 <https://github.com/fish-shell/fish-shell/issues/9835>).

       • Redirection in command position like >echo is now highlighted as error (#8877 <https://github.com/fish-
         shell/fish-shell/issues/8877>).

       • fish_vi_cursor   now   works   properly   inside   the   prompt   created   by   builtin  read  (#10088
         <https://github.com/fish-shell/fish-shell/issues/10088>).

       • fish  no  longer  fails  to  open  a  FIFO  if  interrupted  by  a  terminal  resize   signal   (#10250
         <https://github.com/fish-shell/fish-shell/issues/10250>).

       • read  --help  and friends no longer ignore redirections. This fixes a regression in version 3.1 (#10274
         <https://github.com/fish-shell/fish-shell/issues/10274>).

       • Measuring  a  command  with  time  now  considers  the  time  taken  for  command  substitution  (#9100
         <https://github.com/fish-shell/fish-shell/issues/9100>).

       • fish_add_path  now automatically enables verbose mode when used interactively (in the command line), in
         an  effort  to  be  clearer   about   what   it   does   (#10532   <https://github.com/fish-shell/fish-
         shell/issues/10532>).

       • fish  no  longer  adopts  TTY  modes  of  failed  commands (#10603 <https://github.com/fish-shell/fish-
         shell/issues/10603>).

       • complete  -e  cmd  now  prevents  autoloading  completions  for  cmd  (#6716  <https://github.com/fish-
         shell/fish-shell/issues/6716>).

       • fish's  default  color  scheme  no  longer  uses  the  color "blue", as it has bad contrast against the
         background  in  a  few  terminal's  default   palettes   (#10758   <https://github.com/fish-shell/fish-
         shell/issues/10758>,  #10786  <https://github.com/fish-shell/fish-shell/issues/10786>) The color scheme
         will not be upgraded for existing installs. If you want, you should select it again via fish_config.

       • Command lines which are larger than the terminal are now displayed correctly, instead of multiple blank
         lines being displayed (#7296 <https://github.com/fish-shell/fish-shell/issues/7296>).

       • Prompts that use external commands will no longer produce an infinite loop if the  command  crashes  (‐
         #9796 <https://github.com/fish-shell/fish-shell/issues/9796>).

       • Undo   (ctrl-z)   restores   the   cursor  position  too  (#10838  <https://github.com/fish-shell/fish-
         shell/issues/10838>).

       • The output of jobs shows "-" for jobs that have the same process group ID as the fish  process,  rather
         than "-2" (#10833 <https://github.com/fish-shell/fish-shell/issues/10833>).

       • Job expansion (%1 syntax) works properly for jobs that are a mixture of external commands and functions
         (#10832 <https://github.com/fish-shell/fish-shell/issues/10832>).

       • Command  lines  which  have  more lines than the terminal can be displayed and edited correctly (#10827
         <https://github.com/fish-shell/fish-shell/issues/10827>).

       • Functions  that  have  been  erased   are   no   longer   highlighted   as   valid   commands   (#10866
         <https://github.com/fish-shell/fish-shell/issues/10866>).

       • not,  time, and variable assignments (that is not time a=b env) is correctly recognized as valid syntax
         (#10890 <https://github.com/fish-shell/fish-shell/issues/10890>).

       • The Web-based configuration removes old right-hand-side prompts again,  fixing  a  regression  in  fish
         3.4.0 (#10675 <https://github.com/fish-shell/fish-shell/issues/10675>).

       • Further protection against programs which crash and leave the terminal in an inconsistent state (#10834
         <https://github.com/fish-shell/fish-shell/issues/10834>,   #11038  <https://github.com/fish-shell/fish-
         shell/issues/11038>).

       • A workaround for git being very slow on macOS has been applied, improving  performance  after  a  fresh
         boot (#10535 <https://github.com/fish-shell/fish-shell/issues/10535>).

   New or improved bindings
       • When  the cursor is on a command that resolves to an executable script, alt-o will now open that script
         in your editor (#10266 <https://github.com/fish-shell/fish-shell/issues/10266>).

       • During up-arrow history search, shift-delete will delete the current search item and move to  the  next
         older item. Previously this was only supported in the history pager.

       • shift-delete  will  also remove the currently-displayed autosuggestion from history, and remove it as a
         suggestion.

       • ctrl-Z (also known as ctrl-shift-z) is now bound to redo.

       • Some improvements to the alt-e binding which edits the command  line  in  an  external  editor:  -  The
         editor's  cursor  position  is copied back to fish. This is currently supported for Vim and Kakoune.  -
         Cursor position synchronization is only supported for a set  of  known  editors,  which  are  now  also
         detected  in  aliases  which  use  complete  --wraps.  For  example, use complete --wraps my-vim vim to
         synchronize cursors when EDITOR=my-vim.  - Multiline commands are indented before  being  sent  to  the
         editor, which matches how they are displayed in fish.

       • The  ...-path-component  bindings,  like  backward-kill-path-component,  now  treat # as part of a path
         component (#10271 <https://github.com/fish-shell/fish-shell/issues/10271>).

       • Bindings  like  alt-l  that  print  output  in  between  prompts  now  work  correctly  with  multiline
         commandlines.

       • alt-d on an empty command line lists the directory history again. This restores the behavior of version
         2.1.

       • history-prefix-search-backward  and  -forward  now  maintain the cursor position, instead of moving the
         cursor to the end of the command line (#10430 <https://github.com/fish-shell/fish-shell/issues/10430>).

       • The following keys have refined behavior if  the  terminal  supports  the  new  keyboard  encodings:  -
         shift-enter  now inserts a newline instead of executing the command line.  - ctrl-backspace now deletes
         the  last  word  instead   of   only   one   character   (#10741   <https://github.com/fish-shell/fish-
         shell/issues/10741>).  - ctrl-delete deletes the next word (same as alt-d).

       • New   special  input  functions:  -  forward-char-passive  and  backward-char-passive  are  like  their
         non-passive variants but do not accept autosuggestions or move focus in the  completion  pager  (#10398
         <https://github.com/fish-shell/fish-shell/issues/10398>).  - forward-token, backward-token, kill-token,
         and  backward-kill-token  are similar to the *-bigword variants but for the whole argument token (which
         includes   escaped   spaces)   (#2014    <https://github.com/fish-shell/fish-shell/issues/2014>).     -
         clear-commandline,  which merely clears the command line, as an alternative to cancel-commandline which
         prints ^C and a new prompt (#10213 <https://github.com/fish-shell/fish-shell/issues/10213>).

       • The accept-autosuggestion special input function now returns false when there was nothing to accept  (‐
         #10608 <https://github.com/fish-shell/fish-shell/issues/10608>).

       • Vi  mode  has  seen some improvements but continues to suffer from the lack of people working on it.  -
         New default cursor shapes for insert and replace mode.  - ctrl-n in insert mode accepts autosuggestions
         (#10339 <https://github.com/fish-shell/fish-shell/issues/10339>).  - Outside insert  mode,  the  cursor
         will no longer be placed beyond the last character on the commandline.  - When the cursor is at the end
         of  the  commandline,  a  single  l  will  accept  an  autosuggestion (#10286 <https://github.com/fish-
         shell/fish-shell/issues/10286>).  - The cursor position after pasting (p) has been corrected.  -  Added
         an  additional  binding,  _,  for moving to the beginning of the line (#10720 <https://github.com/fish-
         shell/fish-shell/issues/10720>).  - When the cursor is at the start of a  line,  escaping  from  insert
         mode no longer moves the cursor to the previous line.  - Added bindings for clipboard interaction, like
         ",+,p  and  ",+,y,y.   -  Deleting  in  visual  mode  now  moves  the  cursor back, matching vi (#10394
         <https://github.com/fish-shell/fish-shell/issues/10394>).  - The ;, ,, v, V, I, and gU bindings work in
         visual      mode      (#10601      <https://github.com/fish-shell/fish-shell/issues/10601>,      #10648
         <https://github.com/fish-shell/fish-shell/issues/10648>).      -     Support     %    motion    (#10593
         <https://github.com/fish-shell/fish-shell/issues/10593>).  - ctrl-k to remove the contents of the  line
         beyond  the  cursor  in  all modes (#10648 <https://github.com/fish-shell/fish-shell/issues/10648>).  -
         Support ab and ib vi text objects. New input functions are  introduced  jump-{to,till}-matching-bracket
         (#1842  <https://github.com/fish-shell/fish-shell/issues/1842>).  - The E binding now correctly handles
         the last character of the word, by jumping to the next word (#9700 <https://github.com/fish-shell/fish-
         shell/issues/9700>).

   Completions
       • Command-specific tab completions may now offer results whose first character is a period. For  example,
         it is now possible to tab-complete git add for files with leading periods. The default file completions
         hide  these  files,  unless  the  token  itself  has  a leading period (#3707 <https://github.com/fish-
         shell/fish-shell/issues/3707>).

       • Option completion  now  uses  fuzzy  subsequence  filtering,  just  like  non-option  completion  (#830
         <https://github.com/fish-shell/fish-shell/issues/830>).   This  means  that  --fb  may  be completed to
         --foobar if there is no better match.

       • Completions that insert an entire token now  use  quotes  instead  of  backslashes  to  escape  special
         characters (#5433 <https://github.com/fish-shell/fish-shell/issues/5433>).

       • Normally,  file  name  completions  start  after the last :  or = in a token.  This helps commands like
         rsync --files-from=.  This special meaning can now disabled by escaping these separators as \: and  \=.
         This  matches  Bash's  behavior.  Note that this escaping is usually not necessary since the completion
         engine already tries to guess whether the separator is actually part of a file name.

       • Various new completion scripts and numerous updates to existing ones.

       • Completions could hang if the PAGER environment variable was sent to certain editors on macOS,  FreeBSD
         and   some   other   platforms.   This  has  been  fixed  (#10820  <https://github.com/fish-shell/fish-
         shell/issues/10820>).

       • Generated completions are now stored  in  $XDG_CACHE_HOME/fish  or  ~/.cache/fish  by  default  (#10369
         <https://github.com/fish-shell/fish-shell/issues/10369>)

       • A regression in fish 3.1, where completing a command line could change it completely, has been fixed (‐
         #10904 <https://github.com/fish-shell/fish-shell/issues/10904>).

   Improved terminal support
       • fish now marks the prompt and command-output regions (via OSC 133) to enable terminal shell integration
         (#10352  <https://github.com/fish-shell/fish-shell/issues/10352>).   Shell  integration  shortcuts  can
         scroll to the next/previous prompt or show the last command output in a pager.

       • fish now reports the working directory (via OSC 7) unconditionally instead of only for  some  terminals
         (#9955 <https://github.com/fish-shell/fish-shell/issues/9955>).

       • fish  now sets the terminal window title (via OSC 0) unconditionally instead of only for some terminals
         (#10037 <https://github.com/fish-shell/fish-shell/issues/10037>).

       • Focus reporting in tmux is no longer disabled on the first prompt.

       • Focus   reporting   is   now   disabled   during   commands   run   inside    key    bindings    (#6942
         <https://github.com/fish-shell/fish-shell/issues/6942>).

       • Cursor  changes  are applied to all terminals that support them, and the list of specifically-supported
         terminals has been removed (#10693 <https://github.com/fish-shell/fish-shell/issues/10693>).

       • If it cannot find the terminfo entry given by TERM environment variable, fish will now use an  included
         xterm-256color   definition   to  match  the  vast  majority  of  current  terminal  emulators  (#10905
         <https://github.com/fish-shell/fish-shell/issues/10905>). If you  need  to  have  a  specific  terminfo
         profile for your terminal's TERM variable, install it into the terminfo database.

       • Further  improvements  to  the  correct  display of prompts which fill the width of the terminal (#8164
         <https://github.com/fish-shell/fish-shell/issues/8164>).

   Other improvementsstatus gained a buildinfo subcommand, to print  information  on  how  fish  was  built,  to  help  with
         debugging (#10896 <https://github.com/fish-shell/fish-shell/issues/10896>).

       • fish_indent  will  now  collapse  multiple  empty  lines  into  one  (#10325  <https://github.com/fish-
         shell/fish-shell/issues/10325>).

       • fish_indent  now  preserves  the  modification  time  of  files  if  there  were  no  changes   (#10624
         <https://github.com/fish-shell/fish-shell/issues/10624>).

       • Performance   in   launching   external   processes   has   been   improved   for  many  cases  (#10869
         <https://github.com/fish-shell/fish-shell/issues/10869>).

       • Performance and interactivity under Windows Subsystem for Linux has been improved,  with  a  workaround
         for  Windows-specific  locations  being  appended to $PATH by default (#10506 <https://github.com/fish-
         shell/fish-shell/issues/10506>).

       • On macOS, paths from /etc/paths and /etc/manpaths  containing  colons  are  handled  correctly  (#10684
         <https://github.com/fish-shell/fish-shell/issues/10684>).

       • Additional  filesystems  such as AFS are properly detected as remote, which avoids certain hangs due to
         expensive filesystem locks (#10818 <https://github.com/fish-shell/fish-shell/issues/10818>).

       • A spurious error when launching multiple instances of fish for the first time has been removed  (#10813
         <https://github.com/fish-shell/fish-shell/issues/10813>).

   For distributors
       fish  has  been  ported to Rust. This means a significant change in dependencies, which are listed in the
       README. In short, Rust 1.70 or greater is required, and a C++ compiler is no longer needed (although a  C
       compiler is still required, for some C glue code and the tests).

       CMake  remains  the  recommended  build system, because of cargo's limited support for installing support
       files. Version 3.5 remains the minimum supported version. The Xcode generator for CMake is not  supported
       any  longer  (#9924  <https://github.com/fish-shell/fish-shell/issues/9924>).  CMake  builds  default  to
       optimized release builds (#10799 <https://github.com/fish-shell/fish-shell/issues/10799>).

       fish no longer depends on the ncurses library, but still uses a terminfo database. When  packaging  fish,
       please add a dependency on the package containing your terminfo database instead of curses.

       The  test  target  was  removed  as  it  can  no  longer  be  defined  in  new  CMake  versions. Use make
       fish_run_tests.  Any   existing   test   target   will   not   print   output   if   it   fails   (#11116
       <https://github.com/fish-shell/fish-shell/issues/11116>).

       The  Web-based  configuration  has  been  rewritten  to  use  Alpine.js  (#9554 <https://github.com/fish-
       shell/fish-shell/issues/9554>).

                                                         ----

   fish 4.0b1 (released December 17, 2024)
       A number of improvements were included in fish 4.0.0 following the beta release of 4.0b1.  These  include
       fixes  for  regressions, improvements to completions and documentation, and the removal of a small number
       of problematic changes.

       The  full  list  of  fixed  issues  can  be  found  on  the   GitHub   milestone   page   for   4.0-final
       <https://github.com/fish-shell/fish-shell/milestone/43>.

                                                         ----

   fish 3.7.1 (released March 19, 2024)
       This release of fish fixes the following problems identified in fish 3.7.0:

       • Deleting  the  last  history  entry  via  history  delete works again (#10190 <https://github.com/fish-
         shell/fish-shell/issues/10190>).

       • Wildcards  (*)   will   no   longer   sometimes   generate   paths   that   did   not   exist   (#10205
         <https://github.com/fish-shell/fish-shell/issues/10205>).

       This release also contains some improvements:

       • A  crash  when  trying to run an ELF program with a missing interpreter has been fixed. This crashed in
         the process after fork, so did not affect the fish process that tried  to  start  the  program  (#10199
         <https://github.com/fish-shell/fish-shell/issues/10199>).

       • funced  will  now  always source the file after it has written it, even if the contents did not change.
         This prevents issues if the file was otherwise  modified  (#10318  <https://github.com/fish-shell/fish-
         shell/issues/10318>).

       • The  warning  for when a builtin returns a negative exit code was improved, now mentioning the original
         status (#10187 <https://github.com/fish-shell/fish-shell/issues/10187>).

       • Added completions for

         • cobra-cli (#10293 <https://github.com/fish-shell/fish-shell/issues/10293>)

         • dmidecode (#10368 <https://github.com/fish-shell/fish-shell/issues/10368>)

         • mycli (#10309 <https://github.com/fish-shell/fish-shell/issues/10309>)

         • ollama (#10327 <https://github.com/fish-shell/fish-shell/issues/10327>)

         • pstree (#10317 <https://github.com/fish-shell/fish-shell/issues/10317>)

       • Some improvements to documentation and completions.

                                                         ----

   fish 3.7.0 (released January 1, 2024)
       This release of fish includes a number of improvements over fish 3.6.4,  detailed  below.  Although  work
       continues on the porting of fish internals to the Rust programming language, that work is not included in
       this release. fish 3.7.0 and any future releases in the 3.7 series remain C++ programs.

   Notable improvements and fixes
       • Improvements to the history pager, including:

         • The  history  pager  will  now  also  attempt  subsequence  matches  (#9476 <https://github.com/fish-
           shell/fish-shell/issues/9476>), so you can find a command line like git log  3.6.1..Integration_3.7.0
           by searching for gitInt.

         • Opening  the history pager will now fill the search field with a search string if you're already in a
           search (#10005  <https://github.com/fish-shell/fish-shell/issues/10005>).  This  makes  it  nicer  to
           search something with up and then later decide to switch to the full pager.

         • Closing the history pager with enter will now copy the search text to the commandline if there was no
           match,   so   you   can   continue   editing  the  command  you  tried  to  find  right  away  (#9934
           <https://github.com/fish-shell/fish-shell/issues/9934>).

       • Performance improvements for command completions and globbing, where supported by the operating system,
         especially   on   slow   filesystems   such   as   NFS   (#9891    <https://github.com/fish-shell/fish-
         shell/issues/9891>,      #9931      <https://github.com/fish-shell/fish-shell/issues/9931>,      #10032
         <https://github.com/fish-shell/fish-shell/issues/10032>,  #10052   <https://github.com/fish-shell/fish-
         shell/issues/10052>).

       • fish can now be configured to wait a specified amount of time for a multi-key sequence to be completed,
         instead  of  waiting  indefinitely.  For  example,  this makes binding kj to switching modes in vi mode
         possible.   The  timeout  can  be  set  via  the   new   fish_sequence_key_delay_ms   variable   (#7401
         <https://github.com/fish-shell/fish-shell/issues/7401>), and may be set by default in future versions.

   Deprecations and removed featuresLS_COLORS  is  no  longer  set  automatically  by  the  ls  function  (#10080 <https://github.com/fish-
         shell/fish-shell/issues/10080>). Users that set .dircolors should manually import it using other means.
         Typically this would be set -gx LS_COLORS (dircolors -c .dircolors | string split ' ')[3]

   Scripting improvements
       • Running exit with a negative number no longer crashes fish (#9659  <https://github.com/fish-shell/fish-
         shell/issues/9659>).

       • fish  --command  will  now  return a non-zero status if parsing failed (#9888 <https://github.com/fish-
         shell/fish-shell/issues/9888>).

       • The jobs builtin will now escape the commands  it  prints  (#9808  <https://github.com/fish-shell/fish-
         shell/issues/9808>).

       • string   repeat   no   longer  overflows  if  the  count  is  a  multiple  of  the  chunk  size  (#9900
         <https://github.com/fish-shell/fish-shell/issues/9900>).

       • The builtin builtin will now properly error out with invalid arguments instead  of  doing  nothing  and
         returning true (#9942 <https://github.com/fish-shell/fish-shell/issues/9942>).

       • command   time   in   a   pipeline  is  allowed  again,  as  is  command  and  and  command  or  (#9985
         <https://github.com/fish-shell/fish-shell/issues/9985>).

       • exec will now also apply variable overrides, so  FOO=bar  exec  will  now  set  $FOO  correctly  (#9995
         <https://github.com/fish-shell/fish-shell/issues/9995>).

       • umask   will   now   handle   empty   symbolic   modes   correctly,   like  umask  u=,g=rwx,o=  (#10177
         <https://github.com/fish-shell/fish-shell/issues/10177>).

       • Improved error messages for errors occurring in command substitutions (#10054 <https://github.com/fish-
         shell/fish-shell/issues/10054>).

   Interactive improvementsread no longer enables bracketed paste so it doesn't stay enabled in combined commandlines  like  mysql
         -p(read --silent) (#8285 <https://github.com/fish-shell/fish-shell/issues/8285>).

       • Vi  mode  now  uses  fish_cursor_external  to  set  the  cursor  shape  for  external  commands  (#4656
         <https://github.com/fish-shell/fish-shell/issues/4656>).

       • Opening   the   history   search   in   vi   mode   switches   to   insert   mode   correctly   (#10141
         <https://github.com/fish-shell/fish-shell/issues/10141>).

       • Vi   mode   cursor  shaping  is  now  enabled  in  iTerm2  (#9698  <https://github.com/fish-shell/fish-
         shell/issues/9698>).

       • Completing commands as root includes commands not owned by root, fixing a regression introduced in fish
         3.2.0 (#9699 <https://github.com/fish-shell/fish-shell/issues/9699>).

       • Selection uses fish_color_selection for the foreground and background colors, as intended, rather  than
         just the background (#9717 <https://github.com/fish-shell/fish-shell/issues/9717>).

       • The  completion  pager  will no longer sometimes skip the last entry when moving through a long list (‐
         #9833 <https://github.com/fish-shell/fish-shell/issues/9833>).

       • The interactive history delete  interface  now  allows  specifying  index  ranges  like  "1..5"  (#9736
         <https://github.com/fish-shell/fish-shell/issues/9736>),  and history delete --exact now properly saves
         the history (#10066 <https://github.com/fish-shell/fish-shell/issues/10066>).

       • Command completion will now call the stock manpath on macOS, instead of a potential  Homebrew  version.
         This prevents awkward error messages (#9817 <https://github.com/fish-shell/fish-shell/issues/9817>).

       • the redo special input function restores the pre-undo cursor position.

       • A  new  bind  function  history-pager-delete,  bound  to  shift-delete  by  default,  will  delete  the
         currently-selected  history  pager  item  from  history   (#9454   <https://github.com/fish-shell/fish-
         shell/issues/9454>).

       • fish_key_reader  will now use printable characters as-is, so pressing "ö" no longer leads to it telling
         you to bind \u00F6 (#9986 <https://github.com/fish-shell/fish-shell/issues/9986>).

       • open can be used to launch terminal programs again, as an xdg-open bug has been fixed and a  workaround
         has been removed  (#10045 <https://github.com/fish-shell/fish-shell/issues/10045>).

       • The  repaint-mode  binding  will now only move the cursor if there is repainting to be done. This fixes
         alt combination bindings in vi mode (#7910 <https://github.com/fish-shell/fish-shell/issues/7910>).

       • A new clear-screen bind function is used for ctrl-l by default. This clears the screen and repaints the
         existing prompt at first, so it eliminates visible flicker unless the terminal  is  very  slow  (#10044
         <https://github.com/fish-shell/fish-shell/issues/10044>).

       • The  alias  convenience function has better support for commands with unusual characters, like + (#8720
         <https://github.com/fish-shell/fish-shell/issues/8720>).

       • A longstanding issue where items in the pager would sometimes display  without  proper  formatting  has
         been fixed (#9617 <https://github.com/fish-shell/fish-shell/issues/9617>).

       • The alt-l binding, which lists the directory of the token under the cursor, correctly expands tilde (~)
         to the home directory (#9954 <https://github.com/fish-shell/fish-shell/issues/9954>).

       • Various  fish  utilities  that  use  an external pager will now try a selection of common pagers if the
         PAGER environment variable is not set, or write the output to the screen without a pager  if  there  is
         not one available (#10074 <https://github.com/fish-shell/fish-shell/issues/10074>).

       • Command-specific  tab completions may now offer results whose first character is a period. For example,
         it is now possible to tab-complete git add for files with leading periods. The default file completions
         hide these files, unless the  token  itself  has  a  leading  period  (#3707  <https://github.com/fish-
         shell/fish-shell/issues/3707>).

   Improved prompts
       • The  default  theme  now  only  uses  named  colors,  so  it  will  track the terminal's palette (#9913
         <https://github.com/fish-shell/fish-shell/issues/9913>).

       • The Dracula theme  has  now  been  synced  with  upstream  (#9807  <https://github.com/fish-shell/fish-
         shell/issues/9807>); use fish_config to re-apply it to pick up the changes.

       • fish_vcs_prompt             now            also            supports            fossil            (#9497
         <https://github.com/fish-shell/fish-shell/issues/9497>).

       • Prompts which display the working directory using the prompt_pwd function correctly display directories
         beginning with dashes (#10169 <https://github.com/fish-shell/fish-shell/issues/10169>).

   Completions
       • Added completions for:

         • age and age-keygen (#9813 <https://github.com/fish-shell/fish-shell/issues/9813>)

         • airmon-ng (#10116 <https://github.com/fish-shell/fish-shell/issues/10116>)

         • ar (#9720 <https://github.com/fish-shell/fish-shell/issues/9720>)

         • blender (#9905 <https://github.com/fish-shell/fish-shell/issues/9905>)

         • bws (#10165 <https://github.com/fish-shell/fish-shell/issues/10165>)

         • calendar (#10138 <https://github.com/fish-shell/fish-shell/issues/10138>)

         • checkinstall (#10106 <https://github.com/fish-shell/fish-shell/issues/10106>)

         • crc (#10034 <https://github.com/fish-shell/fish-shell/issues/10034>)

         • doctlgimp (#9904 <https://github.com/fish-shell/fish-shell/issues/9904>)

         • gojq (#9740 <https://github.com/fish-shell/fish-shell/issues/9740>)

         • horcrux (#9922 <https://github.com/fish-shell/fish-shell/issues/9922>)

         • ibmcloud (#10004 <https://github.com/fish-shell/fish-shell/issues/10004>)

         • iwctl (#6884 <https://github.com/fish-shell/fish-shell/issues/6884>)

         • java_home (#9998 <https://github.com/fish-shell/fish-shell/issues/9998>)

         • krita (#9903 <https://github.com/fish-shell/fish-shell/issues/9903>)

         • oc (#10034 <https://github.com/fish-shell/fish-shell/issues/10034>)

         • qjs (#9723 <https://github.com/fish-shell/fish-shell/issues/9723>)

         • qjsc (#9731 <https://github.com/fish-shell/fish-shell/issues/9731>)

         • rename (#10136 <https://github.com/fish-shell/fish-shell/issues/10136>)

         • rpm-ostool (#9669 <https://github.com/fish-shell/fish-shell/issues/9669>)

         • smerge (#10135 <https://github.com/fish-shell/fish-shell/issues/10135>)

         • userdel (#10056 <https://github.com/fish-shell/fish-shell/issues/10056>)

         • watchexec (#10027 <https://github.com/fish-shell/fish-shell/issues/10027>)

         • wpctl (#10043 <https://github.com/fish-shell/fish-shell/issues/10043>)

         • xxd (#10137 <https://github.com/fish-shell/fish-shell/issues/10137>)

         • zabbix (#9647 <https://github.com/fish-shell/fish-shell/issues/9647>)

       • The  zfs  completions  no  longer  print   errors   about   setting   a   read-only   variable   (#9705
         <https://github.com/fish-shell/fish-shell/issues/9705>).

       • The   kitty   completions   have   been   removed   in   favor   of   keeping   them   upstream  (#9750
         <https://github.com/fish-shell/fish-shell/issues/9750>).

       • git completions now support aliases  that  reference  other  aliases  (#9992  <https://github.com/fish-
         shell/fish-shell/issues/9992>).

       • The  gw  and  gradlew  completions  are  loaded  properly  (#10127 <https://github.com/fish-shell/fish-
         shell/issues/10127>).

       • Improvements to many other completions.

       • Improvements to  the  manual  page  completion  generator  (#9787  <https://github.com/fish-shell/fish-
         shell/issues/9787>,       #9814      <https://github.com/fish-shell/fish-shell/issues/9814>,      #9961
         <https://github.com/fish-shell/fish-shell/issues/9961>).

   Other improvements
       • Improvements and corrections to the documentation.

       • The Web-based configuration now uses a more readable style when  printed,  such  as  for  a  keybinding
         reference (#9828 <https://github.com/fish-shell/fish-shell/issues/9828>).

       • Updates to the German translations (#9824 <https://github.com/fish-shell/fish-shell/issues/9824>).

       • The  colors  of  the  Nord  theme  better  match their official style (#10168 <https://github.com/fish-
         shell/fish-shell/issues/10168>).

   For distributors
       • The licensing information for some of the derived code distributed with fish was incomplete. Though the
         license information was present in the source distribution, it was not present  in  the  documentation.
         This has been corrected (#10162 <https://github.com/fish-shell/fish-shell/issues/10162>).

       • The  CMake  configure  step  will now also look for libterminfo as an alternative name for libtinfo, as
         used in NetBSD curses (#9794 <https://github.com/fish-shell/fish-shell/issues/9794>).

                                                         ----

   fish 3.6.4 (released December 5, 2023)
       This release contains a complete fix for the test suite failure in fish 3.6.2 and 3.6.3.

                                                         ----

   fish 3.6.3 (released December 4, 2023)
       This release contains a fix for a test suite failure in fish 3.6.2.

                                                         ----

   fish 3.6.2 (released December 4, 2023)
       This release of fish contains a security fix for CVE-2023-49284, a minor security problem  identified  in
       fish 3.6.1 and previous versions (thought to affect all released versions of fish).

       fish  uses certain Unicode non-characters internally for marking wildcards and expansions. It incorrectly
       allowed these markers to be read on command substitution output, rather than  transforming  them  into  a
       safe internal representation.

       For example, echo \UFDD2HOME has the same output as echo $HOME.

       While  this  may cause unexpected behavior with direct input, this may become a minor security problem if
       the output is being fed from an external program into a command substitution where this output may not be
       expected.

                                                         ----

   fish 3.6.1 (released March 25, 2023)
       This release of fish contains a number of fixes for problems identified in fish 3.6.1, as  well  as  some
       enhancements.

   Notable improvements and fixesabbr --erase now also erases the universal variables used by the old abbr function. That means:

            abbr --erase (abbr --list)

         can  now  be  used  to  clean  out  all  old  abbreviations (#9468 <https://github.com/fish-shell/fish-
         shell/issues/9468>).

       • abbr --add --universal now warns about --universal being non-functional, to make it  easier  to  detect
         old-style abbr calls (#9475 <https://github.com/fish-shell/fish-shell/issues/9475>).

   Deprecations and removed features
       • The  Web-based  configuration  for  abbreviations  has  been removed, as it was not functional with the
         changes            abbreviations            introduced            in            3.6.0            (#9460
         <https://github.com/fish-shell/fish-shell/issues/9460>).

   Scripting improvementsabbr  --list  no longer escapes the abbr name, which is necessary to be able to pass it to abbr --erase
         (#9470 <https://github.com/fish-shell/fish-shell/issues/9470>).

       • read will now print an error if told to set a read-only variable, instead of silently doing nothing  (‐
         #9346 <https://github.com/fish-shell/fish-shell/issues/9346>).

       • set_color -v no longer crashes fish (#9640 <https://github.com/fish-shell/fish-shell/issues/9640>).

   Interactive improvements
       • Using  fish_vi_key_bindings  in  combination  with fish's --no-config mode works without locking up the
         shell (#9443 <https://github.com/fish-shell/fish-shell/issues/9443>).

       • The history pager now uses more screen space, usually half the screen (#9458  <https://github.com/fish-
         shell/fish-shell/issues/9458>)

       • Variables  that  were  set  while the locale was C (the default ASCII-only locale) will now properly be
         encoded if the locale is switched (#2613 <https://github.com/fish-shell/fish-shell/issues/2613>,  #9473
         <https://github.com/fish-shell/fish-shell/issues/9473>).

       • Escape during history search restores the original command line again (fixing a regression in 3.6.0).

       • Using  --help  on  builtins  now  respects  the  $MANPAGER  variable,  in  preference  to $PAGER (#9488
         <https://github.com/fish-shell/fish-shell/issues/9488>).

       • ctrl-g  closes  the  history  pager,  like  other  shells  (#9484  <https://github.com/fish-shell/fish-
         shell/issues/9484>).

       • The  documentation  for  the  :,  [  and  .  builtin  commands  can  now  be  looked up with man (#9552
         <https://github.com/fish-shell/fish-shell/issues/9552>).

       • fish no longer crashes when  searching  history  for  non-ASCII  codepoints  case-insensitively  (#9628
         <https://github.com/fish-shell/fish-shell/issues/9628>).

       • The  alt-s  binding  will  now also use please if available (#9635 <https://github.com/fish-shell/fish-
         shell/issues/9635>).

       • Themes that don't specify every color option can be installed correctly in the Web-based  configuration
         (#9590 <https://github.com/fish-shell/fish-shell/issues/9590>).

       • Compatibility    with    Midnight   Commander's   prompt   integration   has   been   improved   (#9540
         <https://github.com/fish-shell/fish-shell/issues/9540>).

       • A spurious error, noted when using fish in Google Drive directories under WSL 2, has been  silenced  (‐
         #9550 <https://github.com/fish-shell/fish-shell/issues/9550>).

       • Using   read  in  fish_greeting  or  similar  functions  will  not  trigger  an  infinite  loop  (#9564
         <https://github.com/fish-shell/fish-shell/issues/9564>).

       • Compatibility when upgrading from old  versions  of  fish  (before  3.4.0)  has  been  improved  (#9569
         <https://github.com/fish-shell/fish-shell/issues/9569>).

   Improved prompts
       • The  git  prompt will compute the stash count to be used independently of the informative status (#9572
         <https://github.com/fish-shell/fish-shell/issues/9572>).

   Completions
       • Added completions for:

         • apkanalyzer (#9558 <https://github.com/fish-shell/fish-shell/issues/9558>)

         • neovim (#9543 <https://github.com/fish-shell/fish-shell/issues/9543>)

         • otoolpre-commit (#9521 <https://github.com/fish-shell/fish-shell/issues/9521>)

         • proxychains (#9486 <https://github.com/fish-shell/fish-shell/issues/9486>)

         • scrypt (#9583 <https://github.com/fish-shell/fish-shell/issues/9583>)

         • stow (#9571 <https://github.com/fish-shell/fish-shell/issues/9571>)

         • trash   and   helper   utilities   trash-empty,   trash-list,   trash-put,    trash-restore    (#9560
           <https://github.com/fish-shell/fish-shell/issues/9560>)

         • ssh-copy-id (#9675 <https://github.com/fish-shell/fish-shell/issues/9675>)

       • Improvements  to  many  completions,  including  the  speed  of  completing directories in WSL 2 (#9574
         <https://github.com/fish-shell/fish-shell/issues/9574>).

       • Completions using __fish_complete_suffix are now offered in the correct order, fixing a  regression  in
         3.6.0 (#8924 <https://github.com/fish-shell/fish-shell/issues/8924>).

       • git  completions  for  git-foo-style  commands  was  restored,  fixing  a  regression  in  3.6.0 (#9457
         <https://github.com/fish-shell/fish-shell/issues/9457>).

       • File  completion  now  offers   ../   and   ./   again,   fixing   a   regression   in   3.6.0   (#9477
         <https://github.com/fish-shell/fish-shell/issues/9477>).

       • The  behaviour  of  completions  using  __fish_complete_path  matches  standard path completions (#9285
         <https://github.com/fish-shell/fish-shell/issues/9285>).

   Other improvements
       • Improvements and corrections to the documentation.

   For distributors
       • fish 3.6.1 builds correctly on Cygwin (#9502 <https://github.com/fish-shell/fish-shell/issues/9502>).

                                                         ----

   fish 3.6.0 (released January 7, 2023)
   Notable improvements and fixes
       • By default, ctrl-r  now  opens  the  command  history  in  the  pager  (#602  <https://github.com/fish-
         shell/fish-shell/issues/602>).  This  is  fully searchable and syntax-highlighted, as an alternative to
         the incremental search seen in other shells. The new special  input  function  history-pager  has  been
         added for custom bindings.

       • Abbrevations  are  more  flexible  (#9313 <https://github.com/fish-shell/fish-shell/issues/9313>, #5003
         <https://github.com/fish-shell/fish-shell/issues/5003>,   #2287    <https://github.com/fish-shell/fish-
         shell/issues/2287>):

         • They may optionally replace tokens anywhere on the command line, instead of only commands

         • Matching tokens may be described using a regular expression instead of a literal word

         • The replacement text may be produced by a fish function, instead of a literal word

         • They may position the cursor anywhere in the expansion, instead of at the end

         For example:

            function multicd
                echo cd (string repeat -n (math (string length -- $argv[1]) - 1) ../)
            end

            abbr --add dotdot --regex '^\.\.+$' --function multicd

         This expands .. to cd ../, ... to cd ../../ and .... to cd ../../../ and so on.

         Or:

            function last_history_item; echo $history[1]; end
            abbr -a !! --position anywhere --function last_history_item

         which  expands  !!  to  the  last  history  item, anywhere on the command line, mimicking other shells'
         history expansion.

         See the documentation for more.

       • path gained a new mtime subcommand to print the modification time stamp for files.  For  example,  this
         can be used to handle cache file ages (#9057 <https://github.com/fish-shell/fish-shell/issues/9057>):

            > touch foo
            > sleep 10
            > path mtime --relative foo
            10

       • string  gained  a  new  shorten  subcommand  to  shorten  strings  to  a  given  visible  width  (#9156
         <https://github.com/fish-shell/fish-shell/issues/9156>):

            > string shorten --max 10 "Hello this is a long string"
            Hello thi…

       • test (aka [) gained -ot (older than) and -nt (newer than) operators to compare file modification times,
         and -ef to compare whether the arguments are the same file (#3589  <https://github.com/fish-shell/fish-
         shell/issues/3589>).

       • fish  will  now mark the extent of many errors with a squiggly line, instead of just a caret (^) at the
         beginning (#9130 <https://github.com/fish-shell/fish-shell/issues/9130>). For example:

            checks/set.fish (line 471): for: a,b: invalid variable name. See `help identifiers`
            for a,b in y 1 z 3
                ^~^

       • A new function, fish_delta, shows changes that have been made in fish's configuration from the defaults
         (#9255 <https://github.com/fish-shell/fish-shell/issues/9255>).

       • set  --erase  can  now  be  used  with  multiple  scopes  at  once,  like   set   -efglU   foo   (#7711
         <https://github.com/fish-shell/fish-shell/issues/7711>,    #9280   <https://github.com/fish-shell/fish-
         shell/issues/9280>).

       • status  gained  a  new  subcommand,  current-commandline,  which  retrieves   the   entirety   of   the
         currently-executing  command  line when called from a function during execution. This allows easier job
         introspection        (#8905        <https://github.com/fish-shell/fish-shell/issues/8905>,        #9296
         <https://github.com/fish-shell/fish-shell/issues/9296>).

   Deprecations and removed features
       • The \x and \X escape syntax is now equivalent. \xAB previously behaved the same as \XAB, except that it
         would  error  if  the  value "AB" was larger than "7f" (127 in decimal, the highest ASCII value) (#9247
         <https://github.com/fish-shell/fish-shell/issues/9247>,   #9245    <https://github.com/fish-shell/fish-
         shell/issues/9245>, #1352 <https://github.com/fish-shell/fish-shell/issues/1352>).

       • The  fish_git_prompt  will now only turn on features if the appropriate variable has been set to a true
         value (of "1", "yes" or "true") instead of just checking if it is  defined.  This  allows  specifically
         turning  features  off  without having to erase variables, such as via universal variables. If you have
         defined a variable to a different value and expect it to count as true, you need to  change  it  (#9274
         <https://github.com/fish-shell/fish-shell/issues/9274>).         For        example,       set       -g
         __fish_git_prompt_show_informative_status 0 previously would have enabled informative  status  (because
         any value would have done so), but now it turns it off.

       • Abbreviations  are  no longer stored in universal variables. Existing universal abbreviations are still
         imported, but new abbreviations should be added to config.fish.

       • The short option -r for abbreviations has changed from rename to regex, for consistency with string.

   Scripting improvementsargparse can now be used without option specifications, to allow using --min-args,  --max-args  or  for
         commands  that  take  no  options  (but  might  in  future) (#9006 <https://github.com/fish-shell/fish-
         shell/issues/9006>):

            function my_copy
                argparse --min-args 2 -- $argv
                or return

                cp $argv
            end

       • set --show now shows when a variable was inherited from fish's parent process, which should  help  with
         debugging (#9029 <https://github.com/fish-shell/fish-shell/issues/9029>):

            > set --show XDG_DATA_DIRS
            $XDG_DATA_DIRS: set in global scope, exported, a path variable with 4 elements
            $XDG_DATA_DIRS[1]: |/home/alfa/.local/share/flatpak/exports/share|
            $XDG_DATA_DIRS[2]: |/var/lib/flatpak/exports/share|
            $XDG_DATA_DIRS[3]: |/usr/local/share|
            $XDG_DATA_DIRS[4]: |/usr/share|
            $XDG_DATA_DIRS: originally inherited as |/home/alfa/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/|

       • The   read   limit   is   now   restored   to   the   default  when  fish_read_limit  is  unset  (#9129
         <https://github.com/fish-shell/fish-shell/issues/9129>).

       • math produces an error for division-by-zero, as well as augmenting some errors with their extent (#9190
         <https://github.com/fish-shell/fish-shell/issues/9190>). This changes behavior in some  limited  cases,
         such as:

            math min 1 / 0, 5

         which  would previously print "5" (because in floating point division "1 / 0" yields infinite, and 5 is
         smaller than infinite) but will now return an error.

       • fish_clipboard_copy and fish_clipboard_paste can now be used in pipes (#9271  <https://github.com/fish-
         shell/fish-shell/issues/9271>):

            git rev-list 3.5.1 | fish_clipboard_copy

            fish_clipboard_paste | string join + | math

       • status   fish-path   returns   a  fully-normalised  path,  particularly  noticeable  on  NetBSD  (#9085
         <https://github.com/fish-shell/fish-shell/issues/9085>).

   Interactive improvements
       • If the terminal definition for TERM can't be found, fish  now  tries  using  the  "xterm-256color"  and
         "xterm"  definitions  before "ansi" and "dumb". As the majority of terminal emulators in common use are
         now more or less xterm-compatible (often even  explicitly  claiming  the  xterm-256color  entry),  this
         should  often  result  in  a  fully  or  almost  fully usable terminal (#9026 <https://github.com/fish-
         shell/fish-shell/issues/9026>).

       • A new variable, fish_cursor_selection_mode, can be used to configure whether the command line selection
         includes the character under the cursor (inclusive) or not (exclusive). The new default  is  exclusive;
         use   set   fish_cursor_selection_mode   inclusive   to   get   the   previous   behavior  back  (#7762
         <https://github.com/fish-shell/fish-shell/issues/7762>).

       • fish's completion pager now fills half the terminal on first tab press instead of only  4  rows,  which
         should  make  results  visible more often and save key presses, without constantly snapping fish to the
         top   of   the   terminal    (#9105    <https://github.com/fish-shell/fish-shell/issues/9105>,    #2698
         <https://github.com/fish-shell/fish-shell/issues/2698>).

       • The  complete-and-search binding, used with shift-tab by default, selects the first item in the results
         immediately (#9080 <https://github.com/fish-shell/fish-shell/issues/9080>).

       • bind output is now syntax-highlighted when used interacively.

       • alt-h (the default __fish_man_page binding) does a better job of showing the manual page of the command
         under cursor (#9020 <https://github.com/fish-shell/fish-shell/issues/9020>).

       • If fish_color_valid_path contains an actual color instead of just modifiers, those  will  be  used  for
         valid  paths  even  if  the underlying color isn't "normal" (#9159 <https://github.com/fish-shell/fish-
         shell/issues/9159>).

       • The key combination for the QUIT terminal sequence, often ctrl-\ (\x1c), can now be used as  a  binding
         (#9234 <https://github.com/fish-shell/fish-shell/issues/9234>).

       • fish's  vi mode uses normal xterm-style sequences to signal cursor change, instead of using the iTerm's
         proprietary escape sequences. This allows for a blinking  cursor  and  makes  it  work  in  complicated
         scenarios  with  nested terminals. (#3741 <https://github.com/fish-shell/fish-shell/issues/3741>, #9172
         <https://github.com/fish-shell/fish-shell/issues/9172>)

       • When running fish on a remote system (such as inside SSH or a container),  ctrl-x  now  copies  to  the
         local client system's clipboard if the terminal supports OSC 52.

       • commandline  gained two new options, --selection-start and --selection-end, to set the start/end of the
         current     selection     (#9197     <https://github.com/fish-shell/fish-shell/issues/9197>,      #9215
         <https://github.com/fish-shell/fish-shell/issues/9215>).

       • fish's  builtins  now  handle  keyboard  interrupts (ctrl-c) correctly (#9266 <https://github.com/fish-
         shell/fish-shell/issues/9266>).

   Completions
       • Added completions for:

         • arkasciinema (#9257 <https://github.com/fish-shell/fish-shell/issues/9257>)

         • clojure (#9272 <https://github.com/fish-shell/fish-shell/issues/9272>)

         • cshdirenv (#9268 <https://github.com/fish-shell/fish-shell/issues/9268>)

         • dive (#9082 <https://github.com/fish-shell/fish-shell/issues/9082>)

         • dolphindua (#9277 <https://github.com/fish-shell/fish-shell/issues/9277>)

         • efivar (#9318 <https://github.com/fish-shell/fish-shell/issues/9318>)

         • eges (#9388 <https://github.com/fish-shell/fish-shell/issues/9388>)

         • firefox-developer-edition and firefox (#9090 <https://github.com/fish-shell/fish-shell/issues/9090>)

         • fortune (#9177 <https://github.com/fish-shell/fish-shell/issues/9177>)

         • kbkind (#9110 <https://github.com/fish-shell/fish-shell/issues/9110>)

         • konsolekshloadkeys (#9312 <https://github.com/fish-shell/fish-shell/issues/9312>)

         • okularop (#9300 <https://github.com/fish-shell/fish-shell/issues/9300>)

         • ouch (#9405 <https://github.com/fish-shell/fish-shell/issues/9405>)

         • pixreadelf         (#8746         <https://github.com/fish-shell/fish-shell/issues/8746>,          #9386
           <https://github.com/fish-shell/fish-shell/issues/9386>)

         • qshellrcsad (#9145 <https://github.com/fish-shell/fish-shell/issues/9145>)

         • tcshtoottox (#9078 <https://github.com/fish-shell/fish-shell/issues/9078>)

         • wishxedxonsh (#9389 <https://github.com/fish-shell/fish-shell/issues/9389>)

         • xplayerxreaderxvieweryash (#9391 <https://github.com/fish-shell/fish-shell/issues/9391>)

         • zig (#9083 <https://github.com/fish-shell/fish-shell/issues/9083>)

       • Improvements   to   many   completions,   including   making   cd   completion   much   faster   (#9220
         <https://github.com/fish-shell/fish-shell/issues/9220>).

       • Completion of tilde (~) works properly even when the file name contains  an  escaped  character  (#9073
         <https://github.com/fish-shell/fish-shell/issues/9073>).

       • fish  no  longer loads completions if the command is used via a relative path and is not in PATH (#9133
         <https://github.com/fish-shell/fish-shell/issues/9133>).

       • fish   no   longer   completes   inside   of   comments   (#9320   <https://github.com/fish-shell/fish-
         shell/issues/9320>).

   Improved terminal support
       • Opening  help  on  WSL  now uses PowerShell to open the browser if available, removing some awkward UNC
         path errors (#9119 <https://github.com/fish-shell/fish-shell/issues/9119>).

   Other improvements
       • The   Web-based   configuration   tool   now   works   on   systems   with   IPv6    disabled    (#3857
         <https://github.com/fish-shell/fish-shell/issues/3857>).

       • Aliases  can  ignore  arguments  by  ending  them  with  #  (#9199 <https://github.com/fish-shell/fish-
         shell/issues/9199>).

       • string is now faster when reading large strings from stdin (#9139  <https://github.com/fish-shell/fish-
         shell/issues/9139>).

       • string   repeat   uses   less   memory   and  is  faster.  (#9124  <https://github.com/fish-shell/fish-
         shell/issues/9124>)

       • Builtins are much faster when writing to a pipe or  file.  (#9229  <https://github.com/fish-shell/fish-
         shell/issues/9229>).

       • Performance improvements to highlighting (#9180 <https://github.com/fish-shell/fish-shell/issues/9180>)
         should make using fish more pleasant on slow systems.

       • On  32-bit  systems,  globs  like * will no longer fail to return some files, as large file support has
         been enabled.

   Fixed bugs
       • The history search text for a token search is now highlighted correctly if the line  contains  multiple
         instances of that text (#9066 <https://github.com/fish-shell/fish-shell/issues/9066>).

       • process-exit  and  job-exit  events are now generated for all background jobs, including those launched
         from event handlers (#9096 <https://github.com/fish-shell/fish-shell/issues/9096>).

       • A crash when completing a token that contained both a potential glob and a  quoted  variable  expansion
         was fixed (#9137 <https://github.com/fish-shell/fish-shell/issues/9137>).

       • prompt_pwd  no  longer  accidentally  overwrites  a global or universal $fish_prompt_pwd_full_dirs when
         called  with  the  -d  or   --full-length-dirs   option   (#9123   <https://github.com/fish-shell/fish-
         shell/issues/9123>).

       • A  bug  which  caused  fish  to  freeze  or  exit  after  running a command which does not preserve the
         foreground process group was fixed (#9181 <https://github.com/fish-shell/fish-shell/issues/9181>).

       • The  "Disco"  sample  prompt  no  longer  prints  an  error  in   some   working   directories   (#9164
         <https://github.com/fish-shell/fish-shell/issues/9164>).  If  you  saved  this  prompt,  you should run
         fish_config prompt save disco again.

       • fish launches external commands via the given path again, rather than always using  an  absolute  path.
         This  behaviour  was  inadvertently changed in 3.5.0 and is visible, for example, when launching a bash
         script which checks $0 (#9143 <https://github.com/fish-shell/fish-shell/issues/9143>).

       • printf no longer tries to interpret the first argument as an  option  (#9132  <https://github.com/fish-
         shell/fish-shell/issues/9132>).

       • Interactive    read    in    scripts   will   now   have   the   correct   keybindings   again   (#9227
         <https://github.com/fish-shell/fish-shell/issues/9227>).

       • A  possible  stack  overflow  when  recursively  evaluating  substitutions  has   been   fixed   (#9302
         <https://github.com/fish-shell/fish-shell/issues/9302>).

       • A   crash   with   relative   $CDPATH   has   been  fixed  (#9407  <https://github.com/fish-shell/fish-
         shell/issues/9407>).

       • printf  now  properly  fills  extra  %d  specifiers   with   0   even   on   macOS   and   BSD   (#9321
         <https://github.com/fish-shell/fish-shell/issues/9321>).

       • fish_key_reader  now  correctly  exits when receiving a SIGHUP (like after closing the terminal) (#9309
         <https://github.com/fish-shell/fish-shell/issues/9309>).

       • fish_config theme save now works as documented instead of erroring out (#9088 <https://github.com/fish-
         shell/fish-shell/issues/9088>, #9273 <https://github.com/fish-shell/fish-shell/issues/9273>).

       • fish no longer triggers prompts  to  install  command  line  tools  when  first  run  on  macOS  (#9343
         <https://github.com/fish-shell/fish-shell/issues/9343>).

       • fish_git_prompt  now  quietly  fails  on  macOS  if  the  xcrun  cache  is  not  yet  populated  (#6625
         <https://github.com/fish-shell/fish-shell/issues/6625>), working around a potential hang.

   For distributors
       • The vendored PCRE2 sources have been removed. It is recommended to declare PCRE2 as a  dependency  when
         packaging  fish. If the CMake variable FISH_USE_SYSTEM_PCRE2 is false, fish will now download and build
         PCRE2 from  the  official  repo  (#8355  <https://github.com/fish-shell/fish-shell/issues/8355>,  #8363
         <https://github.com/fish-shell/fish-shell/issues/8363>).  Note  this variable defaults to true if PCRE2
         is found installed on the system.

                                                         ----

   fish 3.5.1 (released July 20, 2022)
       This release of fish introduces the following small enhancements:

       • Cursor shaping for Vi mode is enabled by default in tmux, and will be used if  the  outer  terminal  is
         capable (#8981 <https://github.com/fish-shell/fish-shell/issues/8981>).

       • printf  returns  a  better  error  when  used  with  arguments  interpreted  as  octal  numbers  (#9035
         <https://github.com/fish-shell/fish-shell/issues/9035>).

       • history merge when in private mode is now an error, rather than wiping out other sessions'  history  (‐
         #9050 <https://github.com/fish-shell/fish-shell/issues/9050>).

       • The  error  message  when launching a command that is built for the wrong architecture on macOS is more
         helpful (#9052 <https://github.com/fish-shell/fish-shell/issues/9052>).

       • Added completions for:

         • choose (#9065 <https://github.com/fish-shell/fish-shell/issues/9065>)

         • expect (#9060 <https://github.com/fish-shell/fish-shell/issues/9060>)

         • navi (#9064 <https://github.com/fish-shell/fish-shell/issues/9064>)

         • qdbus (#9031 <https://github.com/fish-shell/fish-shell/issues/9031>)

         • reflector (#9027 <https://github.com/fish-shell/fish-shell/issues/9027>)

       • Improvements to some completions.

       This release also fixes a number of problems identified in fish 3.5.0.

       • Completing  git  blame  or  git  -C   works   correctly   (#9053   <https://github.com/fish-shell/fish-
         shell/issues/9053>).

       • On  terminals  that  emit a CSI u sequence for shift-space, fish inserts a space instead of printing an
         error. (#9054 <https://github.com/fish-shell/fish-shell/issues/9054>).

       • status fish-path on Linux-based platforms could print the path with a  "  (deleted)"  suffix  (such  as
         /usr/bin/fish   (deleted)),   which   is   now   removed   (#9019  <https://github.com/fish-shell/fish-
         shell/issues/9019>).

       • Cancelling an initial command (from fish's  --init-command  option)  with  ctrl-c  no  longer  prevents
         configuration scripts from running (#9024 <https://github.com/fish-shell/fish-shell/issues/9024>).

       • The  job  summary  contained extra blank lines if the prompt used multiple lines, which is now fixed (‐
         #9044 <https://github.com/fish-shell/fish-shell/issues/9044>).

       • Using special input functions in bindings, in combination with and/or conditionals, no  longer  crashes
         (#9051 <https://github.com/fish-shell/fish-shell/issues/9051>).

                                                         ----

   fish 3.5.0 (released June 16, 2022)
   Notable improvements and fixes
       • A  new  path  builtin command to filter and transform paths (#7659 <https://github.com/fish-shell/fish-
         shell/issues/7659>, #8958 <https://github.com/fish-shell/fish-shell/issues/8958>). For example, to list
         all the separate extensions used on files in /usr/share/man (after removing one extension,  commonly  a
         ".gz"):

            path filter -f /usr/share/man/** | path change-extension '' | path extension | path sort -u

       • Tab (or any key bound to complete) now expands wildcards instead of invoking completions, if there is a
         wildcard   in   the   path   component  under  the  cursor  (#954  <https://github.com/fish-shell/fish-
         shell/issues/954>, #8593 <https://github.com/fish-shell/fish-shell/issues/8593>).

       • Scripts can now catch and handle the SIGINT and SIGTERM signals, either  via  function  --on-signal  or
         with trap (#6649 <https://github.com/fish-shell/fish-shell/issues/6649>).

   Deprecations and removed features
       • The  stderr-nocaret  feature  flag, introduced in fish 3.0 and enabled by default in fish 3.1, has been
         made read-only.  That means it is no  longer  possible  to  disable  it,  and  code  supporting  the  ^
         redirection  has  been  removed  (#8857  <https://github.com/fish-shell/fish-shell/issues/8857>,  #8865
         <https://github.com/fish-shell/fish-shell/issues/8865>).

         To recap: fish used to support ^ to redirect stderr, so you could use commands like:

            test "$foo" -gt 8 ^/dev/null

         to ignore error messages. This made the ^ symbol require escaping and quoting, and was a bit of a weird
         shortcut considering 2> already worked, which is only one character longer.

         So the above can simply become:

            test "$foo" -gt 8 2>/dev/null

       • The following feature flags have been enabled by default:

         • regex-easyesc, which makes string replace -r  not  do  a  superfluous  round  of  unescaping  in  the
           replacement  expression.   That means e.g. to escape any "a" or "b" in an argument you can use string
           replace -ra '([ab])' '\\\\$1' foobar instead of needing 8 backslashes.

           This only affects the replacement expression, not the match expression  (the  '([ab])'  part  in  the
           example).   A survey of plugins on GitHub did not turn up any affected code, so we do not expect this
           to affect many users.

           This flag was introduced in fish 3.1.

         • ampersand-nobg-in-token, which means that & will not create a background job  if  it  occurs  in  the
           middle  of  a word. For example, echo foo&bar will print "foo&bar" instead of running echo foo in the
           background and then starting bar as a second job.

           Reformatting with fish_indent would already introduce spaces, turning echo foo&bar into  echo  foo  &
           bar.

           This flag was introduced in fish 3.4.

         To  turn  off  these  flags,  add  no-regex-easyesc  or no-ampersand-nobg-in-token to fish_features and
         restart fish:

            set -Ua fish_features no-regex-easyesc

         Like stderr-nocaret, they will eventually be made read-only.

       • Most string subcommands no longer append a newline to their input if the input didn't have  one  (#8473
         <https://github.com/fish-shell/fish-shell/issues/8473>,    #3847   <https://github.com/fish-shell/fish-
         shell/issues/3847>)

       • Fish's escape sequence removal (like for string length --visible or to figure out how wide  the  prompt
         is)  no  longer  has special support for non-standard color sequences like from Data General terminals,
         e.g. the Data General Dasher D220 from 1984. This removes a bunch of work in the common case,  allowing
         string length --visible to be much faster with unknown escape sequences. We don't expect anyone to have
         ever used fish with such a terminal (#8769 <https://github.com/fish-shell/fish-shell/issues/8769>).

       • Code  to  upgrade universal variables from fish before 3.0 has been removed. Users who upgrade directly
         from fish versions 2.7.1 or before will have to set their universal variables & abbreviations again. (‐
         #8781 <https://github.com/fish-shell/fish-shell/issues/8781>)

       • The meaning  of  an  empty  color  variable  has  changed  (#8793  <https://github.com/fish-shell/fish-
         shell/issues/8793>).  Previously,  when  a  variable  was set but empty, it would be interpreted as the
         "normal" color. Now, empty color variables cause the same effect  as  unset  variables  -  the  general
         highlighting variable for that type is used instead. For example:

            set -g fish_color_command blue
            set -g fish_color_keyword

         would  previously  make keywords "normal" (usually white in a dark terminal). Now it'll make them blue.
         To achieve the previous behavior, use the normal color explicitly: set -g fish_color_keyword normal.

         This makes it easier to make self-contained color schemes that don't accidentally use  color  that  was
         set before.  fish_config has been adjusted to set known color variables that a theme doesn't explicitly
         set to empty.

       • eval  is now a reserved keyword, so it can't be used as a function name. This follows set and read, and
         is necessary because it can't be cleanly shadowed by a function - at the very least eval  set  -l  argv
         foo  breaks. Fish will ignore autoload files for it, so left over eval.fish from previous fish versions
         won't be loaded.

       • The git prompt in informative mode now defaults to skipping  counting  untracked  files,  as  this  was
         extremely  slow.  To  turn  it on, set __fish_git_prompt_showuntrackedfiles or set the git config value
         "bash.showuntrackedfiles" to true explicitly (which can  be  done  for  individual  repositories).  The
         "informative+vcs"  sample  prompt already skipped display of untracked files, but didn't do so in a way
         that  skipped  the  computation,  so  it  should  be  quite  a  bit  faster  in   many   cases   (#8980
         <https://github.com/fish-shell/fish-shell/issues/8980>).

       • The  __terlar_git_prompt  function,  used  by  the  "Terlar"  sample  prompt,  has  been  rebuilt  as a
         configuration of the normal fish_git_prompt to ease maintenance, improve performance and  add  features
         (like  reading  per-repo git configuration). Some slight changes remain; users who absolutely must have
         the same behavior are encouraged to copy the old function  (#9011  <https://github.com/fish-shell/fish-
         shell/issues/9011>,       #7918      <https://github.com/fish-shell/fish-shell/issues/7918>,      #8979
         <https://github.com/fish-shell/fish-shell/issues/8979>).

   Scripting improvements
       • Quoted command substitution that directly follow a variable expansion (like echo  "$var$(echo  x)")  no
         longer affect the variable expansion (#8849 <https://github.com/fish-shell/fish-shell/issues/8849>).

       • Fish  now  correctly  expands  command  substitutions that are preceded by an escaped dollar (like echo
         \$(echo)). This regressed in version 3.4.0.

       • math can now handle underscores (_) as visual separators in  numbers  (#8611  <https://github.com/fish-
         shell/fish-shell/issues/8611>, #8496 <https://github.com/fish-shell/fish-shell/issues/8496>):

            math 5 + 2_123_252

       • math's  min  and max functions now take a variable number of arguments instead of always requiring 2 (‐
         #8644    <https://github.com/fish-shell/fish-shell/issues/8644>,    #8646     <https://github.com/fish-
         shell/fish-shell/issues/8646>):

            > math min 8,2,4
            2

       • read  is  now  faster  as  the  last  process in a pipeline (#8552 <https://github.com/fish-shell/fish-
         shell/issues/8552>).

       • string join gained a new --no-empty flag  to  skip  empty  arguments  (#8774  <https://github.com/fish-
         shell/fish-shell/issues/8774>, #8351 <https://github.com/fish-shell/fish-shell/issues/8351>).

       • read  now only triggers the fish_read event, not the fish_prompt event (#8797 <https://github.com/fish-
         shell/fish-shell/issues/8797>). It was supposed to work this way in fish  3.2.0  and  later,  but  both
         events were emitted.

       • The  TTY  modes  are no longer restored when non-interactive shells exit. This fixes wrong tty modes in
         pipelines with interactive commands. (#8705 <https://github.com/fish-shell/fish-shell/issues/8705>).

       • Some functions shipped with fish printed error messages to standard output, but they now  they  rightly
         go to standard error (#8855 <https://github.com/fish-shell/fish-shell/issues/8855>).

       • jobs  now  correctly  reports  CPU  usage as a percentage, instead of as a number of clock ticks (#8919
         <https://github.com/fish-shell/fish-shell/issues/8919>).

       • process-exit events now fire when the process exits even if the  job  has  not  yet  exited,  fixing  a
         regression in 3.4.1 (#8914 <https://github.com/fish-shell/fish-shell/issues/8914>).

   Interactive improvements
       • Fish  now  reports a special error if a command wasn't found and there is a non-executable file by that
         name in PATH (#8804 <https://github.com/fish-shell/fish-shell/issues/8804>).

       • less and other interactive commands would occasionally be stopped when run  in  a  pipeline  with  fish
         functions; this has been fixed (#8699 <https://github.com/fish-shell/fish-shell/issues/8699>).

       • Case-changing  autosuggestions  generated  mid-token  now  correctly append only the suffix, instead of
         duplicating the token (#8820 <https://github.com/fish-shell/fish-shell/issues/8820>).

       • ulimit learned a number of new options for the resource limits available on Linux, FreeBSD ande NetBSD,
         and returns a specific warning if the limit specified is not available on the active  operating  system
         (#8823    <https://github.com/fish-shell/fish-shell/issues/8823>,    #8786    <https://github.com/fish-
         shell/fish-shell/issues/8786>).

       • The  vared  command  can  now  successfully   edit   variables   named   "tmp"   or   "prompt"   (#8836
         <https://github.com/fish-shell/fish-shell/issues/8836>,    #8837   <https://github.com/fish-shell/fish-
         shell/issues/8837>).

       • time now emits an error if used after the first command in a pipeline (#8841  <https://github.com/fish-
         shell/fish-shell/issues/8841>).

       • fish_add_path  now  prints  a  message  for  skipped  non-existent  paths when using the -v flag (#8884
         <https://github.com/fish-shell/fish-shell/issues/8884>).

       • Since fish 3.2.0, pressing ctrl-d while a command is running would end up inserting a  space  into  the
         next commandline, which has been fixed (#8871 <https://github.com/fish-shell/fish-shell/issues/8871>).

       • A  bug  that caused multi-line prompts to be moved down a line when pasting or switching modes has been
         fixed (#3481 <https://github.com/fish-shell/fish-shell/issues/3481>).

       • The Web-based configuration system no longer strips too many quotes in the abbreviation display  (#8917
         <https://github.com/fish-shell/fish-shell/issues/8917>,    #8918   <https://github.com/fish-shell/fish-
         shell/issues/8918>).

       • Fish started with --no-config will now use the  default  keybindings  (#8493  <https://github.com/fish-
         shell/fish-shell/issues/8493>)

       • When  fish  inherits a USER environment variable value that doesn't correspond to the current effective
         user  ID,  it  will  now  correct  it  in   all   cases   (#8879   <https://github.com/fish-shell/fish-
         shell/issues/8879>, #8583 <https://github.com/fish-shell/fish-shell/issues/8583>).

       • Fish sets a new EUID variable containing the current effective user id (#8866 <https://github.com/fish-
         shell/fish-shell/issues/8866>).

       • history  search  no  longer  interprets  the  search term as an option (#8853 <https://github.com/fish-
         shell/fish-shell/issues/8853>)

       • The status message when a job terminates should no longer  be  erased  by  a  multiline  prompt  (#8817
         <https://github.com/fish-shell/fish-shell/issues/8817>)

   New or improved bindings
       • The  alt-s  binding  will now insert doas instead of sudo if necessary (#8942 <https://github.com/fish-
         shell/fish-shell/issues/8942>).

       • The kill-whole-line special input function now kills the newline preceeding the last line.  This  makes
         dd in vi-mode clear the last line properly.

       • The  new  kill-inner-line  special  input  function kills the line without any newlines, allowing cc in
         vi-mode to  clear  the  line  while  preserving  newlines  (#8983  <https://github.com/fish-shell/fish-
         shell/issues/8983>).

       • On  terminals  that emit special sequences for these combinations, shift-space is bound like space, and
         ctrl-enter is bound like return (#8874 <https://github.com/fish-shell/fish-shell/issues/8874>).

   Improved prompts
       • A new Astronaut prompt  (#8775  <https://github.com/fish-shell/fish-shell/issues/8775>),  a  multi-line
         prompt using plain text reminiscent of the Starship.rs prompt.

   Completions
       • Added completions for:

         • archlinux-java (#8911 <https://github.com/fish-shell/fish-shell/issues/8911>)

         • apk (#8951 <https://github.com/fish-shell/fish-shell/issues/8951>)

         • brightnessctl (#8758 <https://github.com/fish-shell/fish-shell/issues/8758>)

         • efibootmgr (#9010 <https://github.com/fish-shell/fish-shell/issues/9010>)

         • fastboot (#8904 <https://github.com/fish-shell/fish-shell/issues/8904>)

         • optimus-manager (#8913 <https://github.com/fish-shell/fish-shell/issues/8913>)

         • rclone (#8819 <https://github.com/fish-shell/fish-shell/issues/8819>)

         • sops (#8821 <https://github.com/fish-shell/fish-shell/issues/8821>)

         • tuned-adm (#8760 <https://github.com/fish-shell/fish-shell/issues/8760>)

         • wg-quick (#8687 <https://github.com/fish-shell/fish-shell/issues/8687>)

       • complete  can  now be given multiple --condition options. They will be attempted in the order they were
         given, and only if all succeed will the completion be made available (as if they  were  connected  with
         &&). This helps with caching - fish's complete system stores the return value of each condition as long
         as  the  commandline  doesn't  change,  so  this  can  reduce  the number of conditions that need to be
         evaluated         (#8536         <https://github.com/fish-shell/fish-shell/issues/8536>,          #8967
         <https://github.com/fish-shell/fish-shell/issues/8967>).

   Improved terminal support
       • Working   directory   reporting   is  enabled  for  kitty  (#8806  <https://github.com/fish-shell/fish-
         shell/issues/8806>).

       • Changing the cursor shape  is  now  enabled  by  default  in  iTerm2  (#3696  <https://github.com/fish-
         shell/fish-shell/issues/3696>).

   For distributors
       • libatomic    is    now   correctly   detected   as   necessary   when   building   on   RISC-V   (#8850
         <https://github.com/fish-shell/fish-shell/issues/8850>,   #8851    <https://github.com/fish-shell/fish-
         shell/issues/8851>).

       • In  some  cases,  the  build  process  found the wrong libintl on macOS. This has been corrected (#5244
         <https://github.com/fish-shell/fish-shell/issues/5244>).

       • The  paths  for  completions,  functions,  and  configuration  snippets  now   include   subdirectories
         fish/vendor_completions.d,   fish/vendor_functions.d,   and  fish/vendor_conf.d  (respectively)  within
         XDG_DATA_HOME  (or  ~/.local/share  if   not   defined)   (#8887   <https://github.com/fish-shell/fish-
         shell/issues/8887>, #7816 <https://github.com/fish-shell/fish-shell/issues/7816>).

                                                         ----

   fish 3.4.1 (released March 25, 2022)
       This release of fish fixes the following problems identified in fish 3.4.0:

       • An  error  printed after upgrading, where old instances could pick up a newer version of the fish_title
         function, has been fixed (#8778 <https://github.com/fish-shell/fish-shell/issues/8778>)

       • fish builds correctly  on  NetBSD  (#8788  <https://github.com/fish-shell/fish-shell/issues/8788>)  and
         OpenIndiana (#8780 <https://github.com/fish-shell/fish-shell/issues/8780>).

       • nextd-or-forward-word,  bound  to  alt-right  by  default,  was  inadvertently  changed  to  move  like
         forward-bigword.            This            has            been            corrected             (#8790
         <https://github.com/fish-shell/fish-shell/issues/8790>).

       • funcsave  -q  and  funcsave  --quiet  now  work  correctly  (#8830 <https://github.com/fish-shell/fish-
         shell/issues/8830>).

       • Issues with the csharp and nmcli completions were corrected.

       If you are upgrading from version 3.3.1 or before,  please  also  review  the  release  notes  for  3.4.0
       (included below).

                                                         ----

   fish 3.4.0 (released March 12, 2022)
   Notable improvements and fixes
       • fish's  command  substitution syntax has been extended: $(cmd) now has the same meaning as (cmd) but it
         can  be  used  inside   double   quotes,   to   prevent   line   splitting   of   the   results   (#159
         <https://github.com/fish-shell/fish-shell/issues/159>):

            foo (bar | string collect)
            # can now be written as
            foo "$(bar)"

            # and

            foo (bar)
            # can now be written as
            foo $(bar)
            # this will still split on newlines only.

       • Complementing  the prompt command in 3.3.0, fish_config gained a theme subcommand to show and pick from
         the sample themes (meaning color schemes) directly in the terminal, instead of having  to  open  a  Web
         browser.  For  example fish_config theme choose Nord loads the Nord theme in the current session (#8132
         <https://github.com/fish-shell/fish-shell/issues/8132>).  The  current  theme   can   be   saved   with
         fish_config theme dump, and custom themes can be added by saving them in ~/.config/fish/themes/.

       • set  and  read  learned  a  new option, --function, to set a variable in the function's top scope. This
         should be a more familiar way of scoping variables and avoids issues with --local,  which  is  actually
         block-scoped         (#565         <https://github.com/fish-shell/fish-shell/issues/565>,         #8145
         <https://github.com/fish-shell/fish-shell/issues/8145>):

            function demonstration
                if true
                    set --function foo bar
                    set --local baz banana
                end
                echo $foo # prints "bar" because $foo is still valid
                echo $baz # prints nothing because $baz went out of scope
            end

       • string pad now excludes escape sequences like colors that fish knows about, and a new --visible flag to
         string length makes it use that kind of visible width. This is useful to get  the  number  of  terminal
         cells  an  already  colored  string  would  occupy,  like in a prompt. (#8182 <https://github.com/fish-
         shell/fish-shell/issues/8182>,  #7784   <https://github.com/fish-shell/fish-shell/issues/7784>,   #4012
         <https://github.com/fish-shell/fish-shell/issues/4012>):

            > string length --visible (set_color red)foo
            3

       • Performance  improvements  to  globbing,  especially  on  systems  using  glibc.  In  some cases (large
         directories with files with many numbers in the names) this almost halves the time taken to expand  the
         glob.

       • Autosuggestions  can  now  be turned off by setting $fish_autosuggestion_enabled to 0, and (almost) all
         highlighting can be turned off by choosing the new "None" theme. The  exception  is  necessary  colors,
         like    those    which   distinguish   autosuggestions   from   the   actual   command   line.   (#8376
         <https://github.com/fish-shell/fish-shell/issues/8376>)

       • The fish_git_prompt function, which is included in the default prompts,  now  overrides  git  to  avoid
         running   commands  set by per-repository configuration. This avoids a potential security issue in some
         circumstances,  and  has  been  assigned  CVE-2022-20001  (#8589   <https://github.com/fish-shell/fish-
         shell/issues/8589>).

   Deprecations and removed features
       • A  new  feature  flag, ampersand-nobg-in-token makes & only act as background operator if followed by a
         separator. In combination with qmark-noglob, this allows entering most URLs at the command line without
         quoting or escaping (#7991 <https://github.com/fish-shell/fish-shell/issues/7991>). For example:

            > echo foo&bar # will print "foo&bar", instead of running "echo foo" in the background and executing "bar"
            > echo foo & bar # will still run "echo foo" in the background and then run "bar"
            # with both ampersand-nobg-in-token and qmark-noglob, this argument has no special characters anymore
            > open https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be

         As   a   reminder,   feature   flags    can    be    set    on    startup    with    fish    --features
         ampersand-nobg-in-token,qmark-noglob or with a universal variable called fish_features:

            > set -Ua fish_features ampersand-nobg-in-token

       • $status  is now forbidden as a command, to prevent a surprisingly common error among new users: Running
         if  $status  (#8171  <https://github.com/fish-shell/fish-shell/issues/8171>).  This  applies  only   to
         $status, other variables are still allowed.

       • set  --query  now  returns  an exit status of 255 if given no variable names. This means if set -q $foo
         will not enter the if-block if $foo is empty or unset. To restore the previous behavior, use if not set
         -q foo; or set -q $foo - but  this  is  unlikely  to  be  desireable  (#8214  <https://github.com/fish-
         shell/fish-shell/issues/8214>).

       • _ is now a reserved keyword (#8342 <https://github.com/fish-shell/fish-shell/issues/8342>).

       • The  special  input  functions delete-or-exit, nextd-or-forward-word and prevd-or-backward-word replace
         fish functions of the same names (#8538 <https://github.com/fish-shell/fish-shell/issues/8538>).

       • Mac OS X 10.9 is no longer supported. The minimum Mac version is now 10.10 "Yosemite."

   Scripting improvementsstring collect supports a new --allow-empty option, which will output one empty argument in  a  command
         substitution  that  has  no output (#8054 <https://github.com/fish-shell/fish-shell/issues/8054>). This
         allows commands like test -n (echo -n | string collect --allow-empty) to work more reliably. Note  this
         can also be written as test -n "$(echo -n)" (see above).

       • string  match gained a --groups-only option, which makes it only output capturing groups, excluding the
         full match. This allows string match to  do  simple  transformations  (#6056  <https://github.com/fish-
         shell/fish-shell/issues/6056>):

            > string match -r --groups-only '(.*)fish' 'catfish' 'twofish' 'blue fish' | string escape
            cat
            two
            'blue '

       • $fish_user_paths  is  now  automatically  deduplicated to fix a common user error of appending to it in
         config.fish  when  it  is  universal  (#8117   <https://github.com/fish-shell/fish-shell/issues/8117>).
         fish_add_path remains the recommended way to add to $PATH.

       • return  can  now  be used outside functions. In scripts, it does the same thing as exit. In interactive
         mode,it sets $status without exiting (#8148 <https://github.com/fish-shell/fish-shell/issues/8148>).

       • An  oversight  prevented  all  syntax  checks  from  running  on  commands  given  to  fish  -c  (#8171
         <https://github.com/fish-shell/fish-shell/issues/8171>).  This  includes  checks such as exec not being
         allowed in a pipeline, and $$ not being a  valid  variable.  Generally,  another  error  was  generated
         anyway.

       • fish_indent  now  correctly  reformats  tokens  that  end with a backslash followed by a newline (#8197
         <https://github.com/fish-shell/fish-shell/issues/8197>).

       • commandline gained an --is-valid option to check  if  the  command  line  is  syntactically  valid  and
         complete.  This  allows  basic  implementation  of  transient  prompts (#8142 <https://github.com/fish-
         shell/fish-shell/issues/8142>).

       • commandline gained a --paging-full-mode option to check if the pager is showing all the possible  lines
         (no "7 more rows" message) (#8485 <https://github.com/fish-shell/fish-shell/issues/8485>).

       • List   expansion   correctly   reports   an   error   when   used   with   all   zero   indexes  (#8213
         <https://github.com/fish-shell/fish-shell/issues/8213>).

       • Running fish with a directory instead of a script as argument  (eg  fish  .)  no  longer  leads  to  an
         infinite   loop.   Instead   it  errors  out  immediately  (#8258  <https://github.com/fish-shell/fish-
         shell/issues/8258>)

       • Some error messages occuring after fork, like "text file busy" have  been  replaced  by  bespoke  error
         messages  for  fish (like "File is currently open for writing"). This also restores error messages with
         current  glibc  versions   that   removed   sys_errlist   (#8234   <https://github.com/fish-shell/fish-
         shell/issues/8234>, #4183 <https://github.com/fish-shell/fish-shell/issues/4183>).

       • The  realpath  builtin  now  also  squashes  leading  slashes  with  the  --no-symlinks  option  (#8281
         <https://github.com/fish-shell/fish-shell/issues/8281>).

       • When trying to cd to a dangling (broken) symbolic link, fish will print an error noting that the target
         is a broken link (#8264 <https://github.com/fish-shell/fish-shell/issues/8264>).

       • On MacOS terminals that are not granted permissions to access a  folder,  cd  would  print  a  spurious
         "rotten    symlink"    error,    which    has    been   corrected   to   "permission   denied"   (#8264
         <https://github.com/fish-shell/fish-shell/issues/8264>).

       • Since fish 3.0, for loops would trigger a variable handler function before the loop was entered. As the
         variable had not actually changed or been set, this was a spurious event and has  been  removed  (#8384
         <https://github.com/fish-shell/fish-shell/issues/8384>).

       • math  now  correctly  prints negative values and values larger than 2**31 when in hex or octal bases (‐
         #8417 <https://github.com/fish-shell/fish-shell/issues/8417>).

       • dirs  always  produces  an  exit   status   of   0,   instead   of   sometimes   returning   1   (#8211
         <https://github.com/fish-shell/fish-shell/issues/8211>).

       • cd "" no longer crashes fish (#8147 <https://github.com/fish-shell/fish-shell/issues/8147>).

       • set  --query  can  now  query  whether  a  variable  is  a  path variable via --path or --unpath (#8494
         <https://github.com/fish-shell/fish-shell/issues/8494>).

       • Tilde characters (~) produced by custom completions are no longer escaped when applied to  the  command
         line,  making  it  easier  to  use  the  output of a recursive complete -C in completion scripts (#4570
         <https://github.com/fish-shell/fish-shell/issues/4570>).

       • set  --show  reports  when  a  variable  is   read-only   (#8179   <https://github.com/fish-shell/fish-
         shell/issues/8179>).

       • Erasing   $fish_emoji_width   will   reset   fish   to   the   default   guessed   emoji  width  (#8274
         <https://github.com/fish-shell/fish-shell/issues/8274>).

       • The la function no longer lists entries for "."  and  "..",  matching  other  systems  defaults  (#8519
         <https://github.com/fish-shell/fish-shell/issues/8519>).

       • abbr  -q  returns  the  correct  exit status when given multiple abbreviation names as arguments (#8431
         <https://github.com/fish-shell/fish-shell/issues/8431>).

       • command  -v  returns  an  exit  status  of  127  instead  of  1  if  no  command   was   found   (#8547
         <https://github.com/fish-shell/fish-shell/issues/8547>).

       • argparse  with  --ignore-unknown no longer breaks with multiple unknown options in a short option group
         (#8637 <https://github.com/fish-shell/fish-shell/issues/8637>).

       • Comments inside command substitutions  or  brackets  now  correctly  ignore  parentheses,  quotes,  and
         brackets (#7866 <https://github.com/fish-shell/fish-shell/issues/7866>, #8022 <https://github.com/fish-
         shell/fish-shell/issues/8022>, #8695 <https://github.com/fish-shell/fish-shell/issues/8695>).

       • complete  -C  supports a new --escape option, which turns on escaping in returned completion strings (‐
         #3469 <https://github.com/fish-shell/fish-shell/issues/3469>).

       • Invalid byte or unicode escapes like \Utest or \xNotHex are now a tokenizer error  instead  of  causing
         the token to be truncated (#8545 <https://github.com/fish-shell/fish-shell/issues/8545>).

   Interactive improvements
       • Vi  mode  cursors  are  now  set  properly  after  ctrl-c  (#8125  <https://github.com/fish-shell/fish-
         shell/issues/8125>).

       • funced will try to edit the whole file  containing  a  function  definition,  if  there  is  one  (#391
         <https://github.com/fish-shell/fish-shell/issues/391>).

       • Running a command line consisting of just spaces now deletes an ephemeral (starting with space) history
         item again (#8232 <https://github.com/fish-shell/fish-shell/issues/8232>).

       • Command substitutions no longer respect job control, instead running inside fish's own process group (‐
         #8172  <https://github.com/fish-shell/fish-shell/issues/8172>). This more closely matches other shells,
         and improves ctrl-c reliability inside a command substitution.

       • history and __fish_print_help now properly support less before version 530, including the version  that
         ships with macOS. (#8157 <https://github.com/fish-shell/fish-shell/issues/8157>).

       • help  now  knows  which  section is in which document again (#8245 <https://github.com/fish-shell/fish-
         shell/issues/8245>).

       • fish's highlighter will now color options (starting with - or --) with  the  color  given  in  the  new
         $fish_color_option,  up  to  the  first  --. It falls back on $fish_color_param, so nothing changes for
         existing setups (#8292 <https://github.com/fish-shell/fish-shell/issues/8292>).

       • When executing a command, abbreviations are no longer expanded when the cursor is  separated  from  the
         command  by  spaces, making it easier to suppress abbreviation expansion of commands without arguments.
         (#8423 <https://github.com/fish-shell/fish-shell/issues/8423>).

       • fish_key_reader's output was simplified. By default, it now only prints a bind statement. The  previous
         per-character    timing    information   can   be   seen   with   a   new   --verbose   switch   (#8467
         <https://github.com/fish-shell/fish-shell/issues/8467>).

       • Custom completions are now also loaded for commands that contain tildes or variables like ~/bin/fish or
         $PWD/fish (#8442 <https://github.com/fish-shell/fish-shell/issues/8442>).

       • Command lines spanning multiple lines will not be overwritten by the completion pager when it fills the
         entire     terminal      (#8509      <https://github.com/fish-shell/fish-shell/issues/8509>,      #8405
         <https://github.com/fish-shell/fish-shell/issues/8405>).

       • When   redrawing   a   multiline   prompt,   the   old   prompt   is   now   properly   cleared  (#8163
         <https://github.com/fish-shell/fish-shell/issues/8163>).

       • Interactive completion would occasionally ignore the last word on  the  command  line  due  to  a  race
         condition. This has been fixed (#8175 <https://github.com/fish-shell/fish-shell/issues/8175>).

       • Propagation   of   universal   variables  from  a  fish  process  that  is  closing  is  faster  (#8209
         <https://github.com/fish-shell/fish-shell/issues/8209>).

       • The  command  line  is  drawn  in  the  correct  place  if  the  prompt  ends  with  a  newline  (#8298
         <https://github.com/fish-shell/fish-shell/issues/8298>).

       • history  learned  a  new  subcommand clear-session to erase all history from the current session (#5791
         <https://github.com/fish-shell/fish-shell/issues/5791>).

       • Pressing ctrl-c in fish_key_reader will no longer print the incorrect "Press [ctrl-C]  again  to  exit"
         message (#8510 <https://github.com/fish-shell/fish-shell/issues/8510>).

       • The default command-not-found handler for Fedora/PackageKit now passes the whole command line, allowing
         for  functionality  such  as  running  the  suggested command directly (#8579 <https://github.com/fish-
         shell/fish-shell/issues/8579>).

       • When looking for locale information, the  Debian  configuration  is  now  used  when  available  (#8557
         <https://github.com/fish-shell/fish-shell/issues/8557>).

       • Pasting   text   containing   quotes   from  the  clipboard  trims  spaces  more  appropriately  (#8550
         <https://github.com/fish-shell/fish-shell/issues/8550>).

       • The clipboard bindings ignore X-based clipboard programs if the DISPLAY  environment  variable  is  not
         set, which helps prefer the Windows clipboard when it is available (such as on WSL).

       • funcsave will remove a saved copy of a function that has been erased with functions --erase.

       • The  Web-based  configuration  tool gained a number of improvements, including the ability to set pager
         colors.

       • The default fish_title prints a shorter title with shortened $PWD and no more redundant  "fish"  (#8641
         <https://github.com/fish-shell/fish-shell/issues/8641>).

       • Holding   down  an  arrow  key  won't  freeze  the  terminal  with  long  periods  of  flashing  (#8610
         <https://github.com/fish-shell/fish-shell/issues/8610>).

       • Multi-char bindings  are  no  longer  interrupted  if  a  signal  handler  enqueues  an  event.  (#8628
         <https://github.com/fish-shell/fish-shell/issues/8628>).

   New or improved bindingsescape  can  now  bound without breaking arrow key bindings (#8428 <https://github.com/fish-shell/fish-
         shell/issues/8428>).

       • The  alt-h  binding  (to  open  a  command’s   manual   page)   now   also   ignores   command   (#8447
         <https://github.com/fish-shell/fish-shell/issues/8447>).

   Improved prompts
       • The  fish_status_to_signal  helper  function returns the correct signal names for the current platform,
         rather than Linux (#8530 <https://github.com/fish-shell/fish-shell/issues/8530>).

       • The prompt_pwd helper function learned a --full-length-dirs N option  to  keep  the  last  N  directory
         components  unshortened.  In  addition  the  number  of  characters to shorten each component should be
         shortened to can now be given as -d N or --dir-length  N.  (#8208  <https://github.com/fish-shell/fish-
         shell/issues/8208>):

            > prompt_pwd --full-length-dirs 2 -d 1 ~/dev/fish-shell/share/tools/web_config
            ~/d/f/s/tools/web_config

   Completions
       • Added completions for:

         • Apple's shortcutsargparse (#8434 <https://github.com/fish-shell/fish-shell/issues/8434>)

         • asd (#8759 <https://github.com/fish-shell/fish-shell/issues/8759>)

         • az (#8141 <https://github.com/fish-shell/fish-shell/issues/8141>)

         • black (#8123 <https://github.com/fish-shell/fish-shell/issues/8123>)

         • clasp (#8373 <https://github.com/fish-shell/fish-shell/issues/8373>)

         • cpupower (#8302 <https://github.com/fish-shell/fish-shell/issues/8302>)

         • dart (#8315 <https://github.com/fish-shell/fish-shell/issues/8315>)

         • dscacheutilelvish (#8416 <https://github.com/fish-shell/fish-shell/issues/8416>)

         • ethtool (#8283 <https://github.com/fish-shell/fish-shell/issues/8283>)

         • exif (#8246 <https://github.com/fish-shell/fish-shell/issues/8246>)

         • findstr (#8481 <https://github.com/fish-shell/fish-shell/issues/8481>)

         • git-sizer (#8156 <https://github.com/fish-shell/fish-shell/issues/8156>)

         • gnome-extensions (#8732 <https://github.com/fish-shell/fish-shell/issues/8732>)

         • gping (#8181 <https://github.com/fish-shell/fish-shell/issues/8181>)

         • isatty (#8609 <https://github.com/fish-shell/fish-shell/issues/8609>)

         • istioctl (#8343 <https://github.com/fish-shell/fish-shell/issues/8343>)

         • kmutilkubectl (#8734 <https://github.com/fish-shell/fish-shell/issues/8734>)

         • matlab (#8505 <https://github.com/fish-shell/fish-shell/issues/8505>)

         • mono   (#8415   <https://github.com/fish-shell/fish-shell/issues/8415>)  and  related  tools  csharp,
           gacutil,  gendarme,  ikdasm,   ilasm,   mkbundle,   monodis,   monop,   sqlsharp   and   xsp   (#8452
           <https://github.com/fish-shell/fish-shell/issues/8452>)

         • Angular's ng (#8111 <https://github.com/fish-shell/fish-shell/issues/8111>)

         • nodeenv (#8533 <https://github.com/fish-shell/fish-shell/issues/8533>)

         • octave (#8505 <https://github.com/fish-shell/fish-shell/issues/8505>)

         • pabcnet_clear (#8421 <https://github.com/fish-shell/fish-shell/issues/8421>)

         • qmk (#8180 <https://github.com/fish-shell/fish-shell/issues/8180>)

         • rakudo (#8113 <https://github.com/fish-shell/fish-shell/issues/8113>)

         • rc-status (#8757 <https://github.com/fish-shell/fish-shell/issues/8757>)

         • roswell (#8330 <https://github.com/fish-shell/fish-shell/issues/8330>)

         • sbcl (#8330 <https://github.com/fish-shell/fish-shell/issues/8330>)

         • starship (#8520 <https://github.com/fish-shell/fish-shell/issues/8520>)

         • topgrade (#8651 <https://github.com/fish-shell/fish-shell/issues/8651>)

         • wine, wineboot and winemaker (#8411 <https://github.com/fish-shell/fish-shell/issues/8411>)

         • Windows   Subsystem   for   Linux   (WSL)'s   wslpath   (#8364   <https://github.com/fish-shell/fish-
           shell/issues/8364>)

         • Windows' color (#8483  <https://github.com/fish-shell/fish-shell/issues/8483>),  attrib,  attributes,
           choice,  clean,  cleanmgr,  cmd,  cmdkey,  comp,  forfiles,  powershell,  reg,  schtasks, setx (#8486
           <https://github.com/fish-shell/fish-shell/issues/8486>)

         • zef (#8114 <https://github.com/fish-shell/fish-shell/issues/8114>)

       • Improvements  to  many  completions,  especially  for  git  aliases  (#8129   <https://github.com/fish-
         shell/fish-shell/issues/8129>),       subcommands      (#8134      <https://github.com/fish-shell/fish-
         shell/issues/8134>) and submodules (#8716 <https://github.com/fish-shell/fish-shell/issues/8716>).

       • Many adjustments to complete correct options for system utilities on BSD and macOS.

       • When evaluating custom completions, the command  line  state  no  longer  includes  variable  overrides
         (var=val). This unbreaks completions that read commandline -op.

   Improved terminal support
       • Dynamic   terminal   titles   are   enabled   on  WezTerm  (#8121  <https://github.com/fish-shell/fish-
         shell/issues/8121>).

       • Directory history navigation works out of the box with Apple Terminal's  default  key  settings  (#2330
         <https://github.com/fish-shell/fish-shell/issues/2330>).

       • fish  now assumes Unicode 9+ widths for emoji under iTerm 2 (#8200 <https://github.com/fish-shell/fish-
         shell/issues/8200>).

       • Skin-tone  emoji  modifiers  (U+1F3FB  through  U+1F3FF)  are  now   measured   as   width   0   (#8275
         <https://github.com/fish-shell/fish-shell/issues/8275>).

       • fish's escape sequence removal now also knows Tmux's wrapped escapes.

       • Vi   mode  cursors  are  enabled  in  Apple  Terminal.app  (#8167  <https://github.com/fish-shell/fish-
         shell/issues/8167>).

       • Vi cursor shaping and $PWD reporting is now  also  enabled  on  foot  (#8422  <https://github.com/fish-
         shell/fish-shell/issues/8422>).

       • ls  will  use  colors  also  on  newer  versions of Apple Terminal.app (#8309 <https://github.com/fish-
         shell/fish-shell/issues/8309>).

       • The delete and shift-tab keys work more reliably under st  (#8352  <https://github.com/fish-shell/fish-
         shell/issues/8352>, #8354 <https://github.com/fish-shell/fish-shell/issues/8354>).

   Other improvements
       • Fish's  test  suite  now  uses ctest, and has become much faster to run. It is now also possible to run
         only specific tests with targets named test_$filename - make test_set.fish only runs the set.fish test.
         (#7851 <https://github.com/fish-shell/fish-shell/issues/7851>)

       • The  HTML  version  of  the  documentation  now  includes  copy  buttons  for  code   examples   (#8218
         <https://github.com/fish-shell/fish-shell/issues/8218>).

       • The  HTML version of the documentation and the web-based configuration tool now pick more modern system
         fonts instead of falling back to Arial  and  something  like  Courier  New  most  of  the  time  (#8632
         <https://github.com/fish-shell/fish-shell/issues/8632>).

       • The  Debian  & Ubuntu package linked from fishshell.com is now a single package, rather than split into
         fish and fish-common (#7845 <https://github.com/fish-shell/fish-shell/issues/7845>).

       • The macOS installer does not assert that Rosetta is required to install fish  on  machines  with  Apple
         Silicon (#8566 <https://github.com/fish-shell/fish-shell/issues/8566>).

       • The   macOS   installer   now   cleans   up   previous   .pkg   installations  when  upgrading.  (#2963
         <https://github.com/fish-shell/fish-shell/issues/2963>).

   For distributors
       • The minimum version of CMake required to build fish is now 3.5.0.

       • The    CMake    installation    supports    absolute    paths    for    CMAKE_INSTALL_DATADIR    (#8150
         <https://github.com/fish-shell/fish-shell/issues/8150>).

       • Building  using  NetBSD  curses  works  on  any  platform  (#8087  <https://github.com/fish-shell/fish-
         shell/issues/8087>).

       • The build system now uses the default linker instead of forcing use of the gold or  lld  linker  (#8152
         <https://github.com/fish-shell/fish-shell/issues/8152>).

                                                         ----

   fish 3.3.1 (released July 6, 2021)
       This release of fish fixes the following problems identified in fish 3.3.0:

       • The  prompt  and  command  line  are redrawn correctly in response to universal variable changes (#8088
         <https://github.com/fish-shell/fish-shell/issues/8088>).

       • A superfluous error that was produced when setting the PATH or CDPATH environment variables to  include
         colon-delimited  components  that  do not exist was removed (#8095 <https://github.com/fish-shell/fish-
         shell/issues/8095>).

       • The Vi mode indicator in the prompt is repainted correctly after ctrl-c cancels the current command  (‐
         #8103 <https://github.com/fish-shell/fish-shell/issues/8103>).

       • fish  builds  correctly on platforms that do not have a spawn.h header, such as old versions of OS X (‐
         #8097 <https://github.com/fish-shell/fish-shell/issues/8097>).

       A number of improvements to the documentation, and fixes for completions, are included as well.

       If you are upgrading from version 3.2.2 or before,  please  also  review  the  release  notes  for  3.3.0
       (included below).

                                                         ----

   fish 3.3.0 (released June 28, 2021)
   Notable improvements and fixesfish_config  gained  a  prompt  subcommand  to  show  and  pick from the sample prompts directly in the
         terminal, instead of having to open a webbrowser. For example fish_config prompt choose  default  loads
         the         default         prompt         in         the         current         session        (#7958
         <https://github.com/fish-shell/fish-shell/issues/7958>).

       • The documentation has been reorganized to be  easier  to  understand  (#7773  <https://github.com/fish-
         shell/fish-shell/issues/7773>).

   Deprecations and removed features
       • The $fish_history value "default" is no longer special. It used to be treated the same as "fish" (#7650
         <https://github.com/fish-shell/fish-shell/issues/7650>).

       • Redirection  to standard error with the ^ character has been disabled by default. It can be turned back
         on  using  the  stderr-nocaret  feature  flag,  but  will  eventually  be  disabled  completely  (#7105
         <https://github.com/fish-shell/fish-shell/issues/7105>).

       • Specifying  an initial tab to fish_config now only works with fish_config browse (eg fish_config browse
         variables),  otherwise  it  would  interfere  with  the  new  prompt  subcommand  (see  below)   (#7958
         <https://github.com/fish-shell/fish-shell/issues/7958>).

   Scripting improvementsmath   gained   new   functions   log2   (like   the   documentation   claimed),  max  and  min  (#7856
         <https://github.com/fish-shell/fish-shell/issues/7856>).  math  functions  can  be  used  without   the
         parentheses (eg math sin 2 + 6), and functions have the lowest precedence in the order of operations (‐
         #7877 <https://github.com/fish-shell/fish-shell/issues/7877>).

       • Shebang  (#!)  lines  are  no  longer required within shell scripts, improving support for scripts with
         concatenated binary contents. If a file fails to execute  and  passes  a  (rudimentary)  binary  safety
         check,   fish   will   re-invoke   it   using   /bin/sh   (#7802   <https://github.com/fish-shell/fish-
         shell/issues/7802>).

       • Exit codes are better aligned with bash. A failed execution now reports $status of 127 if the  file  is
         not found, and 126 if it is not executable.

       • echo  no  longer  writes  its  output  one  byte at a time, improving performance and allowing use with
         Linux's  special  API  files  (/proc,  /sys  and  such)   (#7836   <https://github.com/fish-shell/fish-
         shell/issues/7836>).

       • fish   should   now   better   handle   cd   on   filesystems  with  broken  stat(3)  responses  (#7577
         <https://github.com/fish-shell/fish-shell/issues/7577>).

       • Builtins now properly report a $status of 1 upon unsuccessful writes  (#7857  <https://github.com/fish-
         shell/fish-shell/issues/7857>).

       • string  match  with  unmatched  capture  groups  and  without the --all flag now sets an empty variable
         instead of a variable containing the empty string.  It  also  correctly  imports  the  first  match  if
         multiple   arguments   are  provided,  matching  the  documentation.  (#7938  <https://github.com/fish-
         shell/fish-shell/issues/7938>).

       • fish produces more specific errors when a command in a command substitution  wasn't  found  or  is  not
         allowed.  This  now  prints something like "Unknown command" instead of "Unknown error while evaluating
         command substitution".

       • fish_indent allows inline variable assignments (FOO=BAR command) to use line continuation,  instead  of
         joining them into one line (#7955 <https://github.com/fish-shell/fish-shell/issues/7955>).

       • fish  gained a --no-config option to disable configuration files. This applies to user-specific and the
         systemwide config.fish (typically in /etc/fish/config.fish), and configuration snippets  (typically  in
         conf.d  directories).  It  also  disables  universal  variables, history, and loading of functions from
         system or user configuration directories (#7921 <https://github.com/fish-shell/fish-shell/issues/7921>,
         #1256 <https://github.com/fish-shell/fish-shell/issues/1256>).

       • When universal variables are unavailable for some reason, setting  a  universal  variable  now  sets  a
         global variable instead (#7921 <https://github.com/fish-shell/fish-shell/issues/7921>).

       • $last_pid  now  contains  the process ID of the last process in the pipeline, allowing it to be used in
         scripts (#5036 <https://github.com/fish-shell/fish-shell/issues/5036>, #5832  <https://github.com/fish-
         shell/fish-shell/issues/5832>,      #7721      <https://github.com/fish-shell/fish-shell/issues/7721>).
         Previously, this value contained the process group ID, but in scripts this was the same as the  running
         fish's process ID.

       • process-exit event handlers now receive the same value as $status in all cases, instead of receiving -1
         when the exit was due to a signal.

       • process-exit event handlers for PID 0 also received JOB_EXIT events; this has been fixed.

       • job-exit event handlers may now be created with any of the PIDs from the job. The handler is passed the
         last PID in the job as its second argument, instead of the process group.

       • Trying  to  set  an  empty variable name with set no longer works (these variables could not be used in
         expansions anyway).

       • fish_add_path handles an undefined PATH environment variable correctly (#8082 <https://github.com/fish-
         shell/fish-shell/issues/8082>).

   Interactive improvements
       • Commands entered before the previous command finishes will now be properly syntax highlighted.

       • fish now automatically creates config.fish and the configuration directories  in  $XDG_CONFIG_HOME/fish
         (by  default  ~/.config/fish)  if they do not already exist (#7402 <https://github.com/fish-shell/fish-
         shell/issues/7402>).

       • $SHLVL is no longer incremented in non-interactive shells. This means it won't be set to values  larger
         than  1  just because your environment happens to run some scripts in $SHELL in its startup path (#7864
         <https://github.com/fish-shell/fish-shell/issues/7864>).

       • fish no longer rings the bell when flashing the command line. The flashing  should  already  be  enough
         notification         and         the         bell         can         be         annoying        (#7875
         <https://github.com/fish-shell/fish-shell/issues/7875>).

       • fish --help is more helpful if  the  documentation  isn't  installed  (#7824  <https://github.com/fish-
         shell/fish-shell/issues/7824>).

       • funced  won't include an entry on where a function is defined, thanks to the new functions --no-details
         option (#7879 <https://github.com/fish-shell/fish-shell/issues/7879>).

       • A new  variable,  fish_killring,  containing  entries  from  the  killring,  is  now  available  (#7445
         <https://github.com/fish-shell/fish-shell/issues/7445>).

       • fish  --private prints a note on private mode on startup even if $fish_greeting is an empty list (#7974
         <https://github.com/fish-shell/fish-shell/issues/7974>).

       • fish no longer attempts to lock history or universal variable files on  remote  filesystems,  including
         NFS  and  Samba mounts. In rare cases, updates to these files may be dropped if separate fish instances
         modify them simultaneously. (#7968 <https://github.com/fish-shell/fish-shell/issues/7968>).

       • wait   and   on-process-exit   work   correctly   with   jobs   that   have   already   exited   (#7210
         <https://github.com/fish-shell/fish-shell/issues/7210>).

       • __fish_print_help  (used  for  --help  output  for  fish's  builtins) now respects the LESS environment
         variable, and  if  not  set,  uses  better  default  pager  settings  (#7997  <https://github.com/fish-
         shell/fish-shell/issues/7997>).

       • Errors  from  alias  are  now  printed  to standard error, matching other builtins and functions (#7925
         <https://github.com/fish-shell/fish-shell/issues/7925>).

       • ls output is colorized on OpenBSD if colorls  utility  is  installed  (#8035  <https://github.com/fish-
         shell/fish-shell/issues/8035>)

       • The    default    pager   color   looks   better   in   terminals   with   light   backgrounds   (#3412
         <https://github.com/fish-shell/fish-shell/issues/3412>).

       • Further robustness improvements to the bash history import (#7874  <https://github.com/fish-shell/fish-
         shell/issues/7874>).

       • fish  now  tries  to  find a Unicode-aware locale for encoding (LC_CTYPE) if started without any locale
         information, improving the display of emoji and other non-ASCII text on  misconfigured  systems  (#8031
         <https://github.com/fish-shell/fish-shell/issues/8031>).   To  allow  a  C  locale,  set  the  variable
         fish_allow_singlebyte_locale to 1.

       • The Web-based configuration and documentation now feature a dark mode if the browser requests it (#8043
         <https://github.com/fish-shell/fish-shell/issues/8043>).

       • Color variables can now also be given like --background red and -b red, not  just  --background=red  (‐
         #8053 <https://github.com/fish-shell/fish-shell/issues/8053>).

       • exit   run   within   fish_prompt   now   exits  properly  (#8033  <https://github.com/fish-shell/fish-
         shell/issues/8033>).

       • When attempting to execute the unsupported POSIX-style brace command group ({ ... }) fish will  suggest
         its equivalent begin; ...; end commands (#6415 <https://github.com/fish-shell/fish-shell/issues/6415>).

   New or improved bindings
       • Pasting  in  Vi  mode  puts  text  in  the  right place in normal mode (#7847 <https://github.com/fish-
         shell/fish-shell/issues/7847>).

       • Vi mode's u is bound to undo instead of history-search-backward,  following  GNU  readline's  behavior.
         Similarly,   ctrl-r  is  bound  to  redo  instead  of  history-search-backward,  following  Vim  (#7908
         <https://github.com/fish-shell/fish-shell/issues/7908>).

       • s in Vi  visual  mode  now  does  the  same  thing  as  c  (#8039  <https://github.com/fish-shell/fish-
         shell/issues/8039>).

       • The binding for ",*,y now uses fish_clipboard_copy, allowing it to support more than just xsel.

       • The   ctrl-space  binding  can  be  correctly  customised  (#7922  <https://github.com/fish-shell/fish-
         shell/issues/7922>).

       • exit works correctly in bindings (#7967 <https://github.com/fish-shell/fish-shell/issues/7967>).

       • The f1 binding, which opens the manual page for the current command, now works around a bug in  certain
         less   versions   that   fail   to   clear   the   screen  (#7863  <https://github.com/fish-shell/fish-
         shell/issues/7863>).

       • The binding for alt-s now toggles whether sudo is prepended, even when it  took  the  commandline  from
         history instead of only adding it.

       • The new functions fish_commandline_prepend and fish_commandline_append allow toggling the presence of a
         prefix/suffix            on            the            current            commandline.            (#7905
         <https://github.com/fish-shell/fish-shell/issues/7905>).

       • backward-kill-path-component ctrl-w) no longer erases parts of two tokens when the cursor is positioned
         immediately after /. (#6258 <https://github.com/fish-shell/fish-shell/issues/6258>).

   Improved prompts
       • The default Vi mode prompt now uses foreground instead of background colors, making it  less  obtrusive
         (#7880 <https://github.com/fish-shell/fish-shell/issues/7880>).

       • Performance  of  the  "informative"  git  prompt  is improved somewhat (#7871 <https://github.com/fish-
         shell/fish-shell/issues/7871>). This is still slower than  the  non-informative  version  by  its  very
         nature. In particular it is IO-bound, so it will be very slow on slow disks or network mounts.

       • The  sample  prompts  were updated. Some duplicated prompts, like the various classic variants, or less
         useful ones, like the "justadollar" prompt were removed, some prompts were  cleaned  up,  and  in  some
         cases renamed. A new "simple" and "disco" prompt were added (#7884 <https://github.com/fish-shell/fish-
         shell/issues/7884>,       #7897      <https://github.com/fish-shell/fish-shell/issues/7897>,      #7930
         <https://github.com/fish-shell/fish-shell/issues/7930>). The new prompts will  only  take  effect  when
         selected and existing installed prompts will remain unchanged.

       • A  new  prompt_login helper function to describe the kind of "login" (user, host and chroot status) for
         use in prompts. This replaces the old "debian chroot" prompt and has been  added  to  the  default  and
         terlar prompts (#7932 <https://github.com/fish-shell/fish-shell/issues/7932>).

       • The   Web-based   configuration's   prompt   picker   now  shows  and  installs  right  prompts  (#7930
         <https://github.com/fish-shell/fish-shell/issues/7930>).

       • The git prompt now has the same symbol order in normal and "informative" mode,  and  it's  customizable
         via $__fish_git_prompt_status_order (#7926 <https://github.com/fish-shell/fish-shell/issues/7926>).

   Completions
       • Added completions for:

         • firewall-cmd (#7900 <https://github.com/fish-shell/fish-shell/issues/7900>)

         • sv (#8069 <https://github.com/fish-shell/fish-shell/issues/8069>)

       • Improvements to plenty of completions!

       • Commands   that   wrap  cd  (using  complete  --wraps  cd)  get  the  same  completions  as  cd  (#4693
         <https://github.com/fish-shell/fish-shell/issues/4693>).

       • The  --force-files  option  to  complete  works  for  bare   arguments,   not   just   options   (#7920
         <https://github.com/fish-shell/fish-shell/issues/7920>).

       • Completion  descriptions  for functions don't include the function definition, making them more concise
         (#7911 <https://github.com/fish-shell/fish-shell/issues/7911>).

       • The  kill  completions  no  longer   error   on   MSYS2   (#8046   <https://github.com/fish-shell/fish-
         shell/issues/8046>).

       • Completion  scripts  are  now  loaded  when  calling  a command via a relative path (like ./git) (#6001
         <https://github.com/fish-shell/fish-shell/issues/6001>,   #7992    <https://github.com/fish-shell/fish-
         shell/issues/7992>).

       • When  there  are  multiple  completion  candidates,  fish  inserts their shared prefix. This prefix was
         computed in a case-insensitive way, resulting in wrong case in the completion pager. This was fixed  by
         only    inserting    prefixes    with   matching   case   (#7744   <https://github.com/fish-shell/fish-
         shell/issues/7744>).

   Improved terminal support
       • fish no longer tries to detect a missing new line  during  startup,  preventing  an  erroneous    from
         appearing  if  the terminal is resized at the wrong time, which can happen in tiling window managers (‐
         #7893 <https://github.com/fish-shell/fish-shell/issues/7893>).

       • fish behaves better when it disagrees with the terminal on the  width  of  characters.  In  particular,
         staircase  effects  with  right  prompts  should be gone in most cases (#8011 <https://github.com/fish-
         shell/fish-shell/issues/8011>).

       • If the prompt takes up the entire line, the last character should no longer be chopped off  in  certain
         terminals (#8002 <https://github.com/fish-shell/fish-shell/issues/8002>).

       • fish's  reflow  handling  has  been  disabled  by  default  for  kitty (#7961 <https://github.com/fish-
         shell/fish-shell/issues/7961>).

       • The  default  prompt  no  longer  produces   errors   when   used   with   a   dumb   terminal   (#7904
         <https://github.com/fish-shell/fish-shell/issues/7904>).

       • Terminal size variables are updated for window size change signal handlers (SIGWINCH).

       • Pasting  within  a  multi-line  command using a terminal that supports bracketed paste works correctly,
         instead of producing an error (#7782 <https://github.com/fish-shell/fish-shell/issues/7782>).

       • set_color produces an error when used with invalid arguments, rather than empty output which  interacts
         badly with Cartesian product expansion.

   For distributors
       • fish    runs    correctly    on   platforms   without   the   O_CLOEXEC   flag   for   open(2)   (#8023
         <https://github.com/fish-shell/fish-shell/issues/8023>).

                                                         ----

   fish 3.2.2 (released April 7, 2021)
       This release of fish fixes a number of additional issues identified in the fish 3.2 series:

       • The command-not-found handler used suggestions from  pacman  on  Arch  Linux,  but  this  caused  major
         slowdowns   on   some   systems  and  has  been  disabled  (#7841  <https://github.com/fish-shell/fish-
         shell/issues/7841>).

       • fish will  no  longer  hang  on  exit  if  another  process  is  in  the  foreground  on  macOS  (#7901
         <https://github.com/fish-shell/fish-shell/issues/7901>).

       • Certain  programs  (such  as  lazygit)  could create situations where fish would not receive keystrokes
         correctly, but it is now more robust in these  situations  (#7853  <https://github.com/fish-shell/fish-
         shell/issues/7853>).

       • Arguments  longer  than  1024  characters  no  longer  trigger  excessive  CPU  usage  on  macOS (#7837
         <https://github.com/fish-shell/fish-shell/issues/7837>).

       • fish builds correctly on macOS when  using  new  versions  of  Xcode  (#7838  <https://github.com/fish-
         shell/fish-shell/issues/7838>).

       • Completions  for  aura (#7865 <https://github.com/fish-shell/fish-shell/issues/7865>) and tshark (#7858
         <https://github.com/fish-shell/fish-shell/issues/7858>) should no longer produce errors.

       • Background jobs no longer interfere with syntax highlighting (a regression introduced in fish 3.2.1,  ‐
         #7842 <https://github.com/fish-shell/fish-shell/issues/7842>).

       If  you  are  upgrading  from version 3.1.2 or before, please also review the release notes for 3.2.1 and
       3.2.0 (included below).

                                                         ----

   fish 3.2.1 (released March 18, 2021)
       This release of fish fixes the following problems identified in fish 3.2.0:

       • Commands in key bindings are run with fish's internal terminal modes, instead  of  the  terminal  modes
         typically used for commands. This fixes a bug introduced in 3.2.0, where text would unexpectedly appear
         on           the           terminal,          especially          when          pasting          (#7770
         <https://github.com/fish-shell/fish-shell/issues/7770>).

       • Prompts which use the internal __fish_print_pipestatus function  will  display  correctly  rather  than
         carrying  certain  modifiers  (such  as  bold)  further  than intended (#7771 <https://github.com/fish-
         shell/fish-shell/issues/7771>).

       • Redirections to internal file descriptors is allowed again, reversing the changes in 3.2.0. This  fixes
         a problem with Midnight Commander (#7769 <https://github.com/fish-shell/fish-shell/issues/7769>).

       • Universal   variables   should   be   fully  reliable  regardless  of  operating  system  again  (#7774
         <https://github.com/fish-shell/fish-shell/issues/7774>).

       • fish_git_prompt   no   longer    causes    screen    flickering    in    certain    terminals    (#7775
         <https://github.com/fish-shell/fish-shell/issues/7775>).

       • fish_add_path  manipulates  the  fish_user_paths  variable  correctly when moving multiple paths (#7776
         <https://github.com/fish-shell/fish-shell/issues/7776>).

       • Pasting  with  a  multi-line  command  no  longer  causes   a   __fish_tokenizer_state   error   (#7782
         <https://github.com/fish-shell/fish-shell/issues/7782>).

       • psub  inside  event  handlers  cleans  up  temporary  files  properly  (#7792 <https://github.com/fish-
         shell/fish-shell/issues/7792>).

       • Event  handlers   declared   with   --on-job-exit   $fish_pid   no   longer   run   constantly   (#7721
         <https://github.com/fish-shell/fish-shell/issues/7721>), although these functions should use --on-event
         fish_exit instead.

       • Changing   terminal   modes   inside   config.fish  works  (#7783  <https://github.com/fish-shell/fish-
         shell/issues/7783>).

       • set_color  --print-colors  no  longer  prints  all  colors  in  bold  (#7805  <https://github.com/fish-
         shell/fish-shell/issues/7805>)

       • Completing  commands  starting  with  a  -  no  longer prints an error (#7809 <https://github.com/fish-
         shell/fish-shell/issues/7809>).

       • Running fish_command_not_found directly no longer produces an error on macOS or other OSes which do not
         have a handler available (#7777 <https://github.com/fish-shell/fish-shell/issues/7777>).

       • The new type builtin now has the (deprecated) --quiet long form of -q (#7766  <https://github.com/fish-
         shell/fish-shell/issues/7766>).

       It also includes some small enhancements:

       • help  and  fish_config  work  correctly  when  fish  is running in a Chrome OS Crostini Linux VM (#7789
         <https://github.com/fish-shell/fish-shell/issues/7789>).

       • The  history  file  can   be   made   a   symbolic   link   without   it   being   overwritten   (#7754
         <https://github.com/fish-shell/fish-shell/issues/7754>),   matching   a  similar  improvement  for  the
         universal variable file in 3.2.0.

       • An  unhelpful  error  ("access:  No  error"),  seen  on  Cygwin,   is   no   longer   produced   (#7785
         <https://github.com/fish-shell/fish-shell/issues/7785>).

       • Improvements  to  the rsync completions (#7763 <https://github.com/fish-shell/fish-shell/issues/7763>),
         some  completion  descriptions  (#7788   <https://github.com/fish-shell/fish-shell/issues/7788>),   and
         completions that use IP address (#7787 <https://github.com/fish-shell/fish-shell/issues/7787>).

       • Improvements   to   the   appearance   of   fish_config   (#7811   <https://github.com/fish-shell/fish-
         shell/issues/7811>).

       If you are upgrading from version 3.1.2 or before,  please  also  review  the  release  notes  for  3.2.0
       (included below).

                                                         ----

   fish 3.2.0 (released March 1, 2021)
   Notable improvements and fixesUndo  and  redo  support  for the command-line editor and pager search (#1367 <https://github.com/fish-
         shell/fish-shell/issues/1367>). By default, undo is bound to Control+Z, and redo to Alt+/.Builtins can now output before all data is read. For example, string replace no longer has to read  all
         of stdin before it can begin to output.  This makes it usable also for pipes where the previous command
         hasn't finished yet, like:

            # Show all dmesg lines related to "usb"
            dmesg -w | string match '*usb*'

       • Prompts  will  now be truncated instead of replaced with "> " if they are wider than the terminal (#904
         <https://github.com/fish-shell/fish-shell/issues/904>).  For example:

            ~/dev/build/fish-shell-git/src/fish-shell/build (makepkg)>

         will turn into:

            …h-shell/build (makepkg)>

         It is still possible to react to the COLUMNS variable inside the prompt to implement smarter behavior.

       • fish completes ambiguous completions after pressing tab even when they have a  common  prefix,  without
         the user having to press tab again (#6924 <https://github.com/fish-shell/fish-shell/issues/6924>).

       • fish  is  less  aggressive  about  resetting terminal modes, such as flow control, after every command.
         Although flow control remains off by default, enterprising users can now enable  it  with  stty  (#2315
         <https://github.com/fish-shell/fish-shell/issues/2315>,    #7704   <https://github.com/fish-shell/fish-
         shell/issues/7704>).

       • A new "fish_add_path" helper function to add paths to $PATH without producing duplicates,  to  be  used
         interactively  or  in  config.fish (#6960 <https://github.com/fish-shell/fish-shell/issues/6960>, #7028
         <https://github.com/fish-shell/fish-shell/issues/7028>).  For example:

            fish_add_path /opt/mycoolthing/bin

         will add /opt/mycoolthing/bin to the beginning of $fish_user_path without creating  duplicates,  so  it
         can be called safely from config.fish or interactively, and the path will just be there, once.

       • Better errors with "test" (#6030 <https://github.com/fish-shell/fish-shell/issues/6030>):

            > test 1 = 2 and echo true or false
            test: Expected a combining operator like '-a' at index 4
            1 = 2 and echo true or echo false
                  ^

         This includes numbering the index from 1 instead of 0, like fish lists.

       • A  new  theme  for  the  documentation  and  Web-based  configuration  (#6500 <https://github.com/fish-
         shell/fish-shell/issues/6500>,  #7371   <https://github.com/fish-shell/fish-shell/issues/7371>,   #7523
         <https://github.com/fish-shell/fish-shell/issues/7523>), matching the design on fishshell.com.

       • fish  --no-execute  will  no longer complain about unknown commands or non-matching wildcards, as these
         could be defined differently at runtime (especially for functions). This makes it usable  as  a  static
         syntax checker (#977 <https://github.com/fish-shell/fish-shell/issues/977>).

       • string match --regex now integrates named PCRE2 capture groups as fish variables, allowing variables to
         be  set  directly  from string match (#7459 <https://github.com/fish-shell/fish-shell/issues/7459>). To
         support this functionality, string is now a reserved word and can no longer be wrapped in a function.

       • Globs and other expansions are limited to 512,288 results  (#7226  <https://github.com/fish-shell/fish-
         shell/issues/7226>). Because operating systems limit the number of arguments to commands, larger values
         are unlikely to work anyway, and this helps to avoid hangs.

       • A  new  "fish  for  bash  users" documentation page gives a quick overview of the scripting differences
         between  bash  and  fish  (#2382   <https://github.com/fish-shell/fish-shell/issues/2382>),   and   the
         completion  tutorial  has  also  been  moved out into its own document (#6709 <https://github.com/fish-
         shell/fish-shell/issues/6709>).

   Syntax changes and new commands
       • Range limits in index range expansions like $x[$start..$end] may be omitted: $start and $end default to
         1 and -1 (the last item) respectively (#6574 <https://github.com/fish-shell/fish-shell/issues/6574>):

            echo $var[1..]
            echo $var[..-1]
            echo $var[..]

         All print the full list $var.

       • When globbing, a segment which is exactly ** may now match zero directories.  For  example  **/foo  may
         match foo in the current directory (#7222 <https://github.com/fish-shell/fish-shell/issues/7222>).

   Scripting improvements
       • The  type, _ (gettext), . (source) and : (no-op) functions are now implemented builtins for performance
         purposes (#7342 <https://github.com/fish-shell/fish-shell/issues/7342>, #7036 <https://github.com/fish-
         shell/fish-shell/issues/7036>, #6854 <https://github.com/fish-shell/fish-shell/issues/6854>).

       • set and backgrounded jobs no longer overwrite $pipestatus  (#6820  <https://github.com/fish-shell/fish-
         shell/issues/6820>),  improving  its  use  in  command  substitutions  (#6998 <https://github.com/fish-
         shell/fish-shell/issues/6998>).

       • Computed ("electric") variables such as status are now only global in scope, so set -Uq status  returns
         false (#7032 <https://github.com/fish-shell/fish-shell/issues/7032>).

       • The  output for set --show has been shortened, only mentioning the scopes in which a variable exists (‐
         #6944 <https://github.com/fish-shell/fish-shell/issues/6944>).  In addition, it now shows if a variable
         is a path variable.

       • A new variable, fish_kill_signal, is set to the signal that terminated the last foreground job, or 0 if
         the  job   exited   normally   (#6824   <https://github.com/fish-shell/fish-shell/issues/6824>,   #6822
         <https://github.com/fish-shell/fish-shell/issues/6822>).

       • A    new   subcommand,   string   pad,   allows   extending   strings   to   a   given   width   (#7340
         <https://github.com/fish-shell/fish-shell/issues/7340>,   #7102    <https://github.com/fish-shell/fish-
         shell/issues/7102>).

       • string   sub   has   a   new   --end   option   to   specify  the  end  index  of  a  substring  (#6765
         <https://github.com/fish-shell/fish-shell/issues/6765>,   #5974    <https://github.com/fish-shell/fish-
         shell/issues/5974>).

       • string  split  has  a  new  --fields  option  to  specify  fields  to  output, similar to cut -f (#6770
         <https://github.com/fish-shell/fish-shell/issues/6770>).

       • string trim now  also  trims  vertical  tabs  by  default  (#6795  <https://github.com/fish-shell/fish-
         shell/issues/6795>).

       • string  replace  no  longer prints an error if a capturing group wasn't matched, instead treating it as
         empty (#7343 <https://github.com/fish-shell/fish-shell/issues/7343>).

       • string subcommands now quit early when used with  --quiet  (#7495  <https://github.com/fish-shell/fish-
         shell/issues/7495>).

       • string  repeat  now  handles  multiple  arguments,  repeating each one (#5988 <https://github.com/fish-
         shell/fish-shell/issues/5988>).

       • printf no longer prints an error if not given an argument (not even a format string).

       • The true and false builtins ignore any arguments, like other  shells  (#7030  <https://github.com/fish-
         shell/fish-shell/issues/7030>).

       • fish_indent  now removes unnecessary quotes in simple cases (#6722 <https://github.com/fish-shell/fish-
         shell/issues/6722>) and gained a --check option to just check if a file is  indented  correctly  (#7251
         <https://github.com/fish-shell/fish-shell/issues/7251>).

       • fish_indent indents continuation lines that follow a line ending in a backslash, |, && or ||.

       • pushd   only   adds   a   directory   to   the   stack   if   changing  to  it  was  successful  (#6947
         <https://github.com/fish-shell/fish-shell/issues/6947>).

       • A new fish_job_summary function is called  whenever  a  background  job  stops  or  ends,  or  any  job
         terminates   from   a   signal   (#6959  <https://github.com/fish-shell/fish-shell/issues/6959>,  #2727
         <https://github.com/fish-shell/fish-shell/issues/2727>,   #4319    <https://github.com/fish-shell/fish-
         shell/issues/4319>).  The default behaviour can now be customized by redefining it.

       • status gained new dirname and basename convenience subcommands to get just the directory to the running
         script  or  the name of it, to simplify common tasks such as running (dirname (status filename)) (#7076
         <https://github.com/fish-shell/fish-shell/issues/7076>,   #1818    <https://github.com/fish-shell/fish-
         shell/issues/1818>).

       • Broken  pipelines are now handled more smoothly; in particular, bad redirection mid-pipeline results in
         the job continuing to run but with the broken file descriptor replaced with a closed  file  descriptor.
         This  allows  better  error  recovery  and  is  more  in  line  with  other  shells'  behaviour  (#7038
         <https://github.com/fish-shell/fish-shell/issues/7038>).

       • jobs --quiet PID no longer prints "no suitable job" if the job for PID does not  exist  (eg because  it
         has       finished)      (#6809      <https://github.com/fish-shell/fish-shell/issues/6809>,      #6812
         <https://github.com/fish-shell/fish-shell/issues/6812>).

       • jobs  now  shows  continued  child  processes  correctly  (#6818   <https://github.com/fish-shell/fish-
         shell/issues/6818>)

       • disown  should no longer create zombie processes when job control is off, such as in config.fish (#7183
         <https://github.com/fish-shell/fish-shell/issues/7183>).

       • command, jobs and type builtins support --query as the long form of -q, matching other  builtins.   The
         long form --quiet is deprecated (#7276 <https://github.com/fish-shell/fish-shell/issues/7276>).

       • argparse  no longer requires a short flag letter for long-only options (#7585 <https://github.com/fish-
         shell/fish-shell/issues/7585>) and only prints a backtrace with invalid options to argparse  itself  (‐
         #6703 <https://github.com/fish-shell/fish-shell/issues/6703>).

       • argparse  now passes the validation variables (e.g. $_flag_value) as local-exported variables, avoiding
         the need for --no-scope-shadowing in validation functions.

       • complete takes the first argument as the name of the command if the --command/-c option is not used, so
         complete git is treated like complete --command git,  and  it  can  show  the  loaded  completions  for
         specific    commands    with    complete    COMMANDNAME   (#7321   <https://github.com/fish-shell/fish-
         shell/issues/7321>).

       • set_color -b (without  an  argument)  no  longer  prints  an  error  message,  matching  other  invalid
         invocations of this command (#7154 <https://github.com/fish-shell/fish-shell/issues/7154>).

       • exec   no   longer   produces   a   syntax   error   when   the   command   cannot   be   found  (#6098
         <https://github.com/fish-shell/fish-shell/issues/6098>).

       • set --erase and abbr --erase can now erase multiple things in one go, matching functions --erase (#7377
         <https://github.com/fish-shell/fish-shell/issues/7377>).

       • abbr --erase no longer prints errors when used with no arguments or on  an  unset  abbreviation  (#7376
         <https://github.com/fish-shell/fish-shell/issues/7376>,    #7732   <https://github.com/fish-shell/fish-
         shell/issues/7732>).

       • test -t, for testing whether file descriptors are connected to a terminal, works for  file  descriptors
         0,  1,  and  2  (#4766  <https://github.com/fish-shell/fish-shell/issues/4766>).   It  can still return
         incorrect results in other cases (#1228 <https://github.com/fish-shell/fish-shell/issues/1228>).

       • Trying to  execute  scripts  with  Windows  line  endings  (CRLF)  produces  a  sensible  error  (#2783
         <https://github.com/fish-shell/fish-shell/issues/2783>).

       • Trying  to  execute  commands  with  arguments  that  exceed  the operating system limit now produces a
         specific error (#6800 <https://github.com/fish-shell/fish-shell/issues/6800>).

       • An alias that delegates to a command with the same name no longer triggers  an  error  about  recursive
         completion (#7389 <https://github.com/fish-shell/fish-shell/issues/7389>).

       • math   now   has   a   --base   option   to   output   the   result  in  hexadecimal  or  octal  (#7496
         <https://github.com/fish-shell/fish-shell/issues/7496>) and produces more specific  error  messages  (‐
         #7508 <https://github.com/fish-shell/fish-shell/issues/7508>).

       • math  learned  bitwise  functions  bitand,  bitor  and  bitxor, used like math "bitand(0xFE, 5)" (#7281
         <https://github.com/fish-shell/fish-shell/issues/7281>).

       • math learned tau for those who don't like typing "2 * pi".

       • Failed          redirections          will          now          set           $status           (#7540
         <https://github.com/fish-shell/fish-shell/issues/7540>).

       • fish  sets  exit  status  in  a  more consistent manner after errors, including invalid expansions like
         $foo[.

       • Using read --silent while fish is in private mode was adding these potentially-sensitive entries to the
         history; this has been fixed (#7230 <https://github.com/fish-shell/fish-shell/issues/7230>).

       • read can now read interactively from other files, and can be used to read from the  terminal  via  read
         </dev/tty  (if  the  operating  system  provides  /dev/tty) (#7358 <https://github.com/fish-shell/fish-
         shell/issues/7358>).

       • A new fish_status_to_signal function for transforming exit statuses to signal names has been  added  (‐
         #7597     <https://github.com/fish-shell/fish-shell/issues/7597>,    #7595    <https://github.com/fish-
         shell/fish-shell/issues/7595>).

       • The  fallback  realpath  builtin  supports  the  -s/--no-symlinks  option,  like  GNU  realpath  (#7574
         <https://github.com/fish-shell/fish-shell/issues/7574>).

       • functions and type now explain when a function was defined via source instead of just saying Defined in
         -.

       • Significant performance improvements when globbing, appending to variables or in math.

       • echo  no  longer  interprets  options  at  the  beginning  of  an  argument  (eg  echo "-n foo") (#7614
         <https://github.com/fish-shell/fish-shell/issues/7614>).

       • fish  now  finds  user  configuration  even  if  the  HOME  environment  variable  is  not  set  (#7620
         <https://github.com/fish-shell/fish-shell/issues/7620>).

       • fish  no  longer  crashes  when  started  from  a  Windows-style  working directory (eg F:\path) (#7636
         <https://github.com/fish-shell/fish-shell/issues/7636>).

       • fish -c now reads  the  remaining  arguments  into  $argv  (#2314  <https://github.com/fish-shell/fish-
         shell/issues/2314>).

       • The  pwd  command supports the long options --logical and --physical, matching other implementations (‐
         #6787 <https://github.com/fish-shell/fish-shell/issues/6787>).

       • fish --profile now only starts profiling after fish is ready to execute commands (all configuration  is
         completed).  There  is  a new --profile-startup option that only profiles the startup and configuration
         process (#7648 <https://github.com/fish-shell/fish-shell/issues/7648>).

       • Builtins return a maximum exit status of 255, rather than potentially overflowing. In particular,  this
         affects  exit,  return,  functions --query, and set --query (#7698 <https://github.com/fish-shell/fish-
         shell/issues/7698>, #7702 <https://github.com/fish-shell/fish-shell/issues/7702>).

       • It is no longer an error to run builtin with closed stdin. For example count <&- now prints 0,  instead
         of failing.

       • Blocks, functions, and builtins no longer permit redirecting to file descriptors other than 0 (standard
         input),  1  (standard output) and 2 (standard error). For example, echo hello >&5 is now an error. This
         prevents corruption of internal state (#3303 <https://github.com/fish-shell/fish-shell/issues/3303>).

   Interactive improvements
       • fish  will  now  always  attempt  to  become  process  group  leader   in   interactive   mode   (#7060
         <https://github.com/fish-shell/fish-shell/issues/7060>).    This   helps   avoid   hangs   in   certain
         circumstances,   and   allows   tmux's    current    directory    introspection    to    work    (#5699
         <https://github.com/fish-shell/fish-shell/issues/5699>).

       • The  interactive  reader  now  allows  ending  a  line  in  a  logical operators (&& and ||) instead of
         complaining about a missing command. (This was already syntactically valid,  but  interactive  sessions
         didn't know about it yet).

       • The  prompt  is  reprinted  after  a  background  job exits (#1018 <https://github.com/fish-shell/fish-
         shell/issues/1018>).

       • fish no longer inserts a space after  a  completion  ending  in  .,  ,  or  -  is  accepted,  improving
         completions  for  tools  that  provide  dynamic completions (#6928 <https://github.com/fish-shell/fish-
         shell/issues/6928>).

       • If a filename is invalid when first pressing tab, but becomes valid, it will be completed  properly  on
         the next attempt (#6863 <https://github.com/fish-shell/fish-shell/issues/6863>).

       • help   string   match/replace/<subcommand>   will   show   the   help  for  string  subcommands  (#6786
         <https://github.com/fish-shell/fish-shell/issues/6786>).

       • fish_key_reader  sets  the  exit  status  to  0   when   used   with   --help   or   --version   (#6964
         <https://github.com/fish-shell/fish-shell/issues/6964>).

       • fish_key_reader  and  fish_indent  send  output  from --version to standard output, matching other fish
         binaries (#6964 <https://github.com/fish-shell/fish-shell/issues/6964>).

       • A new variable $status_generation is incremented only when the previous command produces an exit status
         (#6815 <https://github.com/fish-shell/fish-shell/issues/6815>). This can be used, for example, to check
         whether a failure status is a holdover due to a background job, or actually produced by  the  last  run
         command.

       • fish_greeting  is  now  a  function  that reads a variable of the same name, and defaults to setting it
         globally.  This removes a universal variable by default and helps with updating the greeting.  However,
         to  disable  the  greeting  it  is  now  necessary  to  explicitly  specify  universal  scope  (set  -U
         fish_greeting)   or   to   disable   it   in  config.fish  (#7265  <https://github.com/fish-shell/fish-
         shell/issues/7265>).

       • Events are properly emitted  after  a  job  is  cancelled  (#2356  <https://github.com/fish-shell/fish-
         shell/issues/2356>).

       • fish_preexec   and   fish_postexec   events   are   no  longer  triggered  for  empty  commands  (#4829
         <https://github.com/fish-shell/fish-shell/issues/4829>,   #7085    <https://github.com/fish-shell/fish-
         shell/issues/7085>).

       • Functions  triggered  by the fish_exit event are correctly run when the terminal is closed or the shell
         receives SIGHUP (#7014 <https://github.com/fish-shell/fish-shell/issues/7014>).

       • The fish_prompt event no longer fires when read is used. If you need a function to run any time read is
         invoked by a script, use the new fish_read event  instead  (#7039  <https://github.com/fish-shell/fish-
         shell/issues/7039>).

       • A  new  fish_posterror  event is emitted when attempting to execute a command with syntax errors (#6880
         <https://github.com/fish-shell/fish-shell/issues/6880>,   #6816    <https://github.com/fish-shell/fish-
         shell/issues/6816>).

       • The  debugging  system  has  now  fully  switched from the old numbered level to the new named category
         system introduced in 3.1. A number of new debugging categories have been added, including config, path,
         reader and screen (#6511 <https://github.com/fish-shell/fish-shell/issues/6511>).  See  the  output  of
         fish --print-debug-categories for the full list.

       • The  warning  about read-only filesystems has been moved to a new "warning-path" debug category and can
         be disabled by setting a debug category of  -warning-path  (#6630  <https://github.com/fish-shell/fish-
         shell/issues/6630>):

            fish --debug=-warning-path

       • The  enabled  debug  categories  are  now  printed  on  shell  startup (#7007 <https://github.com/fish-
         shell/fish-shell/issues/7007>).

       • The -o short option to fish, for --debug-output, works correctly instead of producing an invalid option
         error (#7254 <https://github.com/fish-shell/fish-shell/issues/7254>).

       • fish's debugging can now also be enabled via FISH_DEBUG and  FISH_DEBUG_OUTPUT  environment  variables.
         This  helps  with  debugging  when  no commandline options can be passed, like when fish is called in a
         shebang (#7359 <https://github.com/fish-shell/fish-shell/issues/7359>).

       • Abbreviations are now expanded after all command terminators (eg ; or |), not just space,  as  in  fish
         2.7.1  and  before  (#6970 <https://github.com/fish-shell/fish-shell/issues/6970>), and after closing a
         command substitution (#6658 <https://github.com/fish-shell/fish-shell/issues/6658>).

       • The  history  file  is  now  created  with  user-private  permissions,  matching  other  shells  (#6926
         <https://github.com/fish-shell/fish-shell/issues/6926>).  The directory containing the history file was
         already private, so there should not have been any private data revealed.

       • The output of time is now properly aligned in  all  cases  (#6726  <https://github.com/fish-shell/fish-
         shell/issues/6726>, #6714 <https://github.com/fish-shell/fish-shell/issues/6714>) and no longer depends
         on locale (#6757 <https://github.com/fish-shell/fish-shell/issues/6757>).

       • The  command-not-found  handling  has  been  simplified.   When  it can't find a command, fish now just
         executes a function called fish_command_not_found instead of firing  an  event,  making  it  easier  to
         replace  and  reason  about.   Previously-defined  __fish_command_not_found_handler  functions  with an
         appropriate   event   listener   will   still    work    (#7293    <https://github.com/fish-shell/fish-
         shell/issues/7293>).

       • ctrl-c handling has been reimplemented in C++ and is therefore quicker (#5259 <https://github.com/fish-
         shell/fish-shell/issues/5259>),  no  longer  occasionally  prints  an  "unknown  command"  error (#7145
         <https://github.com/fish-shell/fish-shell/issues/7145>)  or   overwrites   multiline   prompts   (#3537
         <https://github.com/fish-shell/fish-shell/issues/3537>).

       • ctrl-c  no  longer kills background jobs for which job control is disabled, matching POSIX semantics (‐
         #6828    <https://github.com/fish-shell/fish-shell/issues/6828>,    #6861     <https://github.com/fish-
         shell/fish-shell/issues/6861>).

       • Autosuggestions   work   properly   after   ctrl-c   cancels   the   current   commmand   line   (#6937
         <https://github.com/fish-shell/fish-shell/issues/6937>).

       • History search is now case-insensitive unless the search string contains an uppercase character  (#7273
         <https://github.com/fish-shell/fish-shell/issues/7273>).

       • fish_update_completions  gained  a new --keep option, which improves speed by skipping completions that
         already      exist      (#6775      <https://github.com/fish-shell/fish-shell/issues/6775>,       #6796
         <https://github.com/fish-shell/fish-shell/issues/6796>).

       • Aliases   containing   an   embedded   backslash   appear  properly  in  the  output  of  alias  (#6910
         <https://github.com/fish-shell/fish-shell/issues/6910>).

       • open no longer hangs indefinitely on certain systems, as a bug in xdg-open has been  worked  around  (‐
         #7215 <https://github.com/fish-shell/fish-shell/issues/7215>).

       • Long  command  lines  no  longer  add  a  blank  line  after execution (#6826 <https://github.com/fish-
         shell/fish-shell/issues/6826>)  and  behave  better  with  backspace  (#6951  <https://github.com/fish-
         shell/fish-shell/issues/6951>).

       • functions  -t  works like the long option --handlers-type, as documented, instead of producing an error
         (#6985 <https://github.com/fish-shell/fish-shell/issues/6985>).

       • History search now flashes when it found no more  results  (#7362  <https://github.com/fish-shell/fish-
         shell/issues/7362>)

       • fish  now  creates  the  path  in the environment variable XDG_RUNTIME_DIR if it does not exist, before
         using it for runtime data storage (#7335 <https://github.com/fish-shell/fish-shell/issues/7335>).

       • set_color --print-colors now also respects the bold, dim, underline,  reverse,  italic  and  background
         modifiers, to better show their effect (#7314 <https://github.com/fish-shell/fish-shell/issues/7314>).

       • The  fish  Web  configuration  tool  (fish_config) shows prompts correctly on Termux for Android (#7298
         <https://github.com/fish-shell/fish-shell/issues/7298>)  and  detects  Windows  Services  for  Linux  2
         properly (#7027 <https://github.com/fish-shell/fish-shell/issues/7027>). It no longer shows the history
         variable  as  it  may be too large (one can use the History tab instead). It also starts the browser in
         another thread, avoiding hangs in some circumstances, especially with Firefox's  Developer  Edition  (‐
         #7158  <https://github.com/fish-shell/fish-shell/issues/7158>).  Finally,  a bug in the Source Code Pro
         font  may  cause  browsers  to  hang,  so  this  font  is  no   longer   chosen   by   default   (#7714
         <https://github.com/fish-shell/fish-shell/issues/7714>).

       • funcsave  gained  a  new  --directory  option  to  specify  the  location  of the saved function (#7041
         <https://github.com/fish-shell/fish-shell/issues/7041>).

       • help works properly on MSYS2 (#7113  <https://github.com/fish-shell/fish-shell/issues/7113>)  and  only
         uses cmd.exe if running on WSL (#6797 <https://github.com/fish-shell/fish-shell/issues/6797>).

       • Resuming  a  piped  job  by  its  number,  like fg %1, works correctly (#7406 <https://github.com/fish-
         shell/fish-shell/issues/7406>). Resumed jobs show the correct title in  the  terminal  emulator  (#7444
         <https://github.com/fish-shell/fish-shell/issues/7444>).

       • Commands   run   from   key   bindings   now   use  the  same  TTY  modes  as  normal  commands  (#7483
         <https://github.com/fish-shell/fish-shell/issues/7483>).

       • Autosuggestions  from  history  are  now  case-sensitive  (#3978   <https://github.com/fish-shell/fish-
         shell/issues/3978>).

       • $status  from  completion  scripts  is  no longer passed outside the completion, which keeps the status
         display in  the  prompt  as  the  last  command's  status  (#7555  <https://github.com/fish-shell/fish-
         shell/issues/7555>).

       • Updated localisations for pt_BR (#7480 <https://github.com/fish-shell/fish-shell/issues/7480>).

       • fish_trace  output  now  starts  with  ->  (like  fish --profile), making the depth more visible (#7538
         <https://github.com/fish-shell/fish-shell/issues/7538>).

       • Resizing the terminal window no longer produces a  corrupted  prompt  (#6532  <https://github.com/fish-
         shell/fish-shell/issues/6532>, #7404 <https://github.com/fish-shell/fish-shell/issues/7404>).

       • functions   produces   an   error   rather   than   crashing   on   certain  invalid  arguments  (#7515
         <https://github.com/fish-shell/fish-shell/issues/7515>).

       • A  crash  in  completions  with  inline  variable  assignment  (eg  A=  b)  has   been   fixed   (#7344
         <https://github.com/fish-shell/fish-shell/issues/7344>).

       • fish_private_mode  may now be changed dynamically using set (#7589 <https://github.com/fish-shell/fish-
         shell/issues/7589>), and history is kept in memory in private mode (but not stored permanently)  (#7590
         <https://github.com/fish-shell/fish-shell/issues/7590>).

       • Commands  with  leading  spaces may be retrieved from history with up-arrow until a new command is run,
         matching zsh's HIST_IGNORE_SPACE (#1383 <https://github.com/fish-shell/fish-shell/issues/1383>).

       • Importing bash  history  or  reporting  errors  with  recursive  globs  (**)  no  longer  hangs  (#7407
         <https://github.com/fish-shell/fish-shell/issues/7407>,    #7497   <https://github.com/fish-shell/fish-
         shell/issues/7497>).

       • bind now shows \x7f for the del key instead of a literal DEL character (#7631 <https://github.com/fish-
         shell/fish-shell/issues/7631>)

       • Paths containing variables or tilde expansion are only suggested  when  they  are  still  valid  (#7582
         <https://github.com/fish-shell/fish-shell/issues/7582>).

       • Syntax   highlighting   can   now   color  a  command  as  invalid  even  if  executed  quickly  (#5912
         <https://github.com/fish-shell/fish-shell/issues/5912>).

       • Redirection targets are no longer highlighted as error if they contain variables which will  likely  be
         defined by the current commandline (#6654 <https://github.com/fish-shell/fish-shell/issues/6654>).

       • fish  is  now  more resilient against broken terminal modes (#7133 <https://github.com/fish-shell/fish-
         shell/issues/7133>, #4873 <https://github.com/fish-shell/fish-shell/issues/4873>).

       • fish handles being in control of the TTY without owning its own process  group  better,  avoiding  some
         hangs in special configurations (#7388 <https://github.com/fish-shell/fish-shell/issues/7388>).

       • Keywords  can now be colored differently by setting the fish_color_keyword variable (fish_color_command
         is used as a fallback) (#7678 <https://github.com/fish-shell/fish-shell/issues/7678>).

       • Just like fish_indent, the interactive reader will indent continuation lines that follow a line  ending
         in a backslash, |, && or || (#7694 <https://github.com/fish-shell/fish-shell/issues/7694>).

       • Commands  with a trailing escaped space are saved in history correctly (#7661 <https://github.com/fish-
         shell/fish-shell/issues/7661>).

       • fish_prompt no longer mangles  Unicode  characters  in  the  private-use  range  U+F600-U+F700.  (#7723
         <https://github.com/fish-shell/fish-shell/issues/7723>).

       • The  universal  variable file, fish_variables, can be made a symbolic link without it being overwritten
         (#7466 <https://github.com/fish-shell/fish-shell/issues/7466>).

       • fish  is  now  more  resilient  against  mktemp  failing  (#7482   <https://github.com/fish-shell/fish-
         shell/issues/7482>).

   New or improved bindings
       • As mentioned above, new special input functions undo (ctrl-_ or ctrl-z) and redo (alt-/) can be used to
         revert  changes  to  the  command  line  or  the  pager  search  field (#6570 <https://github.com/fish-
         shell/fish-shell/issues/6570>).

       • ctrl-z is now available for binding (#7152 <https://github.com/fish-shell/fish-shell/issues/7152>).

       • Additionally, using the cancel special input function (bound to escape by  default)  right  after  fish
         picked   an   unambiguous   completion   will  undo  that  (#7433  <https://github.com/fish-shell/fish-
         shell/issues/7433>).

       • fish_clipboard_paste (ctrl-v) trims indentation from multiline commands, because fish  already  indents
         (#7662 <https://github.com/fish-shell/fish-shell/issues/7662>).

       • Vi mode bindings now support dh, dl, c0, cf, ct, cF, cT, ch, cl, y0, ci, ca, yi, ya, di, da, d;, d,, o,
         O   and  Control+left/right  keys  to  navigate  by  word  (#6648  <https://github.com/fish-shell/fish-
         shell/issues/6648>,      #6755      <https://github.com/fish-shell/fish-shell/issues/6755>,       #6769
         <https://github.com/fish-shell/fish-shell/issues/6769>,    #7442   <https://github.com/fish-shell/fish-
         shell/issues/7442>, #7516 <https://github.com/fish-shell/fish-shell/issues/7516>).

       • Vi  mode  bindings  support  ~  (tilde)  to  toggle  the  case  of  the   selected   character   (#6908
         <https://github.com/fish-shell/fish-shell/issues/6908>).

       • Functions  up-or-search  and  down-or-search  (up  and  down) can cross empty lines, and don't activate
         search mode if the search fails, which makes  them  easier  to  use  to  move  between  lines  in  some
         situations.

       • If  history  search  fails  to  find  a  match,  the  cursor  is  no  longer moved. This is useful when
         accidentally starting a history search on a multi-line commandline.

       • The special input function beginning-of-history (pageup) now moves to the oldest search instead of  the
         youngest - that's end-of-history (pagedown).

       • A  new  special  input  function  forward-single-char  moves  one  character  to  the  right, and if an
         autosuggestion is available, only take a single  character  from  it  (#7217  <https://github.com/fish-
         shell/fish-shell/issues/7217>, #4984 <https://github.com/fish-shell/fish-shell/issues/4984>).

       • Special  input  functions  can  now  be  joined with or as a modifier (adding to and), though only some
         commands  set  an  exit  status  (#7217  <https://github.com/fish-shell/fish-shell/issues/7217>).  This
         includes   suppress-autosuggestion   to   reflect  whether  an  autosuggestion  was  suppressed  (#1419
         <https://github.com/fish-shell/fish-shell/issues/1419>)

       • A new function __fish_preview_current_file, bound to alt-o, opens the current file at the cursor  in  a
         pager  (#6838  <https://github.com/fish-shell/fish-shell/issues/6838>,  #6855 <https://github.com/fish-
         shell/fish-shell/issues/6855>).

       • edit_command_buffer (alt-e and alt-v) passes the cursor position to the external editor if  the  editor
         is       recognized      (#6138      <https://github.com/fish-shell/fish-shell/issues/6138>,      #6954
         <https://github.com/fish-shell/fish-shell/issues/6954>).

       • __fish_prepend_sudo (alt-s) now  toggles  a  sudo  prefix  (#7012  <https://github.com/fish-shell/fish-
         shell/issues/7012>)   and   avoids  shifting  the  cursor  (#6542  <https://github.com/fish-shell/fish-
         shell/issues/6542>).

       • __fish_prepend_sudo (alt-s) now uses the previous commandline if the current one is empty, to  simplify
         rerunning           the           previous          command          with          sudo          (#7079
         <https://github.com/fish-shell/fish-shell/issues/7079>).

       • __fish_toggle_comment_commandline (alt-#) now uncomments and presents the last comment from history  if
         the commandline is empty (#7137 <https://github.com/fish-shell/fish-shell/issues/7137>).

       • __fish_whatis_current_token   (alt-w)   prints   descriptions   for   functions   and  builtins  (#7191
         <https://github.com/fish-shell/fish-shell/issues/7191>,   #2083    <https://github.com/fish-shell/fish-
         shell/issues/2083>).

       • The definition of "word" and "bigword" for movements was refined, fixing (eg) vi mode's behavior with e
         on  the  second-to-last  char,  and  bigword's  behavior  with  single-character  words  and  non-blank
         non-graphical   characters   (#7353    <https://github.com/fish-shell/fish-shell/issues/7353>,    #7354
         <https://github.com/fish-shell/fish-shell/issues/7354>,    #4025   <https://github.com/fish-shell/fish-
         shell/issues/4025>,      #7328      <https://github.com/fish-shell/fish-shell/issues/7328>,       #7325
         <https://github.com/fish-shell/fish-shell/issues/7325>)

       • fish's  clipboard  bindings now also support Windows Subsystem for Linux via PowerShell and clip.exe (‐
         #7455    <https://github.com/fish-shell/fish-shell/issues/7455>,    #7458     <https://github.com/fish-
         shell/fish-shell/issues/7458>) and will properly copy newlines in multi-line commands.

       • Using the *-jump special input functions before typing anything else no longer crashes fish.

       • Completing variable overrides (foo=bar) could replace the entire thing with just the completion in some
         circumstances. This has been fixed (#7398 <https://github.com/fish-shell/fish-shell/issues/7398>).

   Improved prompts
       • The  default  and  example  prompts print the correct exit status for commands prefixed with not (#6566
         <https://github.com/fish-shell/fish-shell/issues/6566>).

       • git prompts include all untracked files in the repository, not just those in the current  directory  (‐
         #6086 <https://github.com/fish-shell/fish-shell/issues/6086>).

       • The   git   prompts   correctly   show   stash   states   (#6876   <https://github.com/fish-shell/fish-
         shell/issues/6876>, #7136 <https://github.com/fish-shell/fish-shell/issues/7136>) and clean  states  (‐
         #7471 <https://github.com/fish-shell/fish-shell/issues/7471>).

       • The  Mercurial  prompt  correctly  shows  untracked  status (#6906 <https://github.com/fish-shell/fish-
         shell/issues/6906>), and by default only shows the branch for  performance  reasons.   A  new  variable
         $fish_prompt_hg_show_informative_status can be set to enable more information.

       • The   fish_vcs_prompt   passes  its  arguments  to  the  various  VCS  prompts  that  it  calls  (#7033
         <https://github.com/fish-shell/fish-shell/issues/7033>).

       • The Subversion prompt was  broken  in  a  number  of  ways  in  3.1.0  and  has  been  restored  (#6715
         <https://github.com/fish-shell/fish-shell/issues/6715>,    #7278   <https://github.com/fish-shell/fish-
         shell/issues/7278>).

       • A  new  helper  function  fish_is_root_user  simplifies  checking  for   superuser   privilege   (#7031
         <https://github.com/fish-shell/fish-shell/issues/7031>,    #7123   <https://github.com/fish-shell/fish-
         shell/issues/7123>).

       • New colorschemes - ayu Light, ayu  Dark  and  ayu  Mirage  (#7596  <https://github.com/fish-shell/fish-
         shell/issues/7596>).

       • Bugs  related  to  multiline  prompts, including repainting (#5860 <https://github.com/fish-shell/fish-
         shell/issues/5860>)  or  navigating  directory  history   (#3550   <https://github.com/fish-shell/fish-
         shell/issues/3550>) leading to graphical glitches have been fixed.

       • The        nim        prompt        now        handles        vi        mode        better       (#6802
         <https://github.com/fish-shell/fish-shell/issues/6802>)

   Improved terminal support
       • A new variable, fish_vi_force_cursor, can be set to force fish_vi_cursor to attempt changing the cursor
         shape         in         vi         mode,         regardless         of         terminal         (#6968
         <https://github.com/fish-shell/fish-shell/issues/6968>).  The  fish_vi_cursor  option --force-iterm has
         been deprecated.

       • diff  will   now   colourize   output,   if   supported   (#7308   <https://github.com/fish-shell/fish-
         shell/issues/7308>).

       • Autosuggestions  appear  when  the  cursor  passes  the  right  prompt (#6948 <https://github.com/fish-
         shell/fish-shell/issues/6948>) or wraps to the next  line  (#7213  <https://github.com/fish-shell/fish-
         shell/issues/7213>).

       • The  cursor  shape  in  Vi  mode  changes properly in Windows Terminal (#6999 <https://github.com/fish-
         shell/fish-shell/issues/6999>, #6478 <https://github.com/fish-shell/fish-shell/issues/6478>).

       • The  spurious  warning  about  terminal   size   in   small   terminals   has   been   removed   (#6980
         <https://github.com/fish-shell/fish-shell/issues/6980>).

       • Dynamic   titles   are   now   enabled   in   Alacritty   (#7073   <https://github.com/fish-shell/fish-
         shell/issues/7073>) and emacs' vterm (#7122 <https://github.com/fish-shell/fish-shell/issues/7122>).

       • Current working directory updates  are  enabled  in  foot  (#7099  <https://github.com/fish-shell/fish-
         shell/issues/7099>) and WezTerm (#7649 <https://github.com/fish-shell/fish-shell/issues/7649>).

       • The  width  computation  for  certain  emoji  agrees  better  with terminals (especially flags). (#7237
         <https://github.com/fish-shell/fish-shell/issues/7237>).

       • Long command lines are wrapped in all cases, instead of sometimes  being  put  on  a  new  line  (#5118
         <https://github.com/fish-shell/fish-shell/issues/5118>).

       • The  pager  is  properly  rendered  with  long  command lines selected (#2557 <https://github.com/fish-
         shell/fish-shell/issues/2557>).

       • Sessions with right prompts can be resized correctly  in  terminals  that  handle  reflow,  like  GNOME
         Terminal  (and  other VTE-based terminals), upcoming Konsole releases and Alacritty. This detection can
         be overridden with the  new  fish_handle_reflow  variable  (#7491  <https://github.com/fish-shell/fish-
         shell/issues/7491>).

       • fish  now  sets terminal modes sooner, which stops output from appearing before the greeting and prompt
         are ready (#7489 <https://github.com/fish-shell/fish-shell/issues/7489>).

       • Better detection of new Konsole versions for true color support and cursor shape changing.

       • fish no longer attempts to modify the terminal size via TIOCSWINSZ, improving compatibility with  Kitty
         (#6994 <https://github.com/fish-shell/fish-shell/issues/6994>).

   Completions
       • Added completions for

         • 7z, 7za and 7zr (#7220 <https://github.com/fish-shell/fish-shell/issues/7220>)

         • alias (#7035 <https://github.com/fish-shell/fish-shell/issues/7035>)

         • alternatives (#7616 <https://github.com/fish-shell/fish-shell/issues/7616>)

         • apk (#7108 <https://github.com/fish-shell/fish-shell/issues/7108>)

         • asciidoctor (#7000 <https://github.com/fish-shell/fish-shell/issues/7000>)

         • avifdec and avifenc (#7674 <https://github.com/fish-shell/fish-shell/issues/7674>)

         • bluetoothctl (#7438 <https://github.com/fish-shell/fish-shell/issues/7438>)

         • cjxl and djxl (#7673 <https://github.com/fish-shell/fish-shell/issues/7673>)

         • cmark (#7000 <https://github.com/fish-shell/fish-shell/issues/7000>)

         • create_ap (#7096 <https://github.com/fish-shell/fish-shell/issues/7096>)

         • deno (#7138 <https://github.com/fish-shell/fish-shell/issues/7138>)

         • dhclient (#6684 <https://github.com/fish-shell/fish-shell/issues/6684>)

         • Postgres-related   commands   dropdb,   createdb,   pg_restore,   pg_dump   and   pg_dumpall   (#6620
           <https://github.com/fish-shell/fish-shell/issues/6620>)

         • dotnet (#7558 <https://github.com/fish-shell/fish-shell/issues/7558>)

         • downgrade (#6751 <https://github.com/fish-shell/fish-shell/issues/6751>)

         • gapplication, gdbus, gio and gresource (#7300 <https://github.com/fish-shell/fish-shell/issues/7300>)

         • gh (#7112 <https://github.com/fish-shell/fish-shell/issues/7112>)

         • gitkgroups (#6889 <https://github.com/fish-shell/fish-shell/issues/6889>)

         • hashcat (#7746 <https://github.com/fish-shell/fish-shell/issues/7746>)

         • hikari (#7083 <https://github.com/fish-shell/fish-shell/issues/7083>)

         • icdiff (#7503 <https://github.com/fish-shell/fish-shell/issues/7503>)

         • imv (#6675 <https://github.com/fish-shell/fish-shell/issues/6675>)

         • john (#7746 <https://github.com/fish-shell/fish-shell/issues/7746>)

         • julia (#7468 <https://github.com/fish-shell/fish-shell/issues/7468>)

         • k3d (#7202 <https://github.com/fish-shell/fish-shell/issues/7202>)

         • ldapsearch (#7578 <https://github.com/fish-shell/fish-shell/issues/7578>)

         • lightdm and dm-tool (#7624 <https://github.com/fish-shell/fish-shell/issues/7624>)

         • losetup (#7621 <https://github.com/fish-shell/fish-shell/issues/7621>)

         • micro (#7339 <https://github.com/fish-shell/fish-shell/issues/7339>)

         • mpc (#7169 <https://github.com/fish-shell/fish-shell/issues/7169>)

         • Metasploit's   msfconsole,   msfdb   and   msfvenom    (#6930    <https://github.com/fish-shell/fish-
           shell/issues/6930>)

         • mtr (#7638 <https://github.com/fish-shell/fish-shell/issues/7638>)

         • mysql (#6819 <https://github.com/fish-shell/fish-shell/issues/6819>)

         • ncat,    nc.openbsd,    nc.traditional    and    nmap   (#6873   <https://github.com/fish-shell/fish-
           shell/issues/6873>)

         • openssl (#6845 <https://github.com/fish-shell/fish-shell/issues/6845>)

         • prime-run (#7241 <https://github.com/fish-shell/fish-shell/issues/7241>)

         • ps2pdf{12,13,14,wr} (#6673 <https://github.com/fish-shell/fish-shell/issues/6673>)

         • pyenv (#6551 <https://github.com/fish-shell/fish-shell/issues/6551>)

         • rst2html, rst2html4,  rst2html5,  rst2latex,  rst2man,  rst2odt,  rst2pseudoxml,  rst2s5,  rst2xetex,
           rst2xml and rstpep2html (#7019 <https://github.com/fish-shell/fish-shell/issues/7019>)

         • spago (#7381 <https://github.com/fish-shell/fish-shell/issues/7381>)

         • sphinx-apidoc,  sphinx-autogen,  sphinx-build  and sphinx-quickstart (#7000 <https://github.com/fish-
           shell/fish-shell/issues/7000>)

         • strace (#6656 <https://github.com/fish-shell/fish-shell/issues/6656>)

         • systemd's   bootctl,    coredumpctl,    hostnamectl    (#7428    <https://github.com/fish-shell/fish-
           shell/issues/7428>),    homectl    (#7435    <https://github.com/fish-shell/fish-shell/issues/7435>),
           networkctl  (#7668  <https://github.com/fish-shell/fish-shell/issues/7668>)  and   userdbctl   (#7667
           <https://github.com/fish-shell/fish-shell/issues/7667>)

         • tcpdump (#6690 <https://github.com/fish-shell/fish-shell/issues/6690>)

         • tigtraceroute and tracepath (#6803 <https://github.com/fish-shell/fish-shell/issues/6803>)

         • windscribe (#6788 <https://github.com/fish-shell/fish-shell/issues/6788>)

         • wireshark, tshark, and dumpcapxbps-* (#7239 <https://github.com/fish-shell/fish-shell/issues/7239>)

         • xxhsum,    xxh32sum,    xxh64sum    and    xxh128sum    (#7103   <https://github.com/fish-shell/fish-
           shell/issues/7103>)

         • yadm (#7100 <https://github.com/fish-shell/fish-shell/issues/7100>)

         • zopfli and zopflipng (#6872 <https://github.com/fish-shell/fish-shell/issues/6872>)

       • Lots of improvements to completions, including:

         • git completions can  complete  the  right  and  left  parts  of  a  commit  range  like  from..to  or
           left...right.

         • Completion  scripts  for custom Git subcommands like git-xyz are now loaded with Git completions. The
           completions can now be defined directly on the subcommand (using complete  git-xyz),  and  completion
           for   git   xyz   will  work.  (#7075  <https://github.com/fish-shell/fish-shell/issues/7075>,  #7652
           <https://github.com/fish-shell/fish-shell/issues/7652>,  #4358   <https://github.com/fish-shell/fish-
           shell/issues/4358>)

         • make completions no longer second-guess make's file detection, fixing target completion in some cases
           (#7535 <https://github.com/fish-shell/fish-shell/issues/7535>).

         • Command  completions  now correctly print the description even if the command was fully matched (like
           in ls<TAB>).

         • set completions no longer hide variables starting with __, they are sorted last instead.

       • Improvements to  the  manual  page  completion  generator  (#7086  <https://github.com/fish-shell/fish-
         shell/issues/7086>,       #6879      <https://github.com/fish-shell/fish-shell/issues/6879>,      #7187
         <https://github.com/fish-shell/fish-shell/issues/7187>).

       • Significant   performance   improvements   to   completion   of   the   available    commands    (#7153
         <https://github.com/fish-shell/fish-shell/issues/7153>),  especially on macOS Big Sur where there was a
         significant    regression    (#7365    <https://github.com/fish-shell/fish-shell/issues/7365>,    #7511
         <https://github.com/fish-shell/fish-shell/issues/7511>).

       • Suffix  completion  using  __fish_complete_suffix  uses  the  same  fuzzy matching logic as normal file
         completion,  and  completes  any  file  but   sorts   files   with   matching   suffix   first   (#7040
         <https://github.com/fish-shell/fish-shell/issues/7040>,    #7547   <https://github.com/fish-shell/fish-
         shell/issues/7547>). Previously, it only completed files with matching suffix.

   For distributors
       • fish has a new interactive test driver based on pexpect, removing the  optional  dependency  on  expect
         (and   adding   an   optional   dependency   on  pexpect)  (#5451  <https://github.com/fish-shell/fish-
         shell/issues/5451>, #6825 <https://github.com/fish-shell/fish-shell/issues/6825>).

       • The CHANGELOG was moved to restructured text, allowing it to be included in  the  documentation  (#7057
         <https://github.com/fish-shell/fish-shell/issues/7057>).

       • fish  handles  ncurses  installed  in  a  non-standard  prefix  better (#6600 <https://github.com/fish-
         shell/fish-shell/issues/6600>, #7219 <https://github.com/fish-shell/fish-shell/issues/7219>), and  uses
         variadic tparm on NetBSD curses (#6626 <https://github.com/fish-shell/fish-shell/issues/6626>).

       • The   Web-based   configuration   tool   no   longer   uses   an   obsolete   Angular   version  (#7147
         <https://github.com/fish-shell/fish-shell/issues/7147>).

       • The fish project has adopted the Contributor Covenant code of conduct (#7151  <https://github.com/fish-
         shell/fish-shell/issues/7151>).

   Deprecations and removed features
       • The  fish_color_match  variable  is  no  longer used. (Previously this controlled the color of matching
         quotes and parens when using read).

       • fish 3.2.0 will be the last release in which the redirection to standard error with the ^ character  is
         enabled.  The stderr-nocaret feature flag will be changed to "on" in future releases.

       • string is now a reserved word and cannot be used for function names (see above).

       • fish_vi_cursor's option --force-iterm has been deprecated (see above).

       • command, jobs and type long-form option --quiet is deprecated in favor of --query (see above).

       • The  fish_command_not_found  event  is no longer emitted, instead there is a function of that name.  By
         default it will call a previously-defined __fish_command_not_found_handler. To emit the event  manually
         use emit fish_command_not_found.

       • The fish_prompt event no longer fires when read is used. If you need a function to run any time read is
         invoked  by  a  script, use the new fish_read event instead (#7039 <https://github.com/fish-shell/fish-
         shell/issues/7039>).

       • To disable the greeting message permanently it is no  longer  enough  to  just  run  set  fish_greeting
         interactively  as  it is no longer implicitly a universal variable. Use set -U fish_greeting or disable
         it in config.fish with set -g fish_greeting.

       • The long-deprecated and non-functional -m/--read-mode options to read were removed in 3.1b1. Using  the
         short  form,  or a never-implemented -B option, no longer crashes fish (#7659 <https://github.com/fish-
         shell/fish-shell/issues/7659>).

       • With the addition of new categories for debug options, the old  numbered  debugging  levels  have  been
         removed.

   For distributors and developers
       • fish    source    tarballs   are   now   distributed   using   the   XZ   compression   method   (#5460
         <https://github.com/fish-shell/fish-shell/issues/5460>).

       • The fish source tarball contains an example FreeDesktop entry and icon.

       • The  CMake  variable  MAC_CODESIGN_ID  can  now  be  set  to  "off"  to  disable  code-signing   (#6952
         <https://github.com/fish-shell/fish-shell/issues/6952>,    #6792   <https://github.com/fish-shell/fish-
         shell/issues/6792>).

       • Building on on macOS  earlier  than  10.13.6  succeeds,  instead  of  failing  on  code-signing  (#6791
         <https://github.com/fish-shell/fish-shell/issues/6791>).

       • The pkg-config file now uses variables to ensure paths used are portable across prefixes.

       • The  default  values for the extra_completionsdir, extra_functionsdir and extra_confdir options now use
         the  installation   prefix   rather   than   /usr/local   (#6778   <https://github.com/fish-shell/fish-
         shell/issues/6778>).

       • A  new  CMake  variable  FISH_USE_SYSTEM_PCRE2  controls  whether fish builds with the system-installed
         PCRE2, or the version it bundles. By default it prefers the system library  if  available,  unless  Mac
         codesigning is enabled (#6952 <https://github.com/fish-shell/fish-shell/issues/6952>).

       • Running  the  full  interactive  test  suite  now  requires  Python 3.5+ and the pexpect package (#6825
         <https://github.com/fish-shell/fish-shell/issues/6825>); the expect package is no longer required.

       • Support for Python 2 in fish's tools (fish_config and the  manual  page  completion  generator)  is  no
         longer   guaranteed.  Please  use  Python  3.5  or  later  (#6537  <https://github.com/fish-shell/fish-
         shell/issues/6537>).

       • The Web-based configuration tool is  compatible  with  Python  3.10   (#7600  <https://github.com/fish-
         shell/fish-shell/issues/7600>)   and   no   longer   requires   Python's   distutils   package   (#7514
         <https://github.com/fish-shell/fish-shell/issues/7514>).

       • fish 3.2 is the last release to support Red Hat Enterprise Linux & CentOS version 6.

                                                         ----

   fish 3.1.2 (released April 29, 2020)
       This release of fish fixes a major issue discovered in fish 3.1.1:

       • Commands such as fzf  and  enhancd,  when  used  with  eval,  would  hang.  eval  buffered  output  too
         aggressively, which has been fixed (#6955 <https://github.com/fish-shell/fish-shell/issues/6955>).

       If  you are upgrading from version 3.0.0 or before, please also review the release notes for 3.1.1, 3.1.0
       and 3.1b1 (included below).

                                                         ----

   fish 3.1.1 (released April 27, 2020)
       This release of fish fixes a number of major issues discovered in fish 3.1.0.

       • Commands which involve . ( ... | psub) now work correctly, as  a  bug  in  the  function  --on-job-exit
         option has been fixed (#6613 <https://github.com/fish-shell/fish-shell/issues/6613>).

       • Conflicts  between  upstream packages for ripgrep and bat, and the fish packages, have been resolved (‐
         #5822 <https://github.com/fish-shell/fish-shell/issues/5822>).

       • Starting fish in  a  directory  without  read  access,  such  as  via  su,  no  longer  crashes  (#6597
         <https://github.com/fish-shell/fish-shell/issues/6597>).

       • Glob  ordering  changes which were introduced in 3.1.0 have been reverted, returning the order of globs
         to the previous state (#6593 <https://github.com/fish-shell/fish-shell/issues/6593>).

       • Redirections using the deprecated caret syntax to a file descriptor  (eg  ^&2)  work  correctly  (#6591
         <https://github.com/fish-shell/fish-shell/issues/6591>).

       • Redirections    that    append    to   a   file   descriptor   (eg   2>>&1)   work   correctly   (#6614
         <https://github.com/fish-shell/fish-shell/issues/6614>).

       • Building fish on  macOS  (#6602  <https://github.com/fish-shell/fish-shell/issues/6602>)  or  with  new
         versions     of     GCC     (#6604     <https://github.com/fish-shell/fish-shell/issues/6604>,    #6609
         <https://github.com/fish-shell/fish-shell/issues/6609>) is now successful.

       • time is now correctly listed in the output of builtin  -n,  and  time  --help  works  correctly  (#6598
         <https://github.com/fish-shell/fish-shell/issues/6598>).

       • Exported   universal   variables   now   update  properly  (#6612  <https://github.com/fish-shell/fish-
         shell/issues/6612>).

       • status current-command gives the expected output when used with an environment override - that is,  F=B
         status  current-command  returns  status  instead  of  F=B  (#6635 <https://github.com/fish-shell/fish-
         shell/issues/6635>).

       • test no longer  crashes  when  used  with  “nan”  or  “inf”  arguments,  erroring  out  instead  (#6655
         <https://github.com/fish-shell/fish-shell/issues/6655>).

       • Copying  from  the  end  of  the  command  line no longer crashes fish (#6680 <https://github.com/fish-
         shell/fish-shell/issues/6680>).

       • read no longer removes multiple separators when  splitting  a  variable  into  a  list,  restoring  the
         previous   behaviour   from   fish   3.0   and   before   (#6650   <https://github.com/fish-shell/fish-
         shell/issues/6650>).

       • Functions    using    --on-job-exit    and    --on-process-exit    work    reliably    again     (#6679
         <https://github.com/fish-shell/fish-shell/issues/6679>).

       • Functions  using  --on-signal  INT  work  reliably in interactive sessions, as they did in fish 2.7 and
         before (#6649 <https://github.com/fish-shell/fish-shell/issues/6649>). These handlers have never worked
         in non-interactive sessions, and making them work is an ongoing process.

       • Functions using --on-variable work reliably with variables which are set implicitly (rather  than  with
         set),           such           as          “fish_bind_mode”          and          “PWD”          (#6653
         <https://github.com/fish-shell/fish-shell/issues/6653>).

       • 256 colors are properly enabled under certain conditions that were incorrectly detected in  fish  3.1.0
         ($TERM  begins  with  xterm,  does  not  include  “256color”,  and  $TERM_PROGRAM  is  not  set) (#6701
         <https://github.com/fish-shell/fish-shell/issues/6701>).

       • The Mercurial (hg) prompt no longer produces an error when the current working directory is removed  (‐
         #6699  <https://github.com/fish-shell/fish-shell/issues/6699>).  Also, for performance reasons it shows
         only    basic    information    by    default;    to    restore    the     detailed     status,     set
         $fish_prompt_hg_show_informative_status.

       • The  VCS  prompt,  fish_vcs_prompt,  no  longer displays Subversion (svn) status by default, due to the
         potential slowness of this operation (#6681 <https://github.com/fish-shell/fish-shell/issues/6681>).

       • Pasting of commands has been sped up (#6713 <https://github.com/fish-shell/fish-shell/issues/6713>).

       • Using extended Unicode characters, such as emoji, in a non-Unicode capable locale (such  as  the  C  or
         POSIX   locale)   no  longer  renders  all  output  blank  (#6736  <https://github.com/fish-shell/fish-
         shell/issues/6736>).

       • help prefers to use xdg-open, avoiding the use of open on Debian systems where this command is actually
         openvt (#6739 <https://github.com/fish-shell/fish-shell/issues/6739>).

       • Command lines starting with a space, which are not saved in history, now do  not  get  autosuggestions.
         This  fixes  an  issue  with Midnight Commander integration (#6763 <https://github.com/fish-shell/fish-
         shell/issues/6763>), but may be changed in a future version.

       • Copying to the clipboard no longer inserts a newline at the end of the content, matching fish  2.7  and
         earlier (#6927 <https://github.com/fish-shell/fish-shell/issues/6927>).

       • fzf in complex pipes no longer hangs. More generally, code run as part of command substitutions or eval
         will   no   longer   have   separate   process   groups.   (#6624  <https://github.com/fish-shell/fish-
         shell/issues/6624>, #6806 <https://github.com/fish-shell/fish-shell/issues/6806>).

       This release also includes:

       • several changes to improve macOS compatibility with code signing and notarization;

       • several improvements to completions; and

       • several content and formatting improvements to the documentation.

       If you are upgrading from version 3.0.0 or before, please also review the release  notes  for  3.1.0  and
       3.1b1 (included below).

   Errata for fish 3.1
       A new builtin, time, was introduced in the fish 3.1 releases. This builtin is a reserved word (like test,
       function,  and  others)  because of the way it is implemented, and functions can no longer be named time.
       This was not clear in the fish 3.1b1 changelog.

                                                         ----

   fish 3.1.0 (released February 12, 2020)
       Compared to the beta release of fish 3.1b1, fish version 3.1.0:

       • Fixes a regression where spaces after a brace were removed despite brace expansion not occurring (#6564
         <https://github.com/fish-shell/fish-shell/issues/6564>).

       • Fixes a number of  problems  in  compiling  and  testing  on  Cygwin  (#6549  <https://github.com/fish-
         shell/fish-shell/issues/6549>)     and    Solaris-derived    systems    such    as    Illumos    (#6553
         <https://github.com/fish-shell/fish-shell/issues/6553>,   #6554    <https://github.com/fish-shell/fish-
         shell/issues/6554>,       #6555      <https://github.com/fish-shell/fish-shell/issues/6555>,      #6556
         <https://github.com/fish-shell/fish-shell/issues/6556>, and #6558  <https://github.com/fish-shell/fish-
         shell/issues/6558>).

       • Fixes the process for building macOS packages.

       • Fixes  a  regression  where  excessive  error messages are printed if Unicode characters are emitted in
         non-Unicode-capable locales (#6584 <https://github.com/fish-shell/fish-shell/issues/6584>).

       • Contains some improvements to the documentation and a small number of completions.

       If you are upgrading from version 3.0.0 or before,  please  also  review  the  release  notes  for  3.1b1
       (included below).

                                                         ----

   fish 3.1b1 (released January 26, 2020)
   Notable improvements and fixes
       • A  new  $pipestatus  variable  contains  a  list  of exit statuses of the previous job, for each of the
         separate commands in a pipeline (#5632 <https://github.com/fish-shell/fish-shell/issues/5632>).

       • fish no longer buffers pipes to the last function in a  pipeline,  improving  many  cases  where  pipes
         appeared to block or hang (#1396 <https://github.com/fish-shell/fish-shell/issues/1396>).

       • An  overhaul  of  error  messages  for  builtin commands, including a removal of the overwhelming usage
         summary, more readable stack traces  (#3404  <https://github.com/fish-shell/fish-shell/issues/3404>,  ‐
         #5434 <https://github.com/fish-shell/fish-shell/issues/5434>), and stack traces for test (aka [) (#5771
         <https://github.com/fish-shell/fish-shell/issues/5771>).

       • fish’s debugging arguments have been significantly improved. The --debug-level option has been removed,
         and  a  new --debug option replaces it. This option accepts various categories, which may be listed via
         fish --print-debug-categories  (#5879  <https://github.com/fish-shell/fish-shell/issues/5879>).  A  new
         --debug-output option allows for redirection of debug output.

       • string has a new collect subcommand for use in command substitutions, producing a single output instead
         of  splitting  on  new  lines  (similar  to  "$(cmd)"  in other shells) (#159 <https://github.com/fish-
         shell/fish-shell/issues/159>).

       • The fish manual, tutorial and FAQ are now available  in  man  format  as  fish-doc,  fish-tutorial  and
         fish-faq respectively (#5521 <https://github.com/fish-shell/fish-shell/issues/5521>).

       • Like other shells, cd now always looks for its argument in the current directory as a last resort, even
         if  the  CDPATH  variable  does  not  include  it  or  “.”  (#4484 <https://github.com/fish-shell/fish-
         shell/issues/4484>).

       • fish now correctly  handles  CDPATH  entries  that  start  with  ..   (#6220  <https://github.com/fish-
         shell/fish-shell/issues/6220>)    or    contain    ./    (#5887    <https://github.com/fish-shell/fish-
         shell/issues/5887>).

       • The fish_trace variable may be  set  to  trace  execution  (#3427  <https://github.com/fish-shell/fish-
         shell/issues/3427>).  This performs a similar role as set -x in other shells.

       • fish  uses  the  temporary  directory  determined  by  the  system,  rather than relying on /tmp (#3845
         <https://github.com/fish-shell/fish-shell/issues/3845>).

       • The fish Web configuration tool (fish_config) prints a list  of  commands  it  is  executing,  to  help
         understanding and debugging (#5584 <https://github.com/fish-shell/fish-shell/issues/5584>).

       • Major    performance    improvements    when    pasting   (#5866   <https://github.com/fish-shell/fish-
         shell/issues/5866>),   executing   lots   of   commands   (#5905   <https://github.com/fish-shell/fish-
         shell/issues/5905>),   importing   history   from   bash   (#6295  <https://github.com/fish-shell/fish-
         shell/issues/6295>),   and   when   completing   variables   that   might   match    $history    (#6288
         <https://github.com/fish-shell/fish-shell/issues/6288>).

   Syntax changes and new commands
       • A  new  builtin  command,  time, which allows timing of fish functions and builtins as well as external
         commands (#117 <https://github.com/fish-shell/fish-shell/issues/117>).

       • Brace expansion now only takes place if the braces include a  “,”  or  a  variable  expansion,  meaning
         common  commands  such  as  git reset HEAD@{0} do not require escaping (#5869 <https://github.com/fish-
         shell/fish-shell/issues/5869>).

       • New redirections &> and &| may be used to redirect or pipe stdout, and also redirect stderr  to  stdout
         (#6192 <https://github.com/fish-shell/fish-shell/issues/6192>).

       • switch    now    allows   arguments   that   expand   to   nothing,   like   empty   variables   (#5677
         <https://github.com/fish-shell/fish-shell/issues/5677>).

       • The VAR=val  cmd  syntax  can  now  be  used  to  run  a  command  in  a  modified  environment  (#6287
         <https://github.com/fish-shell/fish-shell/issues/6287>).

       • and  is  no  longer  recognised as a command, so that nonsensical constructs like and and and produce a
         syntax error (#6089 <https://github.com/fish-shell/fish-shell/issues/6089>).

       • math‘s exponent operator,’^‘, was previously left-associative, but  now  uses  the  more  commonly-used
         right-associative  behaviour (#6280 <https://github.com/fish-shell/fish-shell/issues/6280>). This means
         that math '3^0.5^2' was previously calculated as’(30.5)2’, but is now calculated as ‘3(0.52)’.

       • In fish 3.0, the variable used with for loops inside command substitutions could  leak  into  enclosing
         scopes; this was an inadvertent behaviour change and has been reverted (#6480 <https://github.com/fish-
         shell/fish-shell/issues/6480>).

   Scripting improvementsstring  split0  now  returns  0  if  it  split  something  (#5701  <https://github.com/fish-shell/fish-
         shell/issues/5701>).

       • In the interest of consistency, builtin -q and command -q can now be used to  query  if  a  builtin  or
         command exists (#5631 <https://github.com/fish-shell/fish-shell/issues/5631>).

       • math  now  accepts  --scale=max  for  the  maximum  scale  (#5579  <https://github.com/fish-shell/fish-
         shell/issues/5579>).

       • builtin  $var   now   works   correctly,   allowing   a   variable   as   the   builtin   name   (#5639
         <https://github.com/fish-shell/fish-shell/issues/5639>).

       • cd  understands  the -- argument to make it possible to change to directories starting with a hyphen (‐
         #6071 <https://github.com/fish-shell/fish-shell/issues/6071>).

       • complete  --do-complete  now  also  does  fuzzy  matches  (#5467   <https://github.com/fish-shell/fish-
         shell/issues/5467>).

       • complete   --do-complete   can   be   used   inside  completions,  allowing  limited  recursion  (#3474
         <https://github.com/fish-shell/fish-shell/issues/3474>).

       • count  now  also  counts  lines  fed  on  standard  input  (#5744  <https://github.com/fish-shell/fish-
         shell/issues/5744>).

       • eval   produces   an   exit   status   of   0  when  given  no  arguments,  like  other  shells  (#5692
         <https://github.com/fish-shell/fish-shell/issues/5692>).

       • printf prints what it can when input hasn’t been fully converted to a number, but still prints an error
         (#5532 <https://github.com/fish-shell/fish-shell/issues/5532>).

       • complete -C foo now works as expected, rather than requiring complete -Cfoo.

       • complete has a new --force-files option, to re-enable file completions. This allows sudo -E and  pacman
         -Qo to complete correctly (#5646 <https://github.com/fish-shell/fish-shell/issues/5646>).

       • argparse  now defaults to showing the current function name (instead of argparse) in its errors, making
         --name often superfluous (#5835 <https://github.com/fish-shell/fish-shell/issues/5835>).

       • argparse has a new --ignore-unknown option to keep unrecognized  options,  allowing  multiple  argparse
         passes to parse options (#5367 <https://github.com/fish-shell/fish-shell/issues/5367>).

       • argparse  correctly  handles  flag  value  validation  of  options  that  only  have short names (#5864
         <https://github.com/fish-shell/fish-shell/issues/5864>).

       • read -S (short option of --shell) is recognised correctly  (#5660  <https://github.com/fish-shell/fish-
         shell/issues/5660>).

       • read  understands  --list, which acts like --array in reading all arguments into a list inside a single
         variable, but is better named (#5846 <https://github.com/fish-shell/fish-shell/issues/5846>).

       • read has a new option, --tokenize, which splits a  string  into  variables  according  to  the  shell’s
         tokenization   rules,  considering  quoting,  escaping,  and  so  on  (#3823  <https://github.com/fish-
         shell/fish-shell/issues/3823>).

       • read interacts more correctly with the  deprecated  $IFS  variable,  in  particular  removing  multiple
         separators   when   splitting  a  variable  into  a  list  (#6406  <https://github.com/fish-shell/fish-
         shell/issues/6406>), matching other shells.

       • fish_indent now handles semicolons better, including leaving them in place for ; and and ;  or  instead
         of breaking the line (#5859 <https://github.com/fish-shell/fish-shell/issues/5859>).

       • fish_indent --write now supports multiple file arguments, indenting them in turn.

       • The  default  read  limit  has  been  increased  to  100MiB (#5267 <https://github.com/fish-shell/fish-
         shell/issues/5267>).

       • math now also  understands  x  for  multiplication,  provided  it  is  followed  by  whitespace  (#5906
         <https://github.com/fish-shell/fish-shell/issues/5906>).

       • math   reports   the   right   error   when   incorrect   syntax  is  used  inside  parentheses  (#6063
         <https://github.com/fish-shell/fish-shell/issues/6063>), and warns when unsupported logical  operations
         are used (#6096 <https://github.com/fish-shell/fish-shell/issues/6096>).

       • functions  --erase  now  also  prevents  fish  from  autoloading  a  function for the first time (#5951
         <https://github.com/fish-shell/fish-shell/issues/5951>).

       • jobs --last returns 0 to  indicate  success  when  a  job  is  found  (#6104  <https://github.com/fish-
         shell/fish-shell/issues/6104>).

       • commandline  -p  and  commandline  -j  now  split  on  &&  and  ||  in  addition  to  ;  and  &  (#6214
         <https://github.com/fish-shell/fish-shell/issues/6214>).

       • A bug where string split would drop empty strings if the output was only empty strings has  been  fixed
         (#5987 <https://github.com/fish-shell/fish-shell/issues/5987>).

       • eval  no  long creates a new local variable scope, but affects variables in the scope it is called from
         (#4443 <https://github.com/fish-shell/fish-shell/issues/4443>). source still creates a new local scope.

       • abbr has a new --query option to check for the existence of an abbreviation.

       • Local values for fish_complete_path and fish_function_path are now ignored; only  their  global  values
         are respected.

       • Syntax  error  reports  now  display  a marker in the correct position (#5812 <https://github.com/fish-
         shell/fish-shell/issues/5812>).

       • Empty  universal  variables   may   now   be   exported   (#5992   <https://github.com/fish-shell/fish-
         shell/issues/5992>).

       • Exported  universal  variables are no longer imported into the global scope, preventing shadowing. This
         makes it easier to change such variables for all fish sessions and avoids breakage when the value is  a
         list of multiple elements (#5258 <https://github.com/fish-shell/fish-shell/issues/5258>).

       • A  bug  where  for  could  use  invalid  variable names has been fixed (#5800 <https://github.com/fish-
         shell/fish-shell/issues/5800>).

       • A  bug  where  local  variables  would  not  be  exported  to   functions   has   been   fixed   (#6153
         <https://github.com/fish-shell/fish-shell/issues/6153>).

       • The  null  command  (:)  now  always  exits successfully, rather than passing through the previous exit
         status (#6022 <https://github.com/fish-shell/fish-shell/issues/6022>).

       • The output of functions FUNCTION matches the declaration of the function, correctly including  comments
         or  blank  lines (#5285 <https://github.com/fish-shell/fish-shell/issues/5285>), and correctly includes
         any --wraps flags (#1625 <https://github.com/fish-shell/fish-shell/issues/1625>).

       • type supports a new option, --short, which suppress function expansion (#6403 <https://github.com/fish-
         shell/fish-shell/issues/6403>).

       • type --path with a function argument will now output the path to the file containing the definition  of
         that function, if it exists.

       • type --force-path with an argument that cannot be found now correctly outputs nothing, as documented (‐
         #6411 <https://github.com/fish-shell/fish-shell/issues/6411>).

       • The  $hostname  variable  is  no  longer  truncated  to  32 characters (#5758 <https://github.com/fish-
         shell/fish-shell/issues/5758>).

       • Line  numbers  in  function  backtraces  are  calculated  correctly  (#6350   <https://github.com/fish-
         shell/fish-shell/issues/6350>).

       • A  new  fish_cancel  event  is emitted when the command line is cancelled, which is useful for terminal
         integration (#5973 <https://github.com/fish-shell/fish-shell/issues/5973>).

   Interactive improvements
       • New   Base16   color   options   are   available   through   the   Web-based    configuration    (#6504
         <https://github.com/fish-shell/fish-shell/issues/6504>).

       • fish  only  parses  /etc/paths  on  macOS  in  login  shells,  matching  the bash implementation (#5637
         <https://github.com/fish-shell/fish-shell/issues/5637>) and avoiding changes to path ordering in  child
         shells  (#5456 <https://github.com/fish-shell/fish-shell/issues/5456>). It now ignores blank lines like
         the bash implementation (#5809 <https://github.com/fish-shell/fish-shell/issues/5809>).

       • The locale is now reloaded when  the  LOCPATH  variable  is  changed  (#5815  <https://github.com/fish-
         shell/fish-shell/issues/5815>).

       • read  no  longer  keeps  a history, making it suitable for operations that shouldn’t end up there, like
         password entry (#5904 <https://github.com/fish-shell/fish-shell/issues/5904>).

       • dirh  outputs  its   stack   in   the   correct   order   (#5477   <https://github.com/fish-shell/fish-
         shell/issues/5477>),  and  behaves as documented when universal variables are used for its stack (#5797
         <https://github.com/fish-shell/fish-shell/issues/5797>).

       • funced and the edit-commandline-in-buffer bindings did not work in fish 3.0 when the  $EDITOR  variable
         contained           spaces;          this          has          been          corrected          (#5625
         <https://github.com/fish-shell/fish-shell/issues/5625>).

       • Builtins now  pipe  their  help  output  to  a  pager  automatically  (#6227  <https://github.com/fish-
         shell/fish-shell/issues/6227>).

       • set_color now colors the --print-colors output in the matching colors if it is going to a terminal.

       • fish   now   underlines   every   valid   entered   path   instead   of   just   the  last  one  (#5872
         <https://github.com/fish-shell/fish-shell/issues/5872>).

       • When syntax highlighting a string with an unclosed quote, only the quote itself will  be  shown  as  an
         error, instead of the whole argument.

       • Syntax  highlighting  works  correctly  with  variables  as  commands  (#5658 <https://github.com/fish-
         shell/fish-shell/issues/5658>)    and    redirections    to    close    file     descriptors     (#6092
         <https://github.com/fish-shell/fish-shell/issues/6092>).

       • help   works  properly  on  Windows  Subsytem  for  Linux  (#5759  <https://github.com/fish-shell/fish-
         shell/issues/5759>, #6338 <https://github.com/fish-shell/fish-shell/issues/6338>).

       • A bug where disown could crash the shell has  been  fixed  (#5720  <https://github.com/fish-shell/fish-
         shell/issues/5720>).

       • fish  will  not  autosuggest  files  ending  with  ~ unless there are no other candidates, as these are
         generally backup files (#985 <https://github.com/fish-shell/fish-shell/issues/985>).

       • Escape in the pager works correctly (#5818 <https://github.com/fish-shell/fish-shell/issues/5818>).

       • Key  bindings  that  call  fg   no   longer   leave   the   terminal   in   a   broken   state   (#2114
         <https://github.com/fish-shell/fish-shell/issues/2114>).

       • Brackets  (#5831  <https://github.com/fish-shell/fish-shell/issues/5831>) and filenames containing $ (‐
         #6060 <https://github.com/fish-shell/fish-shell/issues/6060>) are completed with appropriate escaping.

       • The output of complete and functions is now colorized in interactive terminals.

       • The  Web-based  configuration  handles  aliases   that   include   single   quotes   correctly   (#6120
         <https://github.com/fish-shell/fish-shell/issues/6120>),  and  launches  correctly  under Termux (#6248
         <https://github.com/fish-shell/fish-shell/issues/6248>) and  OpenBSD  (#6522  <https://github.com/fish-
         shell/fish-shell/issues/6522>).

       • function  now  correctly  validates  parameters  for  --argument-names  as  valid variable names (#6147
         <https://github.com/fish-shell/fish-shell/issues/6147>)  and   correctly   parses   options   following
         --argument-names,  as  in  “--argument-names  foo  --description  bar” (#6186 <https://github.com/fish-
         shell/fish-shell/issues/6186>).

       • History newly imported from bash includes command lines using && or ||.

       • The automatic generation of completions from manual pages  is  better  described  in  job  and  process
         listings,  and  no  longer  produces  a  warning  when  exiting  fish  (#6269 <https://github.com/fish-
         shell/fish-shell/issues/6269>).

       • In private mode, setting $fish_greeting to an empty string before starting  the  private  session  will
         prevent  the  warning about history not being saved from being printed (#6299 <https://github.com/fish-
         shell/fish-shell/issues/6299>).

       • In the interactive editor, a line break (Enter) inside unclosed brackets will insert a new line, rather
         than  executing  the  command  and  producing  an  error  (#6316   <https://github.com/fish-shell/fish-
         shell/issues/6316>).

       • Ctrl-C always repaints the prompt (#6394 <https://github.com/fish-shell/fish-shell/issues/6394>).

       • When  run  interactively from another program (such as Python), fish will correctly start a new process
         group, like other shells (#5909 <https://github.com/fish-shell/fish-shell/issues/5909>).

       • Job  identifiers  (for  example,  for   background   jobs)   are   assigned   more   logically   (#6053
         <https://github.com/fish-shell/fish-shell/issues/6053>).

       • A  bug  where  history  would  appear  truncated  if  an  empty  command  was executed was fixed (#6032
         <https://github.com/fish-shell/fish-shell/issues/6032>).

   New or improved bindings
       • Pasting strips leading  spaces  to  avoid  pasted  commands  being  omitted  from  the  history  (#4327
         <https://github.com/fish-shell/fish-shell/issues/4327>).

       • Shift-Left and Shift-Right now default to moving backwards and forwards by one bigword (words separated
         by whitespace) (#1505 <https://github.com/fish-shell/fish-shell/issues/1505>).

       • The  default  escape  delay  (to  differentiate between the escape key and an alt-combination) has been
         reduced  to  30ms,  down  from  300ms  for  the  default  mode   and   100ms   for   Vi   mode   (#3904
         <https://github.com/fish-shell/fish-shell/issues/3904>).

       • The    forward-bigword    binding    now    interacts    correctly    with    autosuggestions    (#5336
         <https://github.com/fish-shell/fish-shell/issues/5336>).

       • The fish_clipboard_* functions support Wayland by  using  wl-clipboard  <https://github.com/bugaevc/wl-
         clipboard> (#5450 <https://github.com/fish-shell/fish-shell/issues/5450>).

       • The  nextd  and  prevd  functions  no  longer  print  “Hit  end of history”, instead using a bell. They
         correctly  store  working  directories  containing  symbolic  links  (#6395   <https://github.com/fish-
         shell/fish-shell/issues/6395>).

       • If  a  fish_mode_prompt  function  exists,  Vi  mode will only execute it on mode-switch instead of the
         entire  prompt.   This   should   make   it   much   more   responsive   with   slow   prompts   (#5783
         <https://github.com/fish-shell/fish-shell/issues/5783>).

       • The  path-component  bindings  (like  Ctrl-w)  now  also stop at “:” and “@”, because those are used to
         denote  user  and  host  in  commands   such   as   ssh   (#5841   <https://github.com/fish-shell/fish-
         shell/issues/5841>).

       • The  NULL  character  can  now  be  bound  via bind -k nul. Terminals often generate this character via
         control-space. (#3189 <https://github.com/fish-shell/fish-shell/issues/3189>).

       • A  new  readline  command  expand-abbr  can  be  used  to   trigger   abbreviation   expansion   (#5762
         <https://github.com/fish-shell/fish-shell/issues/5762>).

       • A  new  readline  command,  delete-or-exit, removes a character to the right of the cursor or exits the
         shell if the command line is empty (moving this functionality out of the delete-or-exit function).

       • The self-insert readline command will now insert the binding sequence, if not empty.

       • A new binding to prepend sudo, bound to Alt-S by  default  (#6140  <https://github.com/fish-shell/fish-
         shell/issues/6140>).

       • The  Alt-W  binding  to  describe  a  command  should  now  work  better  with multiline prompts (#6110
         <https://github.com/fish-shell/fish-shell/issues/6110>)

       • The  Alt-H  binding  to   open   a   command’s   man   page   now   tries   to   ignore   sudo   (#6122
         <https://github.com/fish-shell/fish-shell/issues/6122>).

       • A  new  pair  of  bind  functions,  history-prefix-search-backward (and forward), was introduced (#6143
         <https://github.com/fish-shell/fish-shell/issues/6143>).

       • Vi  mode  now  supports  R  to   enter   replace   mode   (#6342   <https://github.com/fish-shell/fish-
         shell/issues/6342>),  and  d0  to  delete  the current line (#6292 <https://github.com/fish-shell/fish-
         shell/issues/6292>).

       • In  Vi  mode,  hitting   Enter   in   replace-one   mode   no   longer   erases   the   prompt   (#6298
         <https://github.com/fish-shell/fish-shell/issues/6298>).

       • Selections   in   Vi   mode   are   inclusive,   matching   the   actual   behaviour   of   Vi   (#5770
         <https://github.com/fish-shell/fish-shell/issues/5770>).

   Improved prompts
       • The Git prompt in informative mode now shows the number of stashes if enabled.

       • The Git prompt now has an option ($__fish_git_prompt_use_informative_chars) to use  the  (more  modern)
         informative characters without enabling informative mode.

       • The  default prompt now also features VCS integration and will color the host if running via SSH (#6375
         <https://github.com/fish-shell/fish-shell/issues/6375>).

       • The default and example prompts print the pipe status if an earlier command in the pipe fails.

       • The default and example prompts try to resolve exit statuses to signal names when appropriate.

   Improved terminal output
       • New fish_pager_color_ options have been added to control more elements of  the  pager’s  colors  (#5524
         <https://github.com/fish-shell/fish-shell/issues/5524>).

       • Better  detection  and  support  for  using fish from various system consoles, where limited colors and
         special characters are supported (#5552 <https://github.com/fish-shell/fish-shell/issues/5552>).

       • fish now tries to guess if the system supports Unicode 9 (and displays emoji as wide), eliminating  the
         need   to   set   $fish_emoji_width   in   most   cases   (#5722   <https://github.com/fish-shell/fish-
         shell/issues/5722>).

       • Improvements to the display of  wide  characters,  particularly  Korean  characters  and  emoji  (#5583
         <https://github.com/fish-shell/fish-shell/issues/5583>,    #5729   <https://github.com/fish-shell/fish-
         shell/issues/5729>).

       • The Vi mode cursor is correctly redrawn when regaining focus under  terminals  that  report  focus  (eg
         tmux) (#4788 <https://github.com/fish-shell/fish-shell/issues/4788>).

       • Variables that control background colors (such as fish_pager_color_search_match) can now use --reverse.

   Completions
       • Added completions for

         • awsbat (#6052 <https://github.com/fish-shell/fish-shell/issues/6052>)

         • bosh (#5700 <https://github.com/fish-shell/fish-shell/issues/5700>)

         • btrfscamcontrolcf (#5700 <https://github.com/fish-shell/fish-shell/issues/5700>)

         • chronyc (#6496 <https://github.com/fish-shell/fish-shell/issues/6496>)

         • code (#6205 <https://github.com/fish-shell/fish-shell/issues/6205>)

         • cryptsetup (#6488 <https://github.com/fish-shell/fish-shell/issues/6488>)

         • csc and csi (#6016 <https://github.com/fish-shell/fish-shell/issues/6016>)

         • cwebp (#6034 <https://github.com/fish-shell/fish-shell/issues/6034>)

         • cygpath and cygstart (#6239 <https://github.com/fish-shell/fish-shell/issues/6239>)

         • epkginfo (#5829 <https://github.com/fish-shell/fish-shell/issues/5829>)

         • ffmpeg, ffplay, and ffprobe (#5922 <https://github.com/fish-shell/fish-shell/issues/5922>)

         • fsharpc and fsharpi (#6016 <https://github.com/fish-shell/fish-shell/issues/6016>)

         • fzf (#6178 <https://github.com/fish-shell/fish-shell/issues/6178>)

         • g++ (#6217 <https://github.com/fish-shell/fish-shell/issues/6217>)

         • gpg1 (#6139 <https://github.com/fish-shell/fish-shell/issues/6139>)

         • gpg2 (#6062 <https://github.com/fish-shell/fish-shell/issues/6062>)

         • grub-mkrescue (#6182 <https://github.com/fish-shell/fish-shell/issues/6182>)

         • hledger (#6043 <https://github.com/fish-shell/fish-shell/issues/6043>)

         • hwinfo (#6496 <https://github.com/fish-shell/fish-shell/issues/6496>)

         • irb (#6260 <https://github.com/fish-shell/fish-shell/issues/6260>)

         • iw (#6232 <https://github.com/fish-shell/fish-shell/issues/6232>)

         • kakkeepassxc-cli (#6505 <https://github.com/fish-shell/fish-shell/issues/6505>)

         • keybase (#6410 <https://github.com/fish-shell/fish-shell/issues/6410>)

         • loginctl (#6501 <https://github.com/fish-shell/fish-shell/issues/6501>)

         • lz4, lz4c and lz4cat (#6364 <https://github.com/fish-shell/fish-shell/issues/6364>)

         • mariner (#5718 <https://github.com/fish-shell/fish-shell/issues/5718>)

         • nethack (#6240 <https://github.com/fish-shell/fish-shell/issues/6240>)

         • patool (#6083 <https://github.com/fish-shell/fish-shell/issues/6083>)

         • phpunit (#6197 <https://github.com/fish-shell/fish-shell/issues/6197>)

         • plutil (#6301 <https://github.com/fish-shell/fish-shell/issues/6301>)

         • pzstd (#6364 <https://github.com/fish-shell/fish-shell/issues/6364>)

         • qubes-gpg-client (#6067 <https://github.com/fish-shell/fish-shell/issues/6067>)

         • resolvectl (#6501 <https://github.com/fish-shell/fish-shell/issues/6501>)

         • rgrustupsfdx (#6149 <https://github.com/fish-shell/fish-shell/issues/6149>)

         • speedtest and speedtest-cli (#5840 <https://github.com/fish-shell/fish-shell/issues/5840>)

         • src (#6026 <https://github.com/fish-shell/fish-shell/issues/6026>)

         • tokei (#6085 <https://github.com/fish-shell/fish-shell/issues/6085>)

         • tsc (#6016 <https://github.com/fish-shell/fish-shell/issues/6016>)

         • unlz4 (#6364 <https://github.com/fish-shell/fish-shell/issues/6364>)

         • unzstd (#6364 <https://github.com/fish-shell/fish-shell/issues/6364>)

         • vbc (#6016 <https://github.com/fish-shell/fish-shell/issues/6016>)

         • zpaq (#6245 <https://github.com/fish-shell/fish-shell/issues/6245>)

         • zstd,   zstdcat,   zstdgrep,   zstdless   and   zstdmt   (#6364  <https://github.com/fish-shell/fish-
           shell/issues/6364>)

       • Lots of improvements to completions.

       • Selecting short options which also have a long name  from  the  completion  pager  is  possible  (#5634
         <https://github.com/fish-shell/fish-shell/issues/5634>).

       • Tab    completion   will   no   longer   add   trailing   spaces   if   they   already   exist   (#6107
         <https://github.com/fish-shell/fish-shell/issues/6107>).

       • Completion  of   subcommands   to   builtins   like   and   or   not   now   works   correctly   (#6249
         <https://github.com/fish-shell/fish-shell/issues/6249>).

       • Completion  of arguments to short options works correctly when multiple short options are used together
         (#332 <https://github.com/fish-shell/fish-shell/issues/332>).

       • Activating completion in the middle of an invalid completion does not move the cursor any more,  making
         it easier to fix a mistake (#4124 <https://github.com/fish-shell/fish-shell/issues/4124>).

       • Completion in empty commandlines now lists all available commands.

       • Functions  listed as completions could previously leak parts of the function as other completions; this
         has been fixed.

   Deprecations and removed features
       • The vcs-prompt functions have been promoted to names without double-underscore, so __fish_git_prompt is
         now fish_git_prompt, __fish_vcs_prompt is now fish_vcs_prompt, __fish_hg_prompt is  now  fish_hg_prompt
         and __fish_svn_prompt is now fish_svn_prompt. Shims at the old names have been added, and the variables
         have kept their old names (#5586 <https://github.com/fish-shell/fish-shell/issues/5586>).

       • string  replace  has  an  additional  round  of  escaping  in  the  replacement expression, so escaping
         backslashes requires many escapes (eg string replace -ra '([ab])' '\\\\\\\$1' a). The new feature  flag
         regex-easyesc  can be used to disable this, so that the same effect can be achieved with string replace
         -ra '([ab])' '\\\\$1' a (#5556 <https://github.com/fish-shell/fish-shell/issues/5556>). As a  reminder,
         the  intention  behind  feature  flags  is  that  this will eventually become the default and then only
         option, so scripts should be updated.

       • The fish_vi_mode function, deprecated in fish 2.3, has been removed. Use  fish_vi_key_bindings  instead
         (#6372 <https://github.com/fish-shell/fish-shell/issues/6372>).

   For distributors and developers
       • fish  3.0 introduced a CMake-based build system. In fish 3.1, both the Autotools-based build and legacy
         Xcode build system have been removed, leaving  only  the  CMake  build  system.  All  distributors  and
         developers must install CMake.

       • fish now depends on the common tee external command, for the psub process substitution function.

       • The  documentation  is  now  built  with  Sphinx.  The  old Doxygen-based documentation system has been
         removed. Developers, and distributors who wish to rebuild the documentation, must install Sphinx.

       • The INTERNAL_WCWIDTH build option has been removed,  as  fish  now  always  uses  an  internal  wcwidth
         function.  It  has  a number of configuration options that make it more suitable for general use (#5777
         <https://github.com/fish-shell/fish-shell/issues/5777>).

       • mandoc can now be used to format the output from --help if nroff is not installed, reducing the  number
         of  external  dependencies on systems with mandoc installed (#5489 <https://github.com/fish-shell/fish-
         shell/issues/5489>).

       • Some  bugs  preventing  building  on  Solaris-derived  systems  such  as  Illumos  were  fixed   (#5458
         <https://github.com/fish-shell/fish-shell/issues/5458>,    #5461   <https://github.com/fish-shell/fish-
         shell/issues/5461>, #5611 <https://github.com/fish-shell/fish-shell/issues/5611>).

       • Completions for npm, bower and yarn no longer require the jq utility for full functionality,  but  will
         use Python instead if it is available.

       • The  paths  for  completions,  functions and configuration snippets have been extended. On systems that
         define XDG_DATA_DIRS, each of the directories in this  variable  are  searched  in  the  subdirectories
         fish/vendor_completions.d,  fish/vendor_functions.d,  and  fish/vendor_conf.d  respectively. On systems
         that do not define this variable in the environment, the vendor directories are searched  for  in  both
         the  installation  prefix  and  the  default “extra” directory, which now defaults to /usr/local (#5029
         <https://github.com/fish-shell/fish-shell/issues/5029>).

                                                         ----

   fish 3.0.2 (released February 19, 2019)
       This release of fish fixes an issue discovered in fish 3.0.1.

   Fixes and improvements
       • The PWD environment variable is now ignored if it does not  resolve  to  the  true  working  directory,
         fixing  strange  behaviour  in  terminals  started by editors and IDEs (#5647 <https://github.com/fish-
         shell/fish-shell/issues/5647>).

       If you are upgrading from version 2.7.1 or before, please also review the release notes for 3.0.1,  3.0.0
       and 3.0b1 (included below).

   fish 3.0.1 (released February 11, 2019)
       This release of fish fixes a number of major issues discovered in fish 3.0.0.

   Fixes and improvementsexec  does  not  complain  about  running  foreground jobs when called (#5449 <https://github.com/fish-
         shell/fish-shell/issues/5449>).

       • while loops now evaluate to the last executed command in the loop body (or zero if the body was empty),
         matching POSIX semantics (#4982 <https://github.com/fish-shell/fish-shell/issues/4982>).

       • read  --silent  no  longer  echoes  to  the  tty  when  run  from  a  non-interactive   script   (#5519
         <https://github.com/fish-shell/fish-shell/issues/5519>).

       • On  macOS,  path entries with spaces in /etc/paths and /etc/paths.d now correctly set path entries with
         spaces.   Likewise,  MANPATH  is  correctly  set  from   /etc/manpaths   and   /etc/manpaths.d   (#5481
         <https://github.com/fish-shell/fish-shell/issues/5481>).

       • fish             starts            correctly            under            Cygwin/MSYS2            (#5426
         <https://github.com/fish-shell/fish-shell/issues/5426>).

       • The pager-toggle-search binding (Ctrl-S by default) will now activate the search field, even  when  the
         pager is not focused.

       • The error when a command is not found is now printed a single time, instead of once per argument (#5588
         <https://github.com/fish-shell/fish-shell/issues/5588>).

       • Fixes  and  improvements  to  the  git  completions,  including  printing  correct paths with older git
         versions, fuzzy matching again, reducing unnecessary offers of root paths  (starting  with  :/)  (#5578
         <https://github.com/fish-shell/fish-shell/issues/5578>,    #5574   <https://github.com/fish-shell/fish-
         shell/issues/5574>, #5476 <https://github.com/fish-shell/fish-shell/issues/5476>), and  ignoring  shell
         aliases,  so  enterprising  users can set up the wrapping command (via set -g __fish_git_alias_$command
         $whatitwraps) (#5412 <https://github.com/fish-shell/fish-shell/issues/5412>).

       • Significant  performance  improvements  to  core  shell  functions   (#5447   <https://github.com/fish-
         shell/fish-shell/issues/5447>)  and to the kill completions (#5541 <https://github.com/fish-shell/fish-
         shell/issues/5541>).

       • Starting in symbolically-linked working directories works  correctly  (#5525  <https://github.com/fish-
         shell/fish-shell/issues/5525>).

       • The  default  fish_title  function  no  longer  contains  extra spaces (#5517 <https://github.com/fish-
         shell/fish-shell/issues/5517>).

       • The  nim  prompt  now  works  correctly   when   chosen   in   the   Web-based   configuration   (#5490
         <https://github.com/fish-shell/fish-shell/issues/5490>).

       • string  now  prints  help  to  stdout,  like other builtins (#5495 <https://github.com/fish-shell/fish-
         shell/issues/5495>).

       • Killing the terminal while fish is in vi normal mode will no longer send it spinning and eating CPU. (‐
         #5528 <https://github.com/fish-shell/fish-shell/issues/5528>)

       • A number of crashes have been fixed  (#5550  <https://github.com/fish-shell/fish-shell/issues/5550>,  ‐
         #5548     <https://github.com/fish-shell/fish-shell/issues/5548>,    #5479    <https://github.com/fish-
         shell/fish-shell/issues/5479>, #5453 <https://github.com/fish-shell/fish-shell/issues/5453>).

       • Improvements to the documentation and certain completions.

   Known issues
       There is one significant known issue that was not corrected before the release:

       • fish does not run correctly under Windows Services for Linux before Windows 10 version 1809/17763,  and
         the   message  warning  of  this  may  not  be  displayed  (#5619  <https://github.com/fish-shell/fish-
         shell/issues/5619>).

       If you are upgrading from version 2.7.1 or before, please also review the release  notes  for  3.0.0  and
       3.0b1 (included below).

                                                         ----

   fish 3.0.0 (released December 28, 2018)
       fish  3  is  a  major  release,  which introduces some breaking changes alongside improved functionality.
       Although most existing scripts will continue to work, they should be reviewed against the list  contained
       in the 3.0b1 release notes below.

       Compared to the beta release of fish 3.0b1, fish version 3.0.0:

       • builds correctly against musl libc (#5407 <https://github.com/fish-shell/fish-shell/issues/5407>)

       • handles   huge   numeric   arguments  to  test  correctly  (#5414  <https://github.com/fish-shell/fish-
         shell/issues/5414>)

       • removes the history colouring introduced in 3.0b1, which did not always work correctly

       There is one significant known issue which was not able to be corrected before the release:

       • fish 3.0.0 builds on Cygwin (#5423  <https://github.com/fish-shell/fish-shell/issues/5423>),  but  does
         not  run  correctly (#5426 <https://github.com/fish-shell/fish-shell/issues/5426>) and will result in a
         hanging terminal when started. Cygwin users are encouraged to continue  using  2.7.1  until  a  release
         which corrects this is available.

       If  you  are  upgrading  from  version  2.7.1  or  before, please also review the release notes for 3.0b1
       (included below).

                                                         ----

   fish 3.0b1 (released December 11, 2018)
       fish 3 is a major release, which introduces  some  breaking  changes  alongside  improved  functionality.
       Although most existing scripts will continue to work, they should be reviewed against the list below.

   Notable non-backward compatible changes
       • Process  and  job expansion has largely been removed. % will no longer perform these expansions, except
         for %self for the PID of the current shell. Additionally, job management commands (disown, wait, bg, fg
         and kill) will expand  job  specifiers  starting  with  %  (#4230  <https://github.com/fish-shell/fish-
         shell/issues/4230>, #1202 <https://github.com/fish-shell/fish-shell/issues/1202>).

       • set  x[1]  x[2]  a  b,  to  set multiple elements of an array at once, is no longer valid syntax (#4236
         <https://github.com/fish-shell/fish-shell/issues/4236>).

       • A literal {} now expands to itself, rather than nothing. This makes working with find -exec  easier  (‐
         #1109     <https://github.com/fish-shell/fish-shell/issues/1109>,    #4632    <https://github.com/fish-
         shell/fish-shell/issues/4632>).

       • Literally  accessing  a  zero-index  is  now  illegal  syntax  and  is  caught  by  the  parser  (#4862
         <https://github.com/fish-shell/fish-shell/issues/4862>). (fish indices start at 1)

       • Successive commas in brace expansions are handled in less surprising manner. For example, {,,,} expands
         to  four  empty  strings  rather  than  an  empty  string,  a  comma  and  an empty string again (#3002
         <https://github.com/fish-shell/fish-shell/issues/3002>,   #4632    <https://github.com/fish-shell/fish-
         shell/issues/4632>).

       • for  loop  control  variables  are  no  longer  local to the for block (#1935 <https://github.com/fish-
         shell/fish-shell/issues/1935>).

       • Variables   set   in   if   and   while   conditions   are   available   outside   the   block   (#4820
         <https://github.com/fish-shell/fish-shell/issues/4820>).

       • Local  exported (set -lx) vars are now visible to functions (#1091 <https://github.com/fish-shell/fish-
         shell/issues/1091>).

       • The new math builtin (see below) does not support logical expressions; test should be used  instead  (‐
         #4777 <https://github.com/fish-shell/fish-shell/issues/4777>).

       • Range  expansion  will now behave sensibly when given a single positive and negative index ($foo[5..-1]
         or $foo[-1..5]), clamping to the last valid index without changing direction  if  the  list  has  fewer
         elements than expected.

       • read  now  uses  -s  as  short for --silent (à la bash); --shell’s abbreviation (formerly -s) is now -S
         instead (#4490 <https://github.com/fish-shell/fish-shell/issues/4490>).

       • cd no longer resolves symlinks. fish now  maintains  a  virtual  path,  matching  other  shells  (#3350
         <https://github.com/fish-shell/fish-shell/issues/3350>).

       • source   now   requires   an   explicit   -   as   the  filename  to  read  from  the  terminal  (#2633
         <https://github.com/fish-shell/fish-shell/issues/2633>).

       • Arguments to end are now errors, instead of being silently ignored.

       • The names argparse, read, set, status, test and [ are now reserved and not allowed as  function  names.
         This   prevents   users  unintentionally  breaking  stuff  (#3000  <https://github.com/fish-shell/fish-
         shell/issues/3000>).

       • The fish_user_abbreviations variable is no longer used; abbreviations  will  be  migrated  to  the  new
         storage format automatically.

       • The  FISH_READ_BYTE_LIMIT  variable  is  now  called  fish_byte_limit  (#4414 <https://github.com/fish-
         shell/fish-shell/issues/4414>).

       • Environment variables are no longer split into arrays  based  on  the  record  separator  character  on
         startup. Instead, variables are not split, unless their name ends in PATH, in which case they are split
         on colons (#436 <https://github.com/fish-shell/fish-shell/issues/436>).

       • The  history  builtin’s  --with-time  option  has  been  removed;  this has been deprecated in favor of
         --show-time since 2.7.0 (#4403 <https://github.com/fish-shell/fish-shell/issues/4403>).

       • The internal variables __fish_datadir and  __fish_sysconfdir  are  now  known  as  __fish_data_dir  and
         __fish_sysconf_dir respectively.

   Deprecations
       With  the  release  of fish 3, a number of features have been marked for removal in the future. All users
       are encouraged to explore alternatives.  A small number of these features are  currently  behind  feature
       flags, which are turned on at present but may be turned off by default in the future.

       A  new  feature flags mechanism is added for staging deprecations and breaking changes. Feature flags may
       be specified at launch with fish --features ... or by setting the universal  fish_features  variable.  (‐
       #4940 <https://github.com/fish-shell/fish-shell/issues/4940>)

       • The  use  of  the  IFS  variable  for  read  is  deprecated;  IFS  will be ignored in the future (#4156
         <https://github.com/fish-shell/fish-shell/issues/4156>). Use the read --delimiter option instead.

       • The function --on-process-exit switch  will  be  removed  in  future  (#4700  <https://github.com/fish-
         shell/fish-shell/issues/4700>). Use the fish_exit event instead: function --on-event fish_exit.

       • $_   is   deprecated   and  will  removed  in  the  future  (#813  <https://github.com/fish-shell/fish-
         shell/issues/813>). Use status current-command in a command substitution instead.

       • ^ as a redirection deprecated and will be removed  in  the  future.   (#4394  <https://github.com/fish-
         shell/fish-shell/issues/4394>).  Use  2>  to  redirect stderr. This is controlled by the stderr-nocaret
         feature flag.

       • ? as a glob (wildcard) is deprecated and will be removed in the future (#4520 <https://github.com/fish-
         shell/fish-shell/issues/4520>). This is controlled by the qmark-noglob feature flag.

   Notable fixes and improvements
   Syntax changes and new commands
       • fish now supports &&  (like  and),  ||  (like  or),  and  !  (like  not),  for  better  migration  from
         POSIX-compliant shells (#4620 <https://github.com/fish-shell/fish-shell/issues/4620>).

       • Variables may be used as commands (#154 <https://github.com/fish-shell/fish-shell/issues/154>).

       • fish  may  be started in private mode via fish --private. Private mode fish sessions do not have access
         to the history file and any commands evaluated in private mode are not persisted for future sessions. A
         session variable $fish_private_mode can be queried to detect private mode and adjust  the  behavior  of
         scripts accordingly to respect the user’s wish for privacy.

       • A  new  wait  command for waiting on backgrounded processes (#4498 <https://github.com/fish-shell/fish-
         shell/issues/4498>).

       • math is now a builtin rather than  a  wrapper  around  bc  (#3157  <https://github.com/fish-shell/fish-
         shell/issues/3157>). Floating point computations is now used by default, and can be controlled with the
         new --scale option (#4478 <https://github.com/fish-shell/fish-shell/issues/4478>).

       • Setting  $PATH  no  longer  warns on non-existent directories, allowing for a single $PATH to be shared
         across machines (eg via dotfiles) (#2969 <https://github.com/fish-shell/fish-shell/issues/2969>).

       • while sets $status to a non-zero value if the loop is  not  executed  (#4982  <https://github.com/fish-
         shell/fish-shell/issues/4982>).

       • Command  substitution  output  is  now  limited  to 10 MB by default, controlled by the fish_read_limit
         variable (#3822 <https://github.com/fish-shell/fish-shell/issues/3822>). Notably, this is  larger  than
         most  operating  systems’  argument  size limit, so trying to pass argument lists this size to external
         commands has never worked.

       • The machine hostname, where available, is now exposed as the $hostname reserved variable. This  removes
         the           dependency          on          the          hostname          executable          (#4422
         <https://github.com/fish-shell/fish-shell/issues/4422>).

       • Bare bind invocations in config.fish  now  work.  The  fish_user_key_bindings  function  is  no  longer
         necessary,  but  will  still  be  executed  if  it  exists  (#5191 <https://github.com/fish-shell/fish-
         shell/issues/5191>).

       • $fish_pid and $last_pid are available as replacements for %self and %last.

   New features in commandsalias   has   a   new   --save   option   to   save   the   generated   function   immediately   (#4878
         <https://github.com/fish-shell/fish-shell/issues/4878>).

       • bind  has  a new --silent option to ignore bind requests for named keys not available under the current
         terminal (#4188 <https://github.com/fish-shell/fish-shell/issues/4188>, #4431 <https://github.com/fish-
         shell/fish-shell/issues/4431>).

       • complete has a new --keep-order option to show the provided or dynamically-generated argument  list  in
         the  same  order  as  specified,  rather than alphabetically (#361 <https://github.com/fish-shell/fish-
         shell/issues/361>).

       • exec prompts for confirmation if background jobs are running.

       • funced has a new --save option to automatically save the edited function after successfully editing  (‐
         #4668 <https://github.com/fish-shell/fish-shell/issues/4668>).

       • functions  has  a  new  --handlers  option  to  show  functions  registered  as  event  handlers (#4694
         <https://github.com/fish-shell/fish-shell/issues/4694>).

       • history search  supports  globs  for  wildcard  searching  (#3136  <https://github.com/fish-shell/fish-
         shell/issues/3136>)  and  has  a  new  --reverse  option  to  show entries from oldest to newest (#4375
         <https://github.com/fish-shell/fish-shell/issues/4375>).

       • jobs has a new --quiet option to silence the output.

       • read has a new --delimiter option for splitting  input  into  arrays  (#4256  <https://github.com/fish-
         shell/fish-shell/issues/4256>).

       • read  writes directly to stdout if called without arguments (#4407 <https://github.com/fish-shell/fish-
         shell/issues/4407>).

       • read can now read individual lines into separate variables without consuming the input in its  entirety
         via the new /--line option.

       • set    has   new   --append   and   --prepend   options   (#1326   <https://github.com/fish-shell/fish-
         shell/issues/1326>).

       • string match with an empty pattern and --entire in glob mode now matches everything instead of  nothing
         (#4971 <https://github.com/fish-shell/fish-shell/issues/4971>).

       • string  split  supports  a  new  --no-empty  option  to  exclude  empty  strings from the result (#4779
         <https://github.com/fish-shell/fish-shell/issues/4779>).

       • string has new subcommands split0 and join0 for working with NUL-delimited output.

       • string no longer stops processing text after NUL characters (#4605 <https://github.com/fish-shell/fish-
         shell/issues/4605>)

       • string escape has a new --style regex option for escaping strings to be  matched  literally  in  string
         regex operations.

       • test now supports floating point values in numeric comparisons.

   Interactive improvements
       • A   pipe   at   the  end  of  a  line  now  allows  the  job  to  continue  on  the  next  line  (#1285
         <https://github.com/fish-shell/fish-shell/issues/1285>).

       • Italics  and  dim  support  out  of  the   box   on   macOS   for   Terminal.app   and   iTerm   (#4436
         <https://github.com/fish-shell/fish-shell/issues/4436>).

       • cd tab completions no longer descend into the deepest unambiguous path (#4649 <https://github.com/fish-
         shell/fish-shell/issues/4649>).

       • Pager  navigation  has  been  improved.  Most notably, moving down now wraps around, moving up from the
         commandline now jumps to the last element and moving right and left now reverse each  other  even  when
         wrapping around (#4680 <https://github.com/fish-shell/fish-shell/issues/4680>).

       • Typing normal characters while the completion pager is active no longer shows the search field. Instead
         it  enters  them  into  the  command  line, and ends paging (#2249 <https://github.com/fish-shell/fish-
         shell/issues/2249>).

       • A new input binding pager-toggle-search toggles the search field in the completions pager on  and  off.
         By default, this is bound to Ctrl-S.

       • Searching  in  the  pager  now  does  a  full  fuzzy search (#5213 <https://github.com/fish-shell/fish-
         shell/issues/5213>).

       • The pager will now show the full command instead of just its last line if the number of completions  is
         large (#4702 <https://github.com/fish-shell/fish-shell/issues/4702>).

       • Abbreviations can be tab-completed (#3233 <https://github.com/fish-shell/fish-shell/issues/3233>).

       • Tildes  in  file  names  are  now  properly  escaped  in  completions  (#2274 <https://github.com/fish-
         shell/fish-shell/issues/2274>).

       • Wrapping completions (from complete --wraps or function --wraps) can now inject arguments. For example,
         complete gco --wraps 'git checkout'  now  works  properly  (#1976  <https://github.com/fish-shell/fish-
         shell/issues/1976>).  The alias function has been updated to respect this behavior.

       • Path  completions  now  support  expansions,  meaning expressions like python ~/<TAB> now provides file
         suggestions just like any other relative or absolute path. (This includes support for other expansions,
         too.)

       • Autosuggestions try to avoid arguments that are already present in the command line.

       • Notifications about crashed processes are now  always  shown,  even  in  command  substitutions  (#4962
         <https://github.com/fish-shell/fish-shell/issues/4962>).

       • The  screen  is no longer reset after a BEL, fixing graphical glitches (#3693 <https://github.com/fish-
         shell/fish-shell/issues/3693>).

       • vi-mode now supports  ‘;’  and  ‘,’  motions.  This  introduces  new  {forward,backward}-jump-till  and
         repeat-jump{,-reverse} bind functions (#5140 <https://github.com/fish-shell/fish-shell/issues/5140>).

       • The *y vi-mode binding now works (#5100 <https://github.com/fish-shell/fish-shell/issues/5100>).

       • True   color   is   now  enabled  in  neovim  by  default  (#2792  <https://github.com/fish-shell/fish-
         shell/issues/2792>).

       • Terminal size variables ($COLUMNS/$LINES) are now updated before fish_prompt is  called,  allowing  the
         prompt to react (#904 <https://github.com/fish-shell/fish-shell/issues/904>).

       • Multi-line  prompts  no  longer  repeat  when  the terminal is resized (#2320 <https://github.com/fish-
         shell/fish-shell/issues/2320>).

       • xclip support has been added to the clipboard integration  (#5020  <https://github.com/fish-shell/fish-
         shell/issues/5020>).

       • The Alt-P keybinding paginates the last command if the command line is empty.

       • $cmd_duration  is  no  longer  reset  when  no  command  is  executed  (#5011 <https://github.com/fish-
         shell/fish-shell/issues/5011>).

       • Deleting a one-character word no longer erases the next word as well  (#4747  <https://github.com/fish-
         shell/fish-shell/issues/4747>).

       • Token  history  search  (Alt-Up)  omits  duplicate  entries (#4795 <https://github.com/fish-shell/fish-
         shell/issues/4795>).

       • The fish_escape_delay_ms timeout, allowing the use of the escape key both on its own and as part  of  a
         control sequence, was applied to all control characters; this has been reduced to just the escape key.

       • Completing  a  function  shows  the  description  properly  (#5206 <https://github.com/fish-shell/fish-
         shell/issues/5206>).

       • commandline can now be used to set the commandline for the next command, restoring a behavior in  3.4.1
         (#8807 <https://github.com/fish-shell/fish-shell/issues/8807>).

       • Added completions for

         • ansible,      including     ansible-galaxy,     ansible-playbook     and     ansible-vault     (#4697
           <https://github.com/fish-shell/fish-shell/issues/4697>)

         • bb-power (#4800 <https://github.com/fish-shell/fish-shell/issues/4800>)

         • bd (#4472 <https://github.com/fish-shell/fish-shell/issues/4472>)

         • bowerclang and clang++ (#4174 <https://github.com/fish-shell/fish-shell/issues/4174>)

         • conda (#4837 <https://github.com/fish-shell/fish-shell/issues/4837>)

         • configure (for autoconf-generated files only)

         • curldoas (#5196 <https://github.com/fish-shell/fish-shell/issues/5196>)

         • ebuild (#4911 <https://github.com/fish-shell/fish-shell/issues/4911>)

         • emaint (#4758 <https://github.com/fish-shell/fish-shell/issues/4758>)

         • eopkg (#4600 <https://github.com/fish-shell/fish-shell/issues/4600>)

         • exercism (#4495 <https://github.com/fish-shell/fish-shell/issues/4495>)

         • hjsonhugo (#4529 <https://github.com/fish-shell/fish-shell/issues/4529>)

         • j (from autojump #4344 <https://github.com/fish-shell/fish-shell/issues/4344>)

         • jbake (#4814 <https://github.com/fish-shell/fish-shell/issues/4814>)

         • jhipster (#4472 <https://github.com/fish-shell/fish-shell/issues/4472>)

         • kittykldloadkldunloadmakensis (#5242 <https://github.com/fish-shell/fish-shell/issues/5242>)

         • mesonmkdocs (#4906 <https://github.com/fish-shell/fish-shell/issues/4906>)

         • ngrok (#4642 <https://github.com/fish-shell/fish-shell/issues/4642>)

         • OpenBSD’s   pkg_add,   pkg_delete,   pkg_info,   pfctl,   rcctl,   signify,    and    vmctl    (#4584
           <https://github.com/fish-shell/fish-shell/issues/4584>)

         • openocdoptipngopkg (#5168 <https://github.com/fish-shell/fish-shell/issues/5168>)

         • pandoc (#2937 <https://github.com/fish-shell/fish-shell/issues/2937>)

         • port (#4737 <https://github.com/fish-shell/fish-shell/issues/4737>)

         • powerpill (#4800 <https://github.com/fish-shell/fish-shell/issues/4800>)

         • pstack (#5135 <https://github.com/fish-shell/fish-shell/issues/5135>)

         • serve (#5026 <https://github.com/fish-shell/fish-shell/issues/5026>)

         • ttxunzipvirsh (#5113 <https://github.com/fish-shell/fish-shell/issues/5113>)

         • xclip (#5126 <https://github.com/fish-shell/fish-shell/issues/5126>)

         • xsvzfs and zpool (#4608 <https://github.com/fish-shell/fish-shell/issues/4608>)

       • Lots  of  improvements  to  completions  (especially  darcs (#5112 <https://github.com/fish-shell/fish-
         shell/issues/5112>), git, hg and sudo).

       • Completions for yarn and npm now require the all-the-package-names NPM package for full functionality.

       • Completions for bower and yarn now require the jq utility for full functionality.

       • Improved French translations.

   Other fixes and improvements
       • Significant   performance   improvements   to    abbr    (#4048    <https://github.com/fish-shell/fish-
         shell/issues/4048>), setting variables (#4200 <https://github.com/fish-shell/fish-shell/issues/4200>, ‐
         #4341   <https://github.com/fish-shell/fish-shell/issues/4341>),   executing  functions,  globs  (#4579
         <https://github.com/fish-shell/fish-shell/issues/4579>), string  reading  from  standard  input  (#4610
         <https://github.com/fish-shell/fish-shell/issues/4610>),    and   slicing   history   (in   particular,
         $history[1] for the last executed command).

       • Fish’s internal wcwidth function has been updated to deal with newer Unicode, and  the  width  of  some
         characters  can  be configured via the fish_ambiguous_width (#5149 <https://github.com/fish-shell/fish-
         shell/issues/5149>) and fish_emoji_width (#2652 <https://github.com/fish-shell/fish-shell/issues/2652>)
         variables. Alternatively, a new build-time option INTERNAL_WCWIDTH can be  used  to  use  the  system’s
         wcwidth instead (#4816 <https://github.com/fish-shell/fish-shell/issues/4816>).

       • functions  correctly  supports  -d as the short form of --description. (#5105 <https://github.com/fish-
         shell/fish-shell/issues/5105>)

       • /etc/paths   is   now   parsed   like   macOS’   bash   path_helper,   fixing   $PATH   order    (#4336
         <https://github.com/fish-shell/fish-shell/issues/4336>,    #4852   <https://github.com/fish-shell/fish-
         shell/issues/4852>) on macOS.

       • Using a read-only variable in a for loop produces an error, rather than  silently  producing  incorrect
         results (#4342 <https://github.com/fish-shell/fish-shell/issues/4342>).

       • The universal variables filename no longer contains the hostname or MAC address. It is now at the fixed
         location .config/fish/fish_variables (#1912 <https://github.com/fish-shell/fish-shell/issues/1912>).

       • Exported  variables  in  the global or universal scope no longer have their exported status affected by
         local variables (#2611 <https://github.com/fish-shell/fish-shell/issues/2611>).

       • Major rework of terminal and job handling to eliminate bugs (#3805 <https://github.com/fish-shell/fish-
         shell/issues/3805>,      #3952      <https://github.com/fish-shell/fish-shell/issues/3952>,       #4178
         <https://github.com/fish-shell/fish-shell/issues/4178>,    #4235   <https://github.com/fish-shell/fish-
         shell/issues/4235>,      #4238      <https://github.com/fish-shell/fish-shell/issues/4238>,       #4540
         <https://github.com/fish-shell/fish-shell/issues/4540>,    #4929   <https://github.com/fish-shell/fish-
         shell/issues/4929>, #5210 <https://github.com/fish-shell/fish-shell/issues/5210>).

       • Improvements to  the  manual  page  completion  generator  (#2937  <https://github.com/fish-shell/fish-
         shell/issues/2937>, #4313 <https://github.com/fish-shell/fish-shell/issues/4313>).

       • suspend --force now works correctly (#4672 <https://github.com/fish-shell/fish-shell/issues/4672>).

       • Pressing  Ctrl-C  while  running a script now reliably terminates fish (#5253 <https://github.com/fish-
         shell/fish-shell/issues/5253>).

   For distributors and developers
       • fish ships with a new build system based on CMake. CMake 3.2 is the minimum required version.  Although
         the  autotools-based  Makefile  and the Xcode project are still shipped with this release, they will be
         removed in the near future. All distributors and developers are encouraged  to  migrate  to  the  CMake
         build.

       • Build scripts for most platforms no longer require bash, using the standard sh instead.

       • The hostname command is no longer required for fish to operate.

       –

   fish 2.7.1 (released December 23, 2017)
       This release of fish fixes an issue where iTerm 2 on macOS would display a warning about paste bracketing
       being   left   on   when   starting   a  new  fish  session  (#4521  <https://github.com/fish-shell/fish-
       shell/issues/4521>).

       If you are upgrading from version 2.6.0 or before, please also review the release  notes  for  2.7.0  and
       2.7b1 (included below).

       –

   fish 2.7.0 (released November 23, 2017)
       There  are  no  major changes between 2.7b1 and 2.7.0. If you are upgrading from version 2.6.0 or before,
       please also review the release notes for 2.7b1 (included below).

       Xcode builds and macOS packages could not be produced with 2.7b1, but this is fixed in 2.7.0.

       –

   fish 2.7b1 (released October 31, 2017)
   Notable improvements
       • A new cdh (change directory using recent history) command  provides  a  more  friendly  alternative  to
         prevd/nextd and pushd/popd (#2847 <https://github.com/fish-shell/fish-shell/issues/2847>).

       • A  new  argparse command is available to allow fish script to parse arguments with the same behavior as
         builtin commands. This also includes the  fish_opt  helper  command.  (#4190  <https://github.com/fish-
         shell/fish-shell/issues/4190>).

       • Invalid   array   indexes   are   now   silently   ignored  (#826  <https://github.com/fish-shell/fish-
         shell/issues/826>, #4127 <https://github.com/fish-shell/fish-shell/issues/4127>).

       • Improvements  to  the   debugging   facility,   including   a   prompt   specific   to   the   debugger
         (fish_breakpoint_prompt)   and  a  status  is-breakpoint  subcommand  (#1310  <https://github.com/fish-
         shell/fish-shell/issues/1310>).

       • string  supports  new  lower  and  upper  subcommands,  for  altering  the  case  of   strings   (#4080
         <https://github.com/fish-shell/fish-shell/issues/4080>).  The  case  changing is not locale-aware yet.-
         string  escape  has  a  new  --style=xxx  flag  where  xxx  can  be  script,   var,   or   url   (#4150
         <https://github.com/fish-shell/fish-shell/issues/4150>),  and  can  be reversed with string unescape (‐
         #3543 <https://github.com/fish-shell/fish-shell/issues/3543>).

       • History can now be split into sessions with the fish_history variable, or not saved to disk at  all  (‐
         #102 <https://github.com/fish-shell/fish-shell/issues/102>).

       • Read  history  is  now  controlled by the fish_history variable rather than the --mode-name flag (#1504
         <https://github.com/fish-shell/fish-shell/issues/1504>).

       • command now supports an --all flag to report all directories with the command. which  is  no  longer  a
         runtime dependency (#2778 <https://github.com/fish-shell/fish-shell/issues/2778>).

       • fish can run commands before starting an interactive session using the new --init-command/-C options (‐
         #4164 <https://github.com/fish-shell/fish-shell/issues/4164>).

       • set   has   a   new   --show   option   to   show   lots   of   information   about   variables  (#4265
         <https://github.com/fish-shell/fish-shell/issues/4265>).

   Other significant changes
       • The COLUMNS and LINES environment variables are now correctly set the first time fish_prompt is run  (‐
         #4141 <https://github.com/fish-shell/fish-shell/issues/4141>).

       • complete’s   --no-files   option   works   as   intended   (#112   <https://github.com/fish-shell/fish-
         shell/issues/112>).

       • echo -h now correctly echoes -h in line with other shells  (#4120  <https://github.com/fish-shell/fish-
         shell/issues/4120>).

       • The  export  compatibility  function now returns zero on success, rather than always returning 1 (#4435
         <https://github.com/fish-shell/fish-shell/issues/4435>).

       • Stop  converting  empty  elements  in  MANPATH  to  “.”   (#4158   <https://github.com/fish-shell/fish-
         shell/issues/4158>). The behavior being changed was introduced in fish 2.6.0.

       • count   -h   and   count   --help  now  return  1  rather  than  produce  command  help  output  (#4189
         <https://github.com/fish-shell/fish-shell/issues/4189>).

       • An attempt to read which stops because too much data is available still defines the variables given  as
         parameters (#4180 <https://github.com/fish-shell/fish-shell/issues/4180>).

       • A   regression   in   fish  2.4.0  which  prevented  pushd  +1  from  working  has  been  fixed  (#4091
         <https://github.com/fish-shell/fish-shell/issues/4091>).

       • A regression in fish 2.6.0 where multiple read commands in non-interactive scripts were broken has been
         fixed (#4206 <https://github.com/fish-shell/fish-shell/issues/4206>).

       • A regression in fish 2.6.0 involving universal variables with side-effects at startup such  as  set  -U
         fish_escape_delay_ms 10 has been fixed (#4196 <https://github.com/fish-shell/fish-shell/issues/4196>).

       • Added completions for:

         • as (#4130 <https://github.com/fish-shell/fish-shell/issues/4130>)

         • cdh (#2847 <https://github.com/fish-shell/fish-shell/issues/2847>)

         • dhcpd (#4115 <https://github.com/fish-shell/fish-shell/issues/4115>)

         • ezjail-admin (#4324 <https://github.com/fish-shell/fish-shell/issues/4324>)

         • Fabric’s fab (#4153 <https://github.com/fish-shell/fish-shell/issues/4153>)

         • grub-file (#4119 <https://github.com/fish-shell/fish-shell/issues/4119>)

         • grub-install (#4119 <https://github.com/fish-shell/fish-shell/issues/4119>)

         • jest (#4142 <https://github.com/fish-shell/fish-shell/issues/4142>)

         • kdeconnect-climagneto          (#4043         <https://github.com/fish-shell/fish-shell/issues/4043>,         #4108
           <https://github.com/fish-shell/fish-shell/issues/4108>)

         • mdadm (#4198 <https://github.com/fish-shell/fish-shell/issues/4198>)

         • passwd (#4209 <https://github.com/fish-shell/fish-shell/issues/4209>)

         • pip and pipenv (#4448 <https://github.com/fish-shell/fish-shell/issues/4448>)

         • s3cmd (#4332 <https://github.com/fish-shell/fish-shell/issues/4332>)

         • sbt (#4347 <https://github.com/fish-shell/fish-shell/issues/4347>)

         • snap (#4215 <https://github.com/fish-shell/fish-shell/issues/4215>)

         • Sublime Text 3’s subl (#4277 <https://github.com/fish-shell/fish-shell/issues/4277>)

       • Lots of improvements to completions.

       • Updated Chinese and French translations.

       • Improved completions for:

         • aptcd (#4061 <https://github.com/fish-shell/fish-shell/issues/4061>)

         • composer (#4295 <https://github.com/fish-shell/fish-shell/issues/4295>)

         • eopkgflatpak (#4456 <https://github.com/fish-shell/fish-shell/issues/4456>)

         • git (#4117  <https://github.com/fish-shell/fish-shell/issues/4117>,  #4147  <https://github.com/fish-
           shell/fish-shell/issues/4147>,  #4329  <https://github.com/fish-shell/fish-shell/issues/4329>,  #4368
           <https://github.com/fish-shell/fish-shell/issues/4368>)

         • gphoto2killall (#4052 <https://github.com/fish-shell/fish-shell/issues/4052>)

         • lnnpm (#4241 <https://github.com/fish-shell/fish-shell/issues/4241>)

         • ssh (#4377 <https://github.com/fish-shell/fish-shell/issues/4377>)

         • tailxdg-mime (#4333 <https://github.com/fish-shell/fish-shell/issues/4333>)

         • zypper (#4325 <https://github.com/fish-shell/fish-shell/issues/4325>)

   fish 2.6.0 (released June 3, 2017)
       Since the beta release of fish  2.6b1,  fish  version  2.6.0  contains  a  number  of  minor  fixes,  new
       completions  for magneto (#4043 <https://github.com/fish-shell/fish-shell/issues/4043>), and improvements
       to the documentation.

   Known issues
       • Apple macOS Sierra 10.12.5 introduced a problem with launching web browsers from other  programs  using
         AppleScript.  This affects the fish Web configuration (fish_config); users on these platforms will need
         to manually open the address displayed in the terminal, such as  by  copying  and  pasting  it  into  a
         browser. This problem will be fixed with macOS 10.12.6.

       If  you  are  upgrading  from  version  2.5.0  or  before, please also review the release notes for 2.6b1
       (included below).

                                                         ----

   fish 2.6b1 (released May 14, 2017)
   Notable fixes and improvements
       • Jobs running in the background can now be removed from the list of jobs with the  new  disown  builtin,
         which  behaves  like  the  same  command  in  other  shells (#2810 <https://github.com/fish-shell/fish-
         shell/issues/2810>).

       • Command substitutions now have access to the terminal, like in other shells. This allows tools like fzf
         to    work    properly     (#1362     <https://github.com/fish-shell/fish-shell/issues/1362>,     #3922
         <https://github.com/fish-shell/fish-shell/issues/3922>).

       • In  cases  where  the  operating system does not report the size of the terminal, the COLUMNS and LINES
         environment variables are used; if they are unset, a default of 80x24 is assumed.

       • New     French     (#3772      <https://github.com/fish-shell/fish-shell/issues/3772>      &      #3788
         <https://github.com/fish-shell/fish-shell/issues/3788>)       and      improved      German      (#3834
         <https://github.com/fish-shell/fish-shell/issues/3834>) translations.

       • fish no longer depends on the which external command.

   Other significant changes
       • Performance improvements in  launching  processes,  including  major  reductions  in  signal  blocking.
         Although  this  has  been  heavily  tested,  it  may  cause  problems  in  some  circumstances; set the
         FISH_NO_SIGNAL_BLOCK variable to 0 in your fish configuration file to return to the  old  behaviour  (‐
         #2007 <https://github.com/fish-shell/fish-shell/issues/2007>).

       • Performance   improvements   in   prompts   and   functions   that   set   lots   of   colours   (#3793
         <https://github.com/fish-shell/fish-shell/issues/3793>).

       • The Delete key no longer deletes backwards (a regression in 2.5.0).

       • functions supports a new --details option, which identifies where the function was loaded  from  (#3295
         <https://github.com/fish-shell/fish-shell/issues/3295>),   and   a  --details  --verbose  option  which
         includes the function description (#597 <https://github.com/fish-shell/fish-shell/issues/597>).

       • read will read up to 10 MiB by default, leaving the target variable empty and exiting with  status  122
         if the line is too long.  You can set a different limit with the FISH_READ_BYTE_LIMIT variable.

       • read  supports  a  new  --silent  option  to  hide the characters typed (#838 <https://github.com/fish-
         shell/fish-shell/issues/838>), for when reading sensitive  data  from  the  terminal.   read  also  now
         accepts simple strings for the prompt (rather than scripts) with the new -P and --prompt-str options (‐
         #802 <https://github.com/fish-shell/fish-shell/issues/802>).

       • export and setenv now understand colon-separated PATH, CDPATH and MANPATH variables.

       • setenv  is  no longer a simple alias for set -gx and will complain, just like the csh version, if given
         more than one value (#4103 <https://github.com/fish-shell/fish-shell/issues/4103>).

       • bind supports a new --list-modes option (#3872 <https://github.com/fish-shell/fish-shell/issues/3872>).

       • bg will check all of its arguments before backgrounding any jobs; any invalid arguments  will  cause  a
         failure,  but  non-existent  (eg  recently  exited)  jobs  are ignored (#3909 <https://github.com/fish-
         shell/fish-shell/issues/3909>).

       • funced warns if the function being  edited  has  not  been  modified  (#3961  <https://github.com/fish-
         shell/fish-shell/issues/3961>).

       • printf   correctly   outputs   “long   long”   integers   (#3352   <https://github.com/fish-shell/fish-
         shell/issues/3352>).

       • status  supports  a  new  current-function  subcommand  to  print  the  current  function  name  (#1743
         <https://github.com/fish-shell/fish-shell/issues/1743>).

       • string supports a new repeat subcommand (#3864 <https://github.com/fish-shell/fish-shell/issues/3864>).
         string  match  supports  a  new  --entire  option  to  emit the entire line matched by a pattern (#3957
         <https://github.com/fish-shell/fish-shell/issues/3957>). string replace supports a new --filter  option
         to   only   emit  lines  which  underwent  a  replacement  (#3348  <https://github.com/fish-shell/fish-
         shell/issues/3348>).

       • test supports the  -k  option  to  test  for  sticky  bits  (#733  <https://github.com/fish-shell/fish-
         shell/issues/733>).

       • umask understands symbolic modes (#738 <https://github.com/fish-shell/fish-shell/issues/738>).

       • Empty  components  in  the  CDPATH,  MANPATH  and  PATH  variables  are  now  converted  to  “.” (#2106
         <https://github.com/fish-shell/fish-shell/issues/2106>,   #3914    <https://github.com/fish-shell/fish-
         shell/issues/3914>).

       • New  versions  of  ncurses (6.0 and up) wipe terminal scrollback buffers with certain commands; the C-l
         binding tries to avoid this (#2855 <https://github.com/fish-shell/fish-shell/issues/2855>).

       • Some systems’ su implementations do not set the USER environment variable; it is  now  reset  for  root
         users (#3916 <https://github.com/fish-shell/fish-shell/issues/3916>).

       • Under  terminals  which  support  it,  bracketed  paste is enabled, escaping problematic characters for
         security and convience (#3871 <https://github.com/fish-shell/fish-shell/issues/3871>).   Inside  single
         quotes  ('),  single  quotes and backslashes in pasted text are escaped (#967 <https://github.com/fish-
         shell/fish-shell/issues/967>). The fish_clipboard_paste function (bound to C-v by default) is still the
         recommended pasting method where possible as it includes this functionality and more.

       • Processes in pipelines are no longer signalled as soon as one command in the pipeline has completed  (‐
         #1926  <https://github.com/fish-shell/fish-shell/issues/1926>). This behaviour matches other shells mre
         closely.

       • All  functions  requiring  Python  work  with  whichever  version  of  Python   is   installed   (#3970
         <https://github.com/fish-shell/fish-shell/issues/3970>).  Python 3 is preferred, but Python 2.6 remains
         the minimum version required.

       • The color of the cancellation character can be controlled  by  the  fish_color_cancel  variable  (#3963
         <https://github.com/fish-shell/fish-shell/issues/3963>).

       • Added completions for:

       • caddy (#4008 <https://github.com/fish-shell/fish-shell/issues/4008>)

       • castnow (#3744 <https://github.com/fish-shell/fish-shell/issues/3744>)

       • climate (#3760 <https://github.com/fish-shell/fish-shell/issues/3760>)

       • flatpakgradle (#3859 <https://github.com/fish-shell/fish-shell/issues/3859>)

       • gsettings (#4001 <https://github.com/fish-shell/fish-shell/issues/4001>)

       • helm (#3829 <https://github.com/fish-shell/fish-shell/issues/3829>)

       • i3-msg (#3787 <https://github.com/fish-shell/fish-shell/issues/3787>)

       • ipset (#3924 <https://github.com/fish-shell/fish-shell/issues/3924>)

       • jq (#3804 <https://github.com/fish-shell/fish-shell/issues/3804>)

       • light (#3752 <https://github.com/fish-shell/fish-shell/issues/3752>)

       • minikube (#3778 <https://github.com/fish-shell/fish-shell/issues/3778>)

       • mocha (#3828 <https://github.com/fish-shell/fish-shell/issues/3828>)

       • mkdosfs (#4017 <https://github.com/fish-shell/fish-shell/issues/4017>)

       • pv (#3773 <https://github.com/fish-shell/fish-shell/issues/3773>)

       • setsid (#3791 <https://github.com/fish-shell/fish-shell/issues/3791>)

       • terraform (#3960 <https://github.com/fish-shell/fish-shell/issues/3960>)

       • usermod (#3775 <https://github.com/fish-shell/fish-shell/issues/3775>)

       • xinputyarn (#3816 <https://github.com/fish-shell/fish-shell/issues/3816>)

       • Improved completions for adb (#3853 <https://github.com/fish-shell/fish-shell/issues/3853>), apt (#3771
         <https://github.com/fish-shell/fish-shell/issues/3771>),     bzr    (#3769    <https://github.com/fish-
         shell/fish-shell/issues/3769>),  dconf,  git  (including   #3743   <https://github.com/fish-shell/fish-
         shell/issues/3743>),  grep  (#3789  <https://github.com/fish-shell/fish-shell/issues/3789>),  go (#3789
         <https://github.com/fish-shell/fish-shell/issues/3789>),    help    (#3789    <https://github.com/fish-
         shell/fish-shell/issues/3789>), hg (#3975 <https://github.com/fish-shell/fish-shell/issues/3975>), htop
         (#3789          <https://github.com/fish-shell/fish-shell/issues/3789>),         killall         (#3996
         <https://github.com/fish-shell/fish-shell/issues/3996>),  lua,  man  (#3762   <https://github.com/fish-
         shell/fish-shell/issues/3762>), mount (#3764 <https://github.com/fish-shell/fish-shell/issues/3764> & ‐
         #3841  <https://github.com/fish-shell/fish-shell/issues/3841>),  obnam (#3924 <https://github.com/fish-
         shell/fish-shell/issues/3924>),  perl  (#3856  <https://github.com/fish-shell/fish-shell/issues/3856>),
         portmaster     (#3950     <https://github.com/fish-shell/fish-shell/issues/3950>),     python    (#3840
         <https://github.com/fish-shell/fish-shell/issues/3840>),    ssh    (#3781     <https://github.com/fish-
         shell/fish-shell/issues/3781>),   scp  (#3781  <https://github.com/fish-shell/fish-shell/issues/3781>),
         systemctl   (#3757   <https://github.com/fish-shell/fish-shell/issues/3757>)    and    udisks    (#3764
         <https://github.com/fish-shell/fish-shell/issues/3764>).

                                                         ----

   fish 2.5.0 (released February 3, 2017)
       There  are  no  major changes between 2.5b1 and 2.5.0. If you are upgrading from version 2.4.0 or before,
       please also review the release notes for 2.5b1 (included below).

   Notable fixes and improvements
       • The Home, End, Insert, Delete, Page Up and  Page  Down  keys  work  in  Vi-style  key  bindings  (#3731
         <https://github.com/fish-shell/fish-shell/issues/3731>).

                                                         ----

   fish 2.5b1 (released January 14, 2017)
   Platform Changes
       Starting  with  version  2.5,  fish  requires  a more up-to-date version of C++, specifically C++11 (from
       2011). This affects some older platforms:

   Linux
       For users building from source, GCC’s g++ 4.8 or later, or LLVM’s clang 3.3 or later, are known to  work.
       Older platforms may require a newer compiler installed.

       Unfortunately, because of the complexity of the toolchain, binary packages are no longer published by the
       fish-shell developers for the following platforms:

       • Red Hat Enterprise Linux and CentOS 5 & 6 for 64-bit builds

       • Ubuntu 12.04 (EoLTS April 2017)

       • Debian 7 (EoLTS May 2018)

       Installing newer version of fish on these systems will require building from source.

   OS X SnowLeopard
       Starting  with  version 2.5, fish requires a C++11 standard library on OS X 10.6 (“SnowLeopard”). If this
       library is not installed, you will see this error: dyld: Library not loaded: /usr/lib/libc++.1.dylib

       MacPorts is the easiest way to obtain this library. After installing  the  SnowLeopard  MacPorts  release
       from the install page, run:

          sudo port -v install libcxx

       Now fish should launch successfully. (Please open an issue if it does not.)

       This is only necessary on 10.6. OS X 10.7 and later include the required library by default.

   Other significant changes
       • Attempting  to  exit  with running processes in the background produces a warning, then signals them to
         terminate if a second attempt to exit is  made.  This  brings  the  behaviour  for  running  background
         processes    into    line   with   stopped   processes.   (#3497   <https://github.com/fish-shell/fish-
         shell/issues/3497>)

       • random can now have start, stop and step values specified, or the new choice subcommand can be used  to
         pick an argument from a list (#3619 <https://github.com/fish-shell/fish-shell/issues/3619>).

       • A  new  key  bindings  preset,  fish_hybrid_key_bindings,  including  all  the Emacs-style and Vi-style
         bindings, which behaves  like  fish_vi_key_bindings  in  fish  2.3.0  (#3556  <https://github.com/fish-
         shell/fish-shell/issues/3556>).

       • function  now  returns  an  error  when  called with invalid options, rather than defining the function
         anyway (#3574 <https://github.com/fish-shell/fish-shell/issues/3574>). This was a regression present in
         fish 2.3 and 2.4.0.

       • fish no longer prints a warning when it identifies a running instance of  an  old  version  (2.1.0  and
         earlier). Changes to universal variables may not propagate between these old versions and 2.5b1.

       • Improved  compatiblity  with  Android  (#3585  <https://github.com/fish-shell/fish-shell/issues/3585>),
         MSYS/mingw   (#2360   <https://github.com/fish-shell/fish-shell/issues/2360>),   and   Solaris   (#3456
         <https://github.com/fish-shell/fish-shell/issues/3456>,    #3340   <https://github.com/fish-shell/fish-
         shell/issues/3340>).

       • Like other shells, the test builting now returns an error for numeric operations on invalid integers (‐
         #3346    <https://github.com/fish-shell/fish-shell/issues/3346>,    #3581     <https://github.com/fish-
         shell/fish-shell/issues/3581>).

       • complete  no  longer  recognises  --authoritative and --unauthoritative options, and they are marked as
         obsolete.

       • status accepts subcommands, and should be used like status is-interactive. The old options continue  to
         be supported for the foreseeable future (#3526 <https://github.com/fish-shell/fish-shell/issues/3526>),
         although only one subcommand or option can be specified at a time.

       • Selection  mode  (used  with  “begin-selection”) no longer selects a character the cursor does not move
         over (#3684 <https://github.com/fish-shell/fish-shell/issues/3684>).

       • List indexes are handled better, and a bit more liberally in some cases (echo  $PATH[1  ..  3]  is  now
         valid) (#3579 <https://github.com/fish-shell/fish-shell/issues/3579>).

       • The  fish_mode_prompt  function  is now simply a stub around fish_default_mode_prompt, which allows the
         mode prompt to be included more easily in customised prompt functions (#3641  <https://github.com/fish-
         shell/fish-shell/issues/3641>).

   Notable fixes and improvementsalias,  run  without  options  or  arguments,  lists  all  defined  aliases,  and aliases now include a
         description in the function signature that identifies them.

       • complete  accepts   empty   strings   as   descriptions   (#3557   <https://github.com/fish-shell/fish-
         shell/issues/3557>).

       • command  accepts  -q/--quiet  in  combination with --search (#3591 <https://github.com/fish-shell/fish-
         shell/issues/3591>), providing a simple way of checking whether a command exists in scripts.

       • Abbreviations can now be renamed with abbr --rename OLD_KEY  NEW_KEY  (#3610  <https://github.com/fish-
         shell/fish-shell/issues/3610>).

       • The  command  synopses  printed  by  --help  options  work  better  with  copying  and  pasting  (#2673
         <https://github.com/fish-shell/fish-shell/issues/2673>).

       • help  launches  the  browser  specified  by  the  $fish_help_browser  variable  if  it  is  set  (#3131
         <https://github.com/fish-shell/fish-shell/issues/3131>).

       • History   merging   could   lose   items   under   certain   circumstances  and  is  now  fixed  (#3496
         <https://github.com/fish-shell/fish-shell/issues/3496>).

       • The $status variable is now set  to  123  when  a  syntactically  invalid  command  is  entered  (#3616
         <https://github.com/fish-shell/fish-shell/issues/3616>).

       • Exiting  fish  now  signals  all  background  processes  to  terminate,  not  just  stopped jobs (#3497
         <https://github.com/fish-shell/fish-shell/issues/3497>).

       • A  new  prompt_hostname  function  which  prints  a  hostname  suitable  for  use  in  prompts   (#3482
         <https://github.com/fish-shell/fish-shell/issues/3482>).

       • The  __fish_man_page  function (bound to Alt-h by default) now tries to recognize subcommands (e.g. git
         add       will        now        open        the        “git-add”        man        page)        (#3678
         <https://github.com/fish-shell/fish-shell/issues/3678>).

       • A new function edit_command_buffer (bound to Alt-e & Alt-v by default) to edit the command buffer in an
         external      editor      (#1215      <https://github.com/fish-shell/fish-shell/issues/1215>,     #3627
         <https://github.com/fish-shell/fish-shell/issues/3627>).

       • set_color  now  supports  italics  (--italics),  dim  (--dim)  and  reverse  (--reverse)  modes  (#3650
         <https://github.com/fish-shell/fish-shell/issues/3650>).

       • Filesystems  with very slow locking (eg incorrectly-configured NFS) will no longer slow fish down (#685
         <https://github.com/fish-shell/fish-shell/issues/685>).

       • Improved completions for apt (#3695 <https://github.com/fish-shell/fish-shell/issues/3695>), fusermount
         (#3642 <https://github.com/fish-shell/fish-shell/issues/3642>), make  (#3628  <https://github.com/fish-
         shell/fish-shell/issues/3628>),       netctl-auto      (#3378      <https://github.com/fish-shell/fish-
         shell/issues/3378>), nmcli (#3648  <https://github.com/fish-shell/fish-shell/issues/3648>),  pygmentize
         (#3378        <https://github.com/fish-shell/fish-shell/issues/3378>),       and       tar       (#3719
         <https://github.com/fish-shell/fish-shell/issues/3719>).

       • Added completions for:

       • VBoxHeadless (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

       • VBoxSDL (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

       • base64 (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

       • caffeinate (#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

       • dconf (#3638 <https://github.com/fish-shell/fish-shell/issues/3638>)

       • dig (#3495 <https://github.com/fish-shell/fish-shell/issues/3495>)

       • dpkg-reconfigure     (#3521     <https://github.com/fish-shell/fish-shell/issues/3521>     &      #3522
         <https://github.com/fish-shell/fish-shell/issues/3522>)

       • feh (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

       • launchctl (#3682 <https://github.com/fish-shell/fish-shell/issues/3682>)

       • lxc  (#3554  <https://github.com/fish-shell/fish-shell/issues/3554>  &  #3564 <https://github.com/fish-
         shell/fish-shell/issues/3564>),

       • mddiagnose (#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

       • mdfind (#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

       • mdimport (#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

       • mdls (#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

       • mdutil (#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

       • mkvextract (#3492 <https://github.com/fish-shell/fish-shell/issues/3492>)

       • nvram (#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

       • objdump (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

       • sysbench (#3491 <https://github.com/fish-shell/fish-shell/issues/3491>)

       • tmutil (#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

                                                         ----

   fish 2.4.0 (released November 8, 2016)
       There are no major changes between 2.4b1 and 2.4.0.

   Notable fixes and improvements
       • The documentation is now generated properly and with the correct version identifier.

       • Automatic cursor changes are now only enabled on the subset of XTerm versions known  to  support  them,
         resolving  a problem where older versions printed garbage to the terminal before and after every prompt
         (#3499 <https://github.com/fish-shell/fish-shell/issues/3499>).

       • Improved the title set in Apple Terminal.app.

       • Added completions for defaults and improved completions for diskutil  (#3478  <https://github.com/fish-
         shell/fish-shell/issues/3478>).

                                                         ----

   fish 2.4b1 (released October 18, 2016)
   Significant changes
       • The  clipboard  integration  has been revamped with explicit bindings.  The killring commands no longer
         copy from, or paste to, the X11 clipboard - use the new copy (C-x) and paste  (C-v)  bindings  instead.
         The  clipboard  is  now  available  on  OS  X  as  well  as  systems  using  X11  (e.g. Linux).  (#3061
         <https://github.com/fish-shell/fish-shell/issues/3061>)

       • history uses subcommands (history delete) rather than options (history --delete) for its actions (#3367
         <https://github.com/fish-shell/fish-shell/issues/3367>). You can no longer specify multiple actions via
         flags (e.g., history --delete --save something).

       • New history options have been added,  including  --max=n  to  limit  the  number  of  history  entries,
         --show-time  option to show timestamps (#3175 <https://github.com/fish-shell/fish-shell/issues/3175>, ‐
         #3244 <https://github.com/fish-shell/fish-shell/issues/3244>), and --null  to  null  terminate  history
         entries in the search output.

       • history  search  is  now  case-insensitive  by  default  (which  also  affects  history  delete) (#3236
         <https://github.com/fish-shell/fish-shell/issues/3236>).

       • history delete now  correctly  handles  multiline  commands  (#31  <https://github.com/fish-shell/fish-
         shell/issues/31>).

       • Vi-style  bindings  no longer include all of the default emacs-style bindings; instead, they share some
         definitions (#3068 <https://github.com/fish-shell/fish-shell/issues/3068>).

       • If there is no locale set in the environment, various known system configuration files will be  checked
         for  a  default.  If  no  locale can be found, en_US-UTF.8 will be used (#277 <https://github.com/fish-
         shell/fish-shell/issues/277>).

       • A  number  followed  by  a  caret  (e.g. 5^)  is  no   longer   treated   as   a   redirection   (#1873
         <https://github.com/fish-shell/fish-shell/issues/1873>).

       • The  $version  special  variable  can  be  overwritten,  so  that  it can be used for other purposes if
         required.

   Notable fixes and improvements
       • The fish_realpath builtin has been renamed to realpath and made compatible with GNU realpath  when  run
         without  arguments  (#3400 <https://github.com/fish-shell/fish-shell/issues/3400>). It is used only for
         systems  without  a  realpath  or   grealpath   utility   (#3374   <https://github.com/fish-shell/fish-
         shell/issues/3374>).

       • Improved  color  handling  on terminals/consoles with 8-16 colors, particularly the use of bright named
         color (#3176  <https://github.com/fish-shell/fish-shell/issues/3176>,  #3260  <https://github.com/fish-
         shell/fish-shell/issues/3260>).

       • fish_indent  can  now  read  from  files  given  as  arguments,  rather than just standard input (#3037
         <https://github.com/fish-shell/fish-shell/issues/3037>).

       • Fuzzy tab completions behave in a less surprising  manner  (#3090  <https://github.com/fish-shell/fish-
         shell/issues/3090>, #3211 <https://github.com/fish-shell/fish-shell/issues/3211>).

       • jobs   should   only   print   its   header   line   once  (#3127  <https://github.com/fish-shell/fish-
         shell/issues/3127>).

       • Wildcards in redirections are  highlighted  appropriately  (#2789  <https://github.com/fish-shell/fish-
         shell/issues/2789>).

       • Suggestions will be offered more often, like after removing characters (#3069 <https://github.com/fish-
         shell/fish-shell/issues/3069>).

       • history --merge now correctly interleaves items in chronological order (#2312 <https://github.com/fish-
         shell/fish-shell/issues/2312>).

       • Options  for  fish_indent  have  been  aligned  with  the  other binaries - in particular, -d now means
         --debug. The --dump option has  been  renamed  to  --dump-parse-tree  (#3191  <https://github.com/fish-
         shell/fish-shell/issues/3191>).

       • The   display   of   bindings   in  the  Web-based  configuration  has  been  greatly  improved  (#3325
         <https://github.com/fish-shell/fish-shell/issues/3325>),  as  has  the  rendering  of  prompts   (#2924
         <https://github.com/fish-shell/fish-shell/issues/2924>).

       • fish  should  no longer hang using 100% CPU in the C locale (#3214 <https://github.com/fish-shell/fish-
         shell/issues/3214>).

       • A bug in FreeBSD 11 & 12, Dragonfly BSD & illumos  prevented  fish  from  working  correctly  on  these
         platforms  under  UTF-8  locales;  fish now avoids the buggy behaviour (#3050 <https://github.com/fish-
         shell/fish-shell/issues/3050>).

       • Prompts which show git repository information (via __fish_git_prompt) are faster in large  repositories
         (#3294    <https://github.com/fish-shell/fish-shell/issues/3294>)    and    slow   filesystems   (#3083
         <https://github.com/fish-shell/fish-shell/issues/3083>).

       • fish 2.3.0 reintroduced a problem where the greeting was printed even when using read;  this  has  been
         corrected again (#3261 <https://github.com/fish-shell/fish-shell/issues/3261>).

       • Vi  mode  changes  the cursor depending on the current mode (#3215 <https://github.com/fish-shell/fish-
         shell/issues/3215>).

       • Command  lines  with  escaped   space   characters   at   the   end   tab-complete   correctly   (#2447
         <https://github.com/fish-shell/fish-shell/issues/2447>).

       • Added completions for:

         • arcanist (#3256 <https://github.com/fish-shell/fish-shell/issues/3256>)

         • connmanctl (#3419 <https://github.com/fish-shell/fish-shell/issues/3419>)

         • figlet (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

         • mdbook (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

         • ninja (#3415 <https://github.com/fish-shell/fish-shell/issues/3415>)

         • p4, the Perforce client (#3314 <https://github.com/fish-shell/fish-shell/issues/3314>)

         • pygmentize (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

         • ranger (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

       • Improved  completions  for aura (#3297 <https://github.com/fish-shell/fish-shell/issues/3297>), abbr (‐
         #3267 <https://github.com/fish-shell/fish-shell/issues/3267>),  brew  (#3309  <https://github.com/fish-
         shell/fish-shell/issues/3309>),  chown (#3380 <https://github.com/fish-shell/fish-shell/issues/3380>, ‐
         #3383 <https://github.com/fish-shell/fish-shell/issues/3383>),cygport (#3392  <https://github.com/fish-
         shell/fish-shell/issues/3392>),  git  (#3274  <https://github.com/fish-shell/fish-shell/issues/3274>, ‐
         #3226    <https://github.com/fish-shell/fish-shell/issues/3226>,    #3225     <https://github.com/fish-
         shell/fish-shell/issues/3225>,   #3094   <https://github.com/fish-shell/fish-shell/issues/3094>,  #3087
         <https://github.com/fish-shell/fish-shell/issues/3087>,   #3035    <https://github.com/fish-shell/fish-
         shell/issues/3035>,       #3021      <https://github.com/fish-shell/fish-shell/issues/3021>,      #2982
         <https://github.com/fish-shell/fish-shell/issues/2982>,   #3230    <https://github.com/fish-shell/fish-
         shell/issues/3230>),   kill  &  pkill  (#3200  <https://github.com/fish-shell/fish-shell/issues/3200>),
         screen      (#3271      <https://github.com/fish-shell/fish-shell/issues/3271>),      wget       (#3470
         <https://github.com/fish-shell/fish-shell/issues/3470>),   and   xz   (#3378  <https://github.com/fish-
         shell/fish-shell/issues/3378>).

       • Distributors, packagers and developers will notice that the build process produces more succinct output
         by  default;  use  make  V=1  to  get  verbose   output   (#3248   <https://github.com/fish-shell/fish-
         shell/issues/3248>).

       • Improved  compatibility with minor platforms including musl (#2988 <https://github.com/fish-shell/fish-
         shell/issues/2988>), Cygwin (#2993 <https://github.com/fish-shell/fish-shell/issues/2993>), Android  (‐
         #3441     <https://github.com/fish-shell/fish-shell/issues/3441>,    #3442    <https://github.com/fish-
         shell/fish-shell/issues/3442>),  Haiku  (#3322  <https://github.com/fish-shell/fish-shell/issues/3322>)
         and Solaris .

                                                         ----

   fish 2.3.1 (released July 3, 2016)
       This  is  a functionality and bugfix release. This release does not contain all the changes to fish since
       the last release, but fixes a number of issues directly affecting users at present and includes  a  small
       number of new features.

   Significant changes
       • A  new  fish_key_reader  binary  for  decoding  interactive keypresses (#2991 <https://github.com/fish-
         shell/fish-shell/issues/2991>).

       • fish_mode_prompt has been updated to reflect the changes in the way the Vi input mode is set up  (#3067
         <https://github.com/fish-shell/fish-shell/issues/3067>), making this more reliable.

       • fish_config  can  now  properly  be  launched from the OS X app bundle (#3140 <https://github.com/fish-
         shell/fish-shell/issues/3140>).

   Notable fixes and improvements
       • Extra lines were sometimes inserted into  the  output  under  Windows  (Cygwin  and  Microsoft  Windows
         Subsystem  for  Linux)  due  to  TTY  timestamps  not  being  updated  (#2859 <https://github.com/fish-
         shell/fish-shell/issues/2859>).

       • The string builtin’s match mode now handles the combination of -rnv (match, invert and count) correctly
         (#3098 <https://github.com/fish-shell/fish-shell/issues/3098>).

       • Improvements  to   TTY   special   character   handling   (#3064   <https://github.com/fish-shell/fish-
         shell/issues/3064>), locale handling (#3124 <https://github.com/fish-shell/fish-shell/issues/3124>) and
         terminal environment variable handling (#3060 <https://github.com/fish-shell/fish-shell/issues/3060>).

       • Work  towards  handling  the terminal modes for external commands launched from initialisation files (‐
         #2980 <https://github.com/fish-shell/fish-shell/issues/2980>).

       • Ease the upgrade path from fish 2.2.0 and before by warning users to restart fish if the string builtin
         is not available (#3057 <https://github.com/fish-shell/fish-shell/issues/3057>).

       • type -a now syntax-colorizes function source output.

       • Added completions for alsamixer, godoc, gofmt, goimports, gorename, lscpu, mkdir, modinfo, netctl-auto,
         poweroff, termite, udisksctl and xz (#3123 <https://github.com/fish-shell/fish-shell/issues/3123>).

       • Improved completions for apt (#3097  <https://github.com/fish-shell/fish-shell/issues/3097>),  aura  (‐
         #3102   <https://github.com/fish-shell/fish-shell/issues/3102>),git   (#3114  <https://github.com/fish-
         shell/fish-shell/issues/3114>),  npm  (#3158   <https://github.com/fish-shell/fish-shell/issues/3158>),
         string and suspend (#3154 <https://github.com/fish-shell/fish-shell/issues/3154>).

                                                         ----

   fish 2.3.0 (released May 20, 2016)
       There are no significant changes between 2.3.0 and 2.3b2.

   Other notable fixes and improvementsabbr now allows non-letter keys (#2996 <https://github.com/fish-shell/fish-shell/issues/2996>).

       • Define        a        few        extra        colours        on        first        start       (#2987
         <https://github.com/fish-shell/fish-shell/issues/2987>).

       • Multiple documentation updates.

       • Added completions for rmmod (#3007 <https://github.com/fish-shell/fish-shell/issues/3007>).

       • Improved completions for git (#2998 <https://github.com/fish-shell/fish-shell/issues/2998>).

   Known issues
       • Interactive commands started from fish configuration files or from the -c  option  may,  under  certain
         circumstances,  be  started  with  incorrect  terminal  modes  and fail to behave as expected. A fix is
         planned but requires further testing (#2619 <https://github.com/fish-shell/fish-shell/issues/2619>).

                                                         ----

   fish 2.3b2 (released May 5, 2016)
   Significant changes
       • A new fish_realpath builtin and associated function  to  allow  the  use  of  realpath  even  on  those
         platforms   that   don’t   ship  an  appropriate  command  (#2932  <https://github.com/fish-shell/fish-
         shell/issues/2932>).

       • Alt-# toggles the current command line between commented and uncommented states, making it easy to save
         a command in history without executing it.

       • The fish_vi_mode function is now deprecated in favour of fish_vi_key_bindings.

   Other notable fixes and improvements
       • Fix the build  on  Cygwin  (#2952  <https://github.com/fish-shell/fish-shell/issues/2952>)  and  RedHat
         Enterprise Linux/CentOS 5 (#2955 <https://github.com/fish-shell/fish-shell/issues/2955>).

       • Avoid   confusing   the  terminal  line  driver  with  non-printing  characters  in  fish_title  (#2453
         <https://github.com/fish-shell/fish-shell/issues/2453>).

       • Improved completions for busctl, git (#2585  <https://github.com/fish-shell/fish-shell/issues/2585>,  ‐
         #2879     <https://github.com/fish-shell/fish-shell/issues/2879>,    #2984    <https://github.com/fish-
         shell/fish-shell/issues/2984>), and netctl.

                                                         ----

   fish 2.3b1 (released April 19, 2016)
   Significant Changes
       • A new string builtin to handle… strings! This builtin will measure,  split,  search  and  replace  text
         strings,  including  using  regular  expressions.  It can also be used to turn lists into plain strings
         using join. string can be used in place of sed, grep, tr, cut,  and  awk  in  many  situations.  (#2296
         <https://github.com/fish-shell/fish-shell/issues/2296>)

       • Allow  using  escape  as  the Meta modifier key, by waiting after seeing an escape character wait up to
         300ms for an additional character.  This is consistent with readline (e.g. bash) and can be  configured
         via  the  fish_escape_delay_ms  variable.  This  allows  using  escape  as  the  Meta  modifier. (#1356
         <https://github.com/fish-shell/fish-shell/issues/1356>)

       • Add new directories for vendor functions and configuration  snippets  (#2500  <https://github.com/fish-
         shell/fish-shell/issues/2500>)

       • A new fish_realpath builtin and associated realpath function should allow scripts to resolve path names
         via  realpath  regardless  of  whether  there  is  an  external  command of that name; albeit with some
         limitations. See the associated documentation.

   Backward-incompatible changes
       • Unmatched  globs  will  now  cause  an  error,  except  when  used  with  for,  set  or  count   (#2719
         <https://github.com/fish-shell/fish-shell/issues/2719>)

       • and and or will now bind to the closest if or while, allowing compound conditions without begin and end
         (#1428 <https://github.com/fish-shell/fish-shell/issues/1428>)

       • set  -ql  now  searches  up to function scope for variables (#2502 <https://github.com/fish-shell/fish-
         shell/issues/2502>)

       • status  -f  will  now  behave  the  same  when  run  as  the  main  script  or  using   source   (#2643
         <https://github.com/fish-shell/fish-shell/issues/2643>)

       • source  no longer puts the file name in $argv if no arguments are given (#139 <https://github.com/fish-
         shell/fish-shell/issues/139>)

       • History files are stored under  the  XDG_DATA_HOME  hierarchy  (by  default,  in  ~/.local/share),  and
         existing        history        will        be        moved        on        first       use       (#744
         <https://github.com/fish-shell/fish-shell/issues/744>)

   Other notable fixes and improvements
       • Fish  no  longer   silences   errors   in   config.fish   (#2702   <https://github.com/fish-shell/fish-
         shell/issues/2702>)

       • Directory  autosuggestions  will now descend as far as possible if there is only one child directory (‐
         #2531 <https://github.com/fish-shell/fish-shell/issues/2531>)

       • Add support for bright colors (#1464 <https://github.com/fish-shell/fish-shell/issues/1464>)

       • Allow Ctrl-J (\cj) to be bound separately from Ctrl-M (\cm) (#217  <https://github.com/fish-shell/fish-
         shell/issues/217>)

       • psub now has a “-s”/“–suffix” option to name the temporary file with that suffix

       • Enable 24-bit colors on select terminals (#2495 <https://github.com/fish-shell/fish-shell/issues/2495>)

       • Support for SVN status in the prompt (#2582 <https://github.com/fish-shell/fish-shell/issues/2582>)

       • Mercurial  and SVN support have been added to the Classic + Git (now Classic + VCS) prompt (via the new
         __fish_vcs_prompt function) (#2592 <https://github.com/fish-shell/fish-shell/issues/2592>)

       • export now handles variables with  a  “=”  in  the  value  (#2403  <https://github.com/fish-shell/fish-
         shell/issues/2403>)

       • New completions for:

         • alsactl

         • Archlinux’s asp, makepkg

         • Atom’s apm (#2390 <https://github.com/fish-shell/fish-shell/issues/2390>)

         • entr - the “Event Notify Test Runner” (#2265 <https://github.com/fish-shell/fish-shell/issues/2265>)

         • Fedora’s dnf (#2638 <https://github.com/fish-shell/fish-shell/issues/2638>)

         • OSX diskutil (#2738 <https://github.com/fish-shell/fish-shell/issues/2738>)

         • pkgng (#2395 <https://github.com/fish-shell/fish-shell/issues/2395>)

         • pulseaudio’s pacmd and pactl

         • rust’s rustc and cargo (#2409 <https://github.com/fish-shell/fish-shell/issues/2409>)

         • sysctl (#2214 <https://github.com/fish-shell/fish-shell/issues/2214>)

         • systemd’s  machinectl  (#2158  <https://github.com/fish-shell/fish-shell/issues/2158>), busctl (#2144
           <https://github.com/fish-shell/fish-shell/issues/2144>), systemd-nspawn, systemd-analyze,  localectl,
           timedatectl

         • and more

       • Fish   no   longer   has   a   function   called  sgrep,  freeing  it  for  user  customization  (#2245
         <https://github.com/fish-shell/fish-shell/issues/2245>)

       • A rewrite of the completions for cd, fixing  a  few  bugs  (#2299  <https://github.com/fish-shell/fish-
         shell/issues/2299>,       #2300       <https://github.com/fish-shell/fish-shell/issues/2300>,      #562
         <https://github.com/fish-shell/fish-shell/issues/562>)

       • Linux VTs now run in a simplified mode  to  avoid  issues  (#2311  <https://github.com/fish-shell/fish-
         shell/issues/2311>)

       • The vi-bindings now inherit from the emacs bindings

       • Fish will also execute fish_user_key_bindings when in vi-mode

       • funced will now also check $VISUAL (#2268 <https://github.com/fish-shell/fish-shell/issues/2268>)

       • A new suspend function (#2269 <https://github.com/fish-shell/fish-shell/issues/2269>)

       • Subcommand  completion  now  works  better  with split /usr (#2141 <https://github.com/fish-shell/fish-
         shell/issues/2141>)

       • The   command-not-found-handler   can   now   be   overridden   by   defining   a    function    called
         __fish_command_not_found_handler    in    config.fish    (#2332    <https://github.com/fish-shell/fish-
         shell/issues/2332>)

       • A few fixes to the Sorin theme

       • PWD shortening in the prompt can now be configured via the fish_prompt_pwd_dir_length variable, set  to
         the length per path component (#2473 <https://github.com/fish-shell/fish-shell/issues/2473>)

       • fish  no  longer  requires /etc/fish/config.fish to correctly start, and now ships a skeleton file that
         only contains some documentation (#2799 <https://github.com/fish-shell/fish-shell/issues/2799>)

                                                         ----

   fish 2.2.0 (released July 12, 2015)
   Significant changes
       • Abbreviations: the new abbr command allows for  interactively-expanded  abbreviations,  allowing  quick
         access to frequently-used commands (#731 <https://github.com/fish-shell/fish-shell/issues/731>).

       • Vi  mode:  run fish_vi_mode to switch fish into the key bindings and prompt familiar to users of the Vi
         editor (#65 <https://github.com/fish-shell/fish-shell/issues/65>).

       • New  inline   and   interactive   pager,   which   will   be   familiar   to   users   of   zsh   (#291
         <https://github.com/fish-shell/fish-shell/issues/291>).

       • Underlying  architectural  changes:  the  fishd  universal variable server has been removed as it was a
         source of many bugs and security problems. Notably, old fish sessions will not be able  to  communicate
         universal  variable  changes with new fish sessions. For best results, restart all running instances of
         fish.

       • The web-based configuration tool has been redesigned,  featuring  a  prompt  theme  chooser  and  other
         improvements.

       • New German, Brazilian Portuguese, and Chinese translations.

   Backward-incompatible changes
       These  are  kept  to  a  minimum, but either change undocumented features or are too hard to use in their
       existing forms. These changes may break existing scripts.

       • commandline  no  longer  interprets  functions  “in  reverse”,  instead  behaving  as  expected  (#1567
         <https://github.com/fish-shell/fish-shell/issues/1567>).

       • The  previously-undocumented  CMD_DURATION  variable  is  now  set  for  all  commands and contains the
         execution  time  of  the  last  command  in  milliseconds  (#1585  <https://github.com/fish-shell/fish-
         shell/issues/1585>).  It  is  no  longer  exported  to  other commands (#1896 <https://github.com/fish-
         shell/fish-shell/issues/1896>).

       • if / else conditional statements now return values consistent with the Single Unix Specification,  like
         other shells (#1443 <https://github.com/fish-shell/fish-shell/issues/1443>).

       • A  new  “top-level” local scope has been added, allowing local variables declared on the commandline to
         be visible to subsequent commands. (#1908 <https://github.com/fish-shell/fish-shell/issues/1908>)

   Other notable fixes and improvements
       • New documentation design (#1662 <https://github.com/fish-shell/fish-shell/issues/1662>), which requires
         a Doxygen version 1.8.7 or newer to build.

       • Fish now defines a default directory for other packages to provide  completions.  By  default  this  is
         /usr/share/fish/vendor-completions.d;  on  systems  with  pkgconfig installed this path is discoverable
         with pkg-config --variable completionsdir fish.

       • A new parser removes many bugs; all existing syntax should keep working.

       • New fish_preexec and fish_postexec events are fired before and after job execution respectively  (#1549
         <https://github.com/fish-shell/fish-shell/issues/1549>).

       • Unmatched wildcards no longer prevent a job from running. Wildcards used interactively will still print
         an  error,  but  the  job  will  proceed  and  the  wildcard  will  expand  to  zero  arguments  (#1482
         <https://github.com/fish-shell/fish-shell/issues/1482>).

       • The . command is deprecated  and  the  source  command  is  preferred  (#310  <https://github.com/fish-
         shell/fish-shell/issues/310>).

       • bind supports “bind modes”, which allows bindings to be set for a particular named mode, to support the
         implementation of Vi mode.

       • A  new  export  alias,  which  behaves  like  other  shells (#1833 <https://github.com/fish-shell/fish-
         shell/issues/1833>).

       • command has a new --search option to print the name of the disk file that would be executed, like other
         shells’ command -v (#1540 <https://github.com/fish-shell/fish-shell/issues/1540>).

       • commandline has a new --paging-mode option to support the new pager.

       • complete has a new --wraps option, which allows a command to (recursively) inherit the completions of a
         wrapped command  (#393  <https://github.com/fish-shell/fish-shell/issues/393>),  and  complete  -e  now
         correctly erases completions (#380 <https://github.com/fish-shell/fish-shell/issues/380>).

       • Completions  are  now  generated  from  manual  pages  by  default  on  the  first  run  of  fish (#997
         <https://github.com/fish-shell/fish-shell/issues/997>).

       • fish_indent   can   now   produce   colorized   (--ansi)    and    HTML    (--html)    output    (#1827
         <https://github.com/fish-shell/fish-shell/issues/1827>).

       • functions --erase now prevents autoloaded functions from being reloaded in the current session.

       • history  has  a new --merge option, to incorporate history from other sessions into the current session
         (#825 <https://github.com/fish-shell/fish-shell/issues/825>).

       • jobs  returns  1  if   there   are   no   active   jobs   (#1484   <https://github.com/fish-shell/fish-
         shell/issues/1484>).

       • read has several new options:

       • --array to break input into an array (#1540 <https://github.com/fish-shell/fish-shell/issues/1540>)

       • --null  to  break  lines  on  NUL  characters  rather  than  newlines  (#1694 <https://github.com/fish-
         shell/fish-shell/issues/1694>)

       • --nchars  to  read  a  specific  number  of  characters   (#1616   <https://github.com/fish-shell/fish-
         shell/issues/1616>)

       • --right-prompt    to    display    a    right-hand-side   prompt   during   interactive   read   (#1698
         <https://github.com/fish-shell/fish-shell/issues/1698>).

       • type  has  a  new  -q   option   to   suppress   output   (#1540   <https://github.com/fish-shell/fish-
         shell/issues/1540>  and,  like  other  shells,  type  -a  now  prints  all  matches for a command (#261
         <https://github.com/fish-shell/fish-shell/issues/261>).

       • Pressing f1 now shows  the  manual  page  for  the  current  command  (#1063  <https://github.com/fish-
         shell/fish-shell/issues/1063>).

       • fish_title  functions have access to the arguments of the currently running argument as $argv[1] (#1542
         <https://github.com/fish-shell/fish-shell/issues/1542>).

       • The OS command-not-found handler is used  on  Arch  Linux  (#1925  <https://github.com/fish-shell/fish-
         shell/issues/1925>), nixOS (#1852 <https://github.com/fish-shell/fish-shell/issues/1852>), openSUSE and
         Fedora (#1280 <https://github.com/fish-shell/fish-shell/issues/1280>).

       • Alt+.  searches  backwards  in  the  token  history, mapping to the same behavior as inserting the last
         argument  of  the  previous  command,  like  other  shells  (#89   <https://github.com/fish-shell/fish-
         shell/issues/89>).

       • The  SHLVL  environment  variable  is incremented correctly (#1634 <https://github.com/fish-shell/fish-
         shell/issues/1634> & #1693 <https://github.com/fish-shell/fish-shell/issues/1693>).

       • Added  completions  for  adb  (#1165  <https://github.com/fish-shell/fish-shell/issues/1165>  &   #1211
         <https://github.com/fish-shell/fish-shell/issues/1211>),     apt    (#2018    <https://github.com/fish-
         shell/fish-shell/issues/2018>),  aura  (#1292  <https://github.com/fish-shell/fish-shell/issues/1292>),
         composer     (#1607     <https://github.com/fish-shell/fish-shell/issues/1607>),     cygport     (#1841
         <https://github.com/fish-shell/fish-shell/issues/1841>),   dropbox   (#1533   <https://github.com/fish-
         shell/fish-shell/issues/1533>),  elixir (#1167 <https://github.com/fish-shell/fish-shell/issues/1167>),
         fossil,   heroku    (#1790    <https://github.com/fish-shell/fish-shell/issues/1790>),    iex    (#1167
         <https://github.com/fish-shell/fish-shell/issues/1167>),   kitchen   (#2000   <https://github.com/fish-
         shell/fish-shell/issues/2000>),  nix  (#1167   <https://github.com/fish-shell/fish-shell/issues/1167>),
         node/npm      (#1566      <https://github.com/fish-shell/fish-shell/issues/1566>),      opam     (#1615
         <https://github.com/fish-shell/fish-shell/issues/1615>),   setfacl   (#1752   <https://github.com/fish-
         shell/fish-shell/issues/1752>),       tmuxinator       (#1863      <https://github.com/fish-shell/fish-
         shell/issues/1863>), and yast2 (#1739 <https://github.com/fish-shell/fish-shell/issues/1739>).

       • Improved completions for brew  (#1090  <https://github.com/fish-shell/fish-shell/issues/1090>  &  #1810
         <https://github.com/fish-shell/fish-shell/issues/1810>),   bundler   (#1779   <https://github.com/fish-
         shell/fish-shell/issues/1779>),  cd   (#1135   <https://github.com/fish-shell/fish-shell/issues/1135>),
         emerge         (#1840         <https://github.com/fish-shell/fish-shell/issues/1840>),git        (#1680
         <https://github.com/fish-shell/fish-shell/issues/1680>,   #1834    <https://github.com/fish-shell/fish-
         shell/issues/1834>   &   #1951   <https://github.com/fish-shell/fish-shell/issues/1951>),   man   (#960
         <https://github.com/fish-shell/fish-shell/issues/960>),   modprobe   (#1124   <https://github.com/fish-
         shell/fish-shell/issues/1124>),  pacman (#1292 <https://github.com/fish-shell/fish-shell/issues/1292>),
         rpm      (#1236       <https://github.com/fish-shell/fish-shell/issues/1236>),       rsync       (#1872
         <https://github.com/fish-shell/fish-shell/issues/1872>),     scp    (#1145    <https://github.com/fish-
         shell/fish-shell/issues/1145>),  ssh  (#1234   <https://github.com/fish-shell/fish-shell/issues/1234>),
         sshfs      (#1268     <https://github.com/fish-shell/fish-shell/issues/1268>),     systemctl     (#1462
         <https://github.com/fish-shell/fish-shell/issues/1462>,   #1950    <https://github.com/fish-shell/fish-
         shell/issues/1950>   &   #1972   <https://github.com/fish-shell/fish-shell/issues/1972>),  tmux  (#1853
         <https://github.com/fish-shell/fish-shell/issues/1853>),   vagrant   (#1748   <https://github.com/fish-
         shell/fish-shell/issues/1748>), yum (#1269 <https://github.com/fish-shell/fish-shell/issues/1269>), and
         zypper (#1787 <https://github.com/fish-shell/fish-shell/issues/1787>).

                                                         ----

   fish 2.1.2 (released Feb 24, 2015)
       fish   2.1.2   contains   a   workaround   for   a   filesystem   bug   in   Mac  OS  X  Yosemite.  #1859
       <https://github.com/fish-shell/fish-shell/issues/1859>

       Specifically, after installing fish 2.1.1 and then rebooting, “Verify Disk” in Disk Utility  will  report
       “Invalid  number  of  hard  links.” We don’t have any reports of data loss or other adverse consequences.
       fish 2.1.2 avoids triggering the bug, but does not repair an already affected filesystem. To  repair  the
       filesystem,  you can boot into Recovery Mode and use Repair Disk from Disk Utility. Linux and versions of
       OS X prior to Yosemite are believed to be unaffected.

       There are no other changes in this release.

                                                         ----

   fish 2.1.1 (released September 26, 2014)
       Important: if you are upgrading, stop all running instances of fishd as soon as possible after installing
       this release; it will be restarted automatically. On most  systems,  there  will  be  no  further  action
       required.  Note  that some environments (where XDG_RUNTIME_DIR is set), such as Fedora 20, will require a
       restart of all running fish processes before universal variables work as intended.

       Distributors are highly encouraged to call killall fishd, pkill fishd or similar in installation scripts,
       or to warn their users to do so.

   Security fixes
       • The fish_config web interface now uses an authentication token to protect requests and only responds to
         requests from the local machine with this token, preventing a remote code  execution  attack.  (closing
         CVE-2014-2914). #1438 <https://github.com/fish-shell/fish-shell/issues/1438>

       • psub  and  funced  are  no longer vulnerable to attacks which allow local privilege escalation and data
         tampering  (closing  CVE-2014-2906  and  CVE-2014-3856).   #1437   <https://github.com/fish-shell/fish-
         shell/issues/1437>

       • fishd  uses  a  secure  path  for  its  socket, preventing a local privilege escalation attack (closing
         CVE-2014-2905). #1436 <https://github.com/fish-shell/fish-shell/issues/1436>

       • __fish_print_packages is no longer vulnerable to attacks which would allow local  privilege  escalation
         and    data    tampering    (closing    CVE-2014-3219).    #1440   <https://github.com/fish-shell/fish-
         shell/issues/1440>

   Other fixesfishd now ignores SIGPIPE, fixing crashes using tools like GNU Parallel and which occurred  more  often
         as  a result of the other fishd changes. #1084 <https://github.com/fish-shell/fish-shell/issues/1084> &
         #1690 <https://github.com/fish-shell/fish-shell/issues/1690>

                                                         ----

   fish 2.1.0
   Significant ChangesTab completions will fuzzy-match files. #568 <https://github.com/fish-shell/fish-shell/issues/568>

         When tab-completing a file, fish will first attempt prefix matches (foo matches foobar), then substring
         matches (ooba matches foobar), and lastly subsequence matches (fbr matches foobar). For example,  in  a
         directory  with  files foo1.txt, foo2.txt, foo3.txt…, you can type only the numeric part and hit tab to
         fill in the rest.

         This feature is implemented for files and executables. It is not  yet  implemented  for  options  (like
         --foobar), and not yet implemented across path components (like /u/l/b to match /usr/local/bin).

       • Redirections    now   work   better   across   pipelines.   #110   <https://github.com/fish-shell/fish-
         shell/issues/110>, #877 <https://github.com/fish-shell/fish-shell/issues/877>

         In particular, you can pipe stderr and stdout together, for example, with cmd ^&1 | tee log.txt, or the
         more familiar cmd 2>&1 | tee log.txt.

       • A single ``%`` now expands to the last  job  backgrounded.  #1008  <https://github.com/fish-shell/fish-
         shell/issues/1008>

         Previously,  a  single  %  would  pid-expand to either all backgrounded jobs, or all jobs owned by your
         user. Now it expands to the last job backgrounded. If no job is in the  background,  it  will  fail  to
         expand. In particular, fg % can be used to put the most recent background job in the foreground.

   Other Notable Fixes
       • alt-U  and  alt+C  now  uppercase  and  capitalize words, respectively.  #995 <https://github.com/fish-
         shell/fish-shell/issues/995>

       • VTE based terminals should now know the working  directory.  #906  <https://github.com/fish-shell/fish-
         shell/issues/906>

       • The autotools build now works on Mavericks. #968 <https://github.com/fish-shell/fish-shell/issues/968>

       • The end-of-line binding (ctrl+E) now accepts autosuggestions. #932 <https://github.com/fish-shell/fish-
         shell/issues/932>

       • Directories  in  /etc/paths  (used  on  OS  X)  are now prepended instead of appended, similar to other
         shells. #927 <https://github.com/fish-shell/fish-shell/issues/927>

       • Option-right-arrow  (used  for  partial  autosuggestion  completion)  now   works   on   iTerm2.   #920
         <https://github.com/fish-shell/fish-shell/issues/920>

       • Tab  completions now work properly within nested subcommands. #913 <https://github.com/fish-shell/fish-
         shell/issues/913>

       • printf supports \e, the escape character. #910 <https://github.com/fish-shell/fish-shell/issues/910>

       • fish_config  history  no  longer  shows  duplicate  items.  #900   <https://github.com/fish-shell/fish-
         shell/issues/900>

       • $fish_user_paths  is  now  prepended  to  $PATH  instead  of  appended.  #888 <https://github.com/fish-
         shell/fish-shell/issues/888>

       • Jobs complete when all processes complete. #876 <https://github.com/fish-shell/fish-shell/issues/876>

         For example, in previous versions of fish, sleep 10 | echo Done returns  control  immediately,  because
         echo  does  not  read  from  stdin.   Now  it  does not complete until sleep exits (presumably after 10
         seconds).

       • Better error reporting for square brackets. #875 <https://github.com/fish-shell/fish-shell/issues/875>

       • fish no longer tries to add /bin to $PATH unless PATH is totally empty. #852  <https://github.com/fish-
         shell/fish-shell/issues/852>

       • History    token    substitution    (alt-up)    now    works    correctly    inside   subshells.   #833
         <https://github.com/fish-shell/fish-shell/issues/833>

       • Flow  control  is   now   disabled,   freeing   up   ctrl-S   and   ctrl-Q   for   other   uses.   #814
         <https://github.com/fish-shell/fish-shell/issues/814>

       • sh-style    variable    setting    like    foo=bar   now   produces   better   error   messages.   #809
         <https://github.com/fish-shell/fish-shell/issues/809>

       • Commands with wildcards no longer produce  autosuggestions.  #785  <https://github.com/fish-shell/fish-
         shell/issues/785>

       • funced  no longer freaks out when supplied with no arguments. #780 <https://github.com/fish-shell/fish-
         shell/issues/780>

       • fish.app  now  works  correctly  in  a  directory  containing  spaces.  #774  <https://github.com/fish-
         shell/fish-shell/issues/774>

       • Tab  completion  cycling  no  longer  occasionally  fails  to  repaint.  #765 <https://github.com/fish-
         shell/fish-shell/issues/765>

       • Comments now work in eval’d strings. #684 <https://github.com/fish-shell/fish-shell/issues/684>

       • History search (up-arrow) now shows the item matching the autosuggestion, if  that  autosuggestion  was
         truncated. #650 <https://github.com/fish-shell/fish-shell/issues/650>

       • Ctrl-T  now  transposes  characters,  as  in  other  shells.  #128 <https://github.com/fish-shell/fish-
         shell/issues/128>

                                                         ----

   fish 2.0.0
   Significant ChangesCommand substitutions now modify ``$status``  :issue:`547`.  Previously  the  exit  status  of  command
         substitutions  (like  (pwd)) was ignored; however now it modifies $status. Furthermore, the set command
         now only sets $status on failure; it is untouched on success. This allows for the following pattern:

            if set python_path (which python)
               ...
            end

         Because set does not modify  $status  on  success,  the  if  branch  effectively  tests  whether  which
         succeeded, and if so, whether the set also succeeded.

       • Improvements  to PATH handling. There is a new variable, fish_user_paths, which can be set universally,
         and whose contents are appended to $PATH #527 <https://github.com/fish-shell/fish-shell/issues/527>

         • /etc/paths and /etc/paths.d are now respected on OS X

         • fish no longer modifies $PATH to find its own binaries

       • Long lines no longer use ellipsis for line breaks, and copy  and  paste  should  no  longer  include  a
         newline even if the line was broken #300 <https://github.com/fish-shell/fish-shell/issues/300>

       • New  syntax  for  index  ranges (sometimes known as “slices”) #212 <https://github.com/fish-shell/fish-
         shell/issues/212>

       • fish now supports an ``else if`` statement #134 <https://github.com/fish-shell/fish-shell/issues/134>

       • Process and pid completion now works on OS X #129 <https://github.com/fish-shell/fish-shell/issues/129>

       • fish is now relocatable, and no longer depends  on  compiled-in  paths  #125  <https://github.com/fish-
         shell/fish-shell/issues/125>

       • fish   now   supports   a   right   prompt   (RPROMPT)   through  the  fish_right_prompt  function  #80
         <https://github.com/fish-shell/fish-shell/issues/80>

       • fish now uses posix_spawn instead of fork when possible, which is much faster  on  BSD  and  OS  X  #11
         <https://github.com/fish-shell/fish-shell/issues/11>

   Other Notable Fixes
       • Updated VCS completions (darcs, cvs, svn, etc.)

       • Avoid  calling  getcwd  on  the  main  thread, as it can hang #696 <https://github.com/fish-shell/fish-
         shell/issues/696>

       • Control-D (forward delete) no  longer  stops  at  a  period  #667  <https://github.com/fish-shell/fish-
         shell/issues/667>

       • Completions for many new commands

       • fish now respects rxvt’s unique keybindings #657 <https://github.com/fish-shell/fish-shell/issues/657>

       • xsel  is  no  longer  built  as  part  of  fish.  It will still be invoked if installed separately #633
         <https://github.com/fish-shell/fish-shell/issues/633>

       • __fish_filter_mime no longer spews #628 <https://github.com/fish-shell/fish-shell/issues/628>

       • The –no-execute option  to  fish  no  longer  falls  over  when  reaching  the  end  of  a  block  #624
         <https://github.com/fish-shell/fish-shell/issues/624>

       • fish_config  knows  how  to  find  fish  even  if  it’s not in the $PATH #621 <https://github.com/fish-
         shell/fish-shell/issues/621>

       • A  leading  space  now  prevents  writing  to  history,   as   is   done   in   bash   and   zsh   #615
         <https://github.com/fish-shell/fish-shell/issues/615>

       • Hitting  enter  after a backslash only goes to a new line if it is followed by whitespace or the end of
         the line #613 <https://github.com/fish-shell/fish-shell/issues/613>

       • printf is now a builtin #611 <https://github.com/fish-shell/fish-shell/issues/611>

       • Event handlers should no longer fire if signals are blocked  #608  <https://github.com/fish-shell/fish-
         shell/issues/608>

       • set_color is now a builtin #578 <https://github.com/fish-shell/fish-shell/issues/578>

       • man  page  completions  are  now  located  in  a  new  generated_completions directory, instead of your
         completions directory #576 <https://github.com/fish-shell/fish-shell/issues/576>

       • tab now clears autosuggestions #561 <https://github.com/fish-shell/fish-shell/issues/561>

       • tab completion from within a pair of quotes now  attempts  to  “appropriate”  the  closing  quote  #552
         <https://github.com/fish-shell/fish-shell/issues/552>

       • $EDITOR  can  now be a list: for example, set EDITOR gvim -f) #541 <https://github.com/fish-shell/fish-
         shell/issues/541>

       • case bodies are now indented #530 <https://github.com/fish-shell/fish-shell/issues/530>

       • The profile switch -p no longer crashes #517 <https://github.com/fish-shell/fish-shell/issues/517>

       • You can now control-C out of read #516 <https://github.com/fish-shell/fish-shell/issues/516>

       • umask is now functional on OS X #515 <https://github.com/fish-shell/fish-shell/issues/515>

       • Avoid calling getpwnam on the main thread, as it  can  hang  #512  <https://github.com/fish-shell/fish-
         shell/issues/512>

       • Alt-F  or  Alt-right-arrow (Option-F or option-right-arrow) now accepts one word of an autosuggestion ‐
         #435 <https://github.com/fish-shell/fish-shell/issues/435>

       • Setting fish as your login shell no longer  kills  OpenSUSE  #367  <https://github.com/fish-shell/fish-
         shell/issues/367>

       • Backslashes  now  join  lines,  instead  of  creating  multiple commands #347 <https://github.com/fish-
         shell/fish-shell/issues/347>

       • echo now  implements  the  -e  flag  to  interpret  escapes  #337  <https://github.com/fish-shell/fish-
         shell/issues/337>

       • When the last token in the user’s input contains capital letters, use its case in preference to that of
         the autosuggestion #335 <https://github.com/fish-shell/fish-shell/issues/335>

       • Descriptions now have their own muted color #279 <https://github.com/fish-shell/fish-shell/issues/279>

       • Wildcards   beginning   with   a   .   (for   example,   ls   .*)   no  longer  match  .  and  ..  #270
         <https://github.com/fish-shell/fish-shell/issues/270>

       • Recursive wildcards now handle symlink loops #268 <https://github.com/fish-shell/fish-shell/issues/268>

       • You can now delete history items from the  fish_config  web  interface  #250  <https://github.com/fish-
         shell/fish-shell/issues/250>

       • The  OS  X  build  now  weak  links  wcsdup  and  wcscasecmp  #240 <https://github.com/fish-shell/fish-
         shell/issues/240>

       • fish now saves and restores the process group, which prevents certain processes from being  erroneously
         reported as stopped #197 <https://github.com/fish-shell/fish-shell/issues/197>

       • funced now takes an editor option #187 <https://github.com/fish-shell/fish-shell/issues/187>

       • Alternating   row   colors   are  available  in  fish  pager  through  fish_pager_color_secondary  #186
         <https://github.com/fish-shell/fish-shell/issues/186>

       • Universal variable  values  are  now  stored  based  on  your  MAC  address,  not  your  hostname  #183
         <https://github.com/fish-shell/fish-shell/issues/183>

       • The  caret  ^  now  only  does a stderr redirection if it is the first character of a token, making git
         users happy #168 <https://github.com/fish-shell/fish-shell/issues/168>

       • Autosuggestions  will  no  longer  cause  line   wrapping   #167   <https://github.com/fish-shell/fish-
         shell/issues/167>

       • Better   handling   of   Unicode   combining   characters   #155   <https://github.com/fish-shell/fish-
         shell/issues/155>

       • fish SIGHUPs processes more often #138 <https://github.com/fish-shell/fish-shell/issues/138>

       • fish no longer causes sudo to ask for a password every time

       • fish behaves better under Midnight Commander #121 <https://github.com/fish-shell/fish-shell/issues/121>

       • set -e no longer crashes #100 <https://github.com/fish-shell/fish-shell/issues/100>

       • fish  now  will  automatically  import  history  from  bash,  if  there  is   no   fish   history   #66
         <https://github.com/fish-shell/fish-shell/issues/66>

       • Backslashed-newlines  inside  quoted  strings now behave more intuitively #52 <https://github.com/fish-
         shell/fish-shell/issues/52>

       • Tab titles should be shown correctly in iTerm2 #47 <https://github.com/fish-shell/fish-shell/issues/47>

       • scp remote path completion now sometimes works #42 <https://github.com/fish-shell/fish-shell/issues/42>

       • The  read  builtin   no   longer   shows   autosuggestions   #29   <https://github.com/fish-shell/fish-
         shell/issues/29>

       • Custom    key    bindings    can   now   be   set   via   the   fish_user_key_bindings   function   #21
         <https://github.com/fish-shell/fish-shell/issues/21>

       • All Python scripts now run correctly under both Python 2 and  Python  3  #14  <https://github.com/fish-
         shell/fish-shell/issues/14>

       • The  “accept  autosuggestion”  key  can  now  be  configured  #19  <https://github.com/fish-shell/fish-
         shell/issues/19>

       • Autosuggestions  will  no  longer  suggest  invalid  commands  #6  <https://github.com/fish-shell/fish-
         shell/issues/6>

                                                         ----

   fishfish Beta r2
   Bug FixesImplicit cd is back, for paths that start with one or two dots, a slash, or a tilde.

       • Overrides of default functions should be fixed. The “internalized scripts” feature is disabled for now.

       • Disabled  delayed  suspend.  This  is  a  strange  job-control  feature of BSD systems, including OS X.
         Disabling it frees up Control Y for other purposes; in particular, for yank, which now works on OS X.

       • fish_indent is fixed. In particular, the funced and funcsave functions work again.

       • A SIGTERM now ends the whole execution stack again (resolving #13  <https://github.com/fish-shell/fish-
         shell/issues/13>).

       • Bumped the __fish_config_interactive version number so the default fish_color_autosuggestion kicks in.

       • fish_config better handles combined term256 and classic colors like “555 yellow”.

   New FeaturesA  history  builtin,  and  associated interactive function that enables deleting history items. Example
         usage: * Print all history items beginning with echo: history --prefix echo * Print all  history  items
         containing  foo:  history  --contains  foo  *  Interactively  delete some items containing foo: history
         --delete --contains foo

       Credit to @siteshwar for implementation. Thanks @siteshwar!

                                                         ----

   fishfish Beta r1
   Scripting
       • No changes! All existing fish scripts, config files, completions, etc. from trunk  should  continue  to
         work.

   New FeaturesAutosuggestions.  Think  URL fields in browsers. When you type a command, fish will suggest the rest of
         the command after the cursor, in a muted gray when possible. You can accept  the  suggestion  with  the
         right arrow key or Ctrl-F. Suggestions come from command history, completions, and some custom code for
         cd;  there’s  a  lot  of  potential  for improvement here. The suggestions are computed on a background
         pthread, so they never slow down your typing. The autosuggestion  feature  is  incredible.  I  miss  it
         dearly every time I use anything else.

       • term256  support  where available, specifically modern xterms and OS X Lion. You can specify colors the
         old way (‘set_color cyan’) or by specifying RGB hex values (‘set_color FF3333’);  fish  will  pick  the
         closest  supported  color. Some xterms do not advertise term256 support either in the $TERM or terminfo
         max_colors field, but nevertheless support it. For that reason, fish will default into using it on  any
         xterm (but it can be disabled with an environment variable).

       • Web-based  configuration page. There is a new function ‘fish_config’. This spins up a simple Python web
         server and opens a browser window to it. From this web page, you can set your  shell  colors  and  view
         your functions, variables, and history; all changes apply immediately to all running shells. Eventually
         all configuration ought to be supported via this mechanism (but in addition to, not instead of, command
         line mechanisms).

       • Man  page  completions.  There is a new function ‘fish_update_completions’. This function reads all the
         man1 files from your manpath, removes the roff  formatting,  parses  them  to  find  the  commands  and
         options,  and  outputs  fish  completions  into ~/.config/fish/completions. It won’t overwrite existing
         completion files (except ones that it generated itself).

   Programmatic Changes
       • fish is now entirely in C++. I have no particular love for C++, but it provides a ready memory-model to
         replace halloc. We’ve made an effort to keep it to a sane and portable subset (no C++11, no  boost,  no
         going crazy with templates or smart pointers), but we do use the STL and a little tr1.

       • halloc is entirely gone, replaced by normal C++ ownership semantics.  If you don’t know what halloc is,
         well, now you have two reasons to be happy.

       • All  the  crufty  C  data  structures  are entirely gone. array_list_t, priority_queue_t, hash_table_t,
         string_buffer_t have been removed and replaced by  STL  equivalents  like  std::vector,  std::map,  and
         std::wstring. A lot of the string handling now uses std::wstring instead of wchar_t *

       • fish now spawns pthreads for tasks like syntax highlighting that require blocking I/O.

       • History  has  been completely rewritten. History files now use an extensible YAML-style syntax. History
         “merging” (multiple shells writing to the same history file) now works better. There is now  a  maximum
         history length of about 250k items (256 * 1024).

       • The parser has been “instanced,” so you can now create more than one.

       • Total #LoC has shrunk slightly even with the new features.

   Performance
       • fish  now runs syntax highlighting in a background thread, so typing commands is always responsive even
         on slow filesystems.

       • echo, test, and pwd are now builtins, which eliminates many forks.

       • The files in share/functions and share/completions now get  ‘internalized’  into  C  strings  that  get
         compiled in with fish. This substantially reduces the number of files touched at startup. A consequence
         is  that  you  cannot  change  these functions without recompiling, but often other functions depend on
         these “standard” functions, so changing them is perhaps not a good idea anyways.

       Here are some system call counts for launching and then exiting fish with the default  configuration,  on
       OS  X.  The  first column is fish trunk, the next column is with our changes, and the last column is bash
       for comparison. This data was collected via dtrace.

       before

       after

       bash

       open

       9

       4

       5

       fork

       28

       14

       0

       stat

       131

       85

       11

       lstat

       670

       0

       0

       read

       332

       80

       4

       write

       172

       149

       0

       The large number of forks relative to bash are due to fish’s insanely expensive default prompt, which  is
       unchanged  in my version. If we switch to a prompt comparable to bash’s (lame) default, the forks drop to
       16 with trunk, 4 after our changes.

       The large reduction in lstat() numbers is due to fish no longer needing to call ttyname() on OS X.

       We’ve got some work to do to be as lean as bash, but we’re on the right track.

   Contributing To Fish
       This document tells you how you can contribute to fish.

       Fish is free and open source software, distributed under the terms of the GPLv2.

       Contributions are welcome, and there are many ways to contribute!

       Whether you want to change some of the core Rust source, enhance or add a completion script or  function,
       improve the documentation or translate something, this document will tell you how.

   Getting Set Up
       Fish is developed on Github, at https://github.com/fish-shell/fish-shell.

       First,  you'll  need  an  account there, and you'll need a git clone of fish.  Fork it on Github and then
       run:

          git clone https://github.com/<USERNAME>/fish-shell.git

       This will create a copy of the fish repository in  the  directory  fish-shell  in  your  current  working
       directory.

       Also,  for  most  changes  you want to run the tests and so you'd get a setup to compile fish.  For that,
       you'll require:

       • Rust - when in doubt, try rustup

       • CMake

       • PCRE2 (headers and libraries) - optional, this will be downloaded if missing

       • gettext (headers and libraries) - optional, for translation support

       • Sphinx - optional, to build the documentation

       Of course not everything is  required  always  -  if  you  just  want  to  contribute  something  to  the
       documentation  you'll just need Sphinx, and if the change is very simple and obvious you can just send it
       in. Use your judgement!

       Once you have your changes, open a pull request on https://github.com/fish-shell/fish-shell/pulls.

   Guidelines
       In short:

       • Be conservative in what you need (keep  to  the  agreed  minimum  supported  Rust  version,  limit  new
         dependencies)

       • Use automated tools to help you (including make fish_run_tests and build_tools/style.fish)

   Contributing completions
       Completion scripts are the most common contribution to fish, and they are very welcome.

       In  general,  we'll  take all well-written completion scripts for a command that is publically available.
       This means no private tools or personal scripts, and we do reserve the right to reject for other reasons.

       Before you try to contribute them to fish, consider if the authors of the tool you are completing want to
       maintain the script instead.  Often that makes more sense, specifically because they can add new  options
       to  the  script  immediately  once  they  add  them, and don't have to maintain one completion script for
       multiple versions. If the authors no longer wish to maintain  the  script,  they  can  of  course  always
       contact  the fish maintainers to hand it over, preferably by opening a PR.  This isn't a requirement - if
       the authors don't want to maintain it, or you simply don't want to contact them, you can contribute  your
       script to fish.

       Completion scripts should

       1. Use  as few dependencies as possible - try to use fish's builtins like string instead of grep and awk,
          use python to read json instead of jq (because it's already a soft dependency for fish's tools)

       2. If it uses a common unix tool, use posix-compatible invocations - ideally it would work on  GNU/Linux,
          macOS, the BSDs and other systems

       3. Option  and  argument descriptions should be kept short.  The shorter the description, the more likely
          it is that fish can use more columns.

       4. Function names should start with __fish, and functions should be kept in the  completion  file  unless
          they're used elsewhere.

       5. Run fish_indent on your script.

       6. Try  not  to use minor convenience features right after they are available in fish - we do try to keep
          completion scripts backportable.  If something has a real impact on the  correctness  or  performance,
          feel free to use it, but if it is just a shortcut, please leave it.

       Put  your  completion  script into share/completions/name-of-command.fish. If you have multiple commands,
       you need multiple files.

       If you want to add tests, you probably want to add a littlecheck test. See below for details.

   Contributing documentation
       The documentation is stored in doc_src/, and written in ReStructured Text and built with Sphinx.

       To build it locally, run from the main fish-shell directory:

          sphinx-build -j 8 -b html -n doc_src/ /tmp/fish-doc/

       which will build the docs as html in /tmp/fish-doc. You can open it in a browser and see  that  it  looks
       okay.

       The builtins and various functions shipped with fish are documented in doc_src/cmds/.

   Code Style
       To ensure your changes conform to the style rules run

          build_tools/style.fish

       before committing your change. That will run our autoformatters:

       • rustfmt for Rust

       • fish_indent (shipped with fish) for fish script

       • black for python

       If  you’ve  already  committed  your  changes  that’s okay since it will then check the files in the most
       recent commit. This can be useful after you’ve merged another person’s change and want to check that it’s
       style is acceptable. However, in that case it will run clang-format to ensure the entire file,  not  just
       the lines modified by the commit, conform to the style.

       If you want to check the style of the entire code base run

          build_tools/style.fish --all

       That command will refuse to restyle any files if you have uncommitted changes.

   Fish Script Style Guide
       1. All  fish  scripts,  such  as  those in the share/functions and tests directories, should be formatted
          using the fish_indent command.

       2. Function names should be in all lowercase with  words  separated  by  underscores.  Private  functions
          should begin with an underscore. The first word should be fish if the function is unique to fish.

       3. The  first word of global variable names should generally be fish for public vars or _fish for private
          vars to minimize the possibility of name clashes with user defined vars.

   Configuring Your Editor for Fish Scripts
       If you use Vim: Install  vim-fish  <https://github.com/dag/vim-fish>,  make  sure  you  have  syntax  and
       filetype functionality in ~/.vimrc:

          syntax enable
          filetype plugin indent on

       Then turn on some options for nicer display of fish scripts in ~/.vim/ftplugin/fish.vim:

          " Set up :make to use fish for syntax checking.
          compiler fish

          " Set this to have long lines wrap inside comments.
          setlocal textwidth=79

          " Enable folding of block structures in fish.
          setlocal foldmethod=expr

       If  you  use Emacs: Install fish-mode <https://github.com/wwwjfy/emacs-fish> (also available in melpa and
       melpa-stable) and (setq-default indent-tabs-mode nil) for it (via  a  hook  or  in  use-packages  “:init”
       block). It can also be made to run fish_indent via e.g.

          (add-hook 'fish-mode-hook (lambda ()
              (add-hook 'before-save-hook 'fish_indent-before-save)))

   Rust Style Guide
       Use cargo fmt and cargo clippy. Clippy warnings can be turned off if there's a good reason to.

   Testing
       The  source  code  for  fish includes a large collection of tests. If you are making any changes to fish,
       running these tests is a good way to make sure the behaviour remains consistent and regressions  are  not
       introduced. Even if you don’t run the tests on your machine, they will still be run via Github Actions.

       You  are  strongly encouraged to add tests when changing the functionality of fish, especially if you are
       fixing a bug to help ensure there are no regressions in the future (i.e., we don’t reintroduce the bug).

       The tests can be found in three places:

       • src/tests for unit tests.

       • tests/checks for script tests, run by littlecheck <https://github.com/ridiculousfish/littlecheck>

       • tests/pexpects for interactive tests using pexpect <https://pexpect.readthedocs.io/en/stable/>

       When in doubt, the bulk of the tests should be added as a littlecheck test in tests/checks, as  they  are
       the  easiest  to  modify  and  run, and much faster and more dependable than pexpect tests. The syntax is
       fairly self-explanatory. It's a fish script with the expected output in #  CHECK:  or  #  CHECKERR:  (for
       stderr) comments.

       The  pexpects  are  written  in  python and can simulate input and output to/from a terminal, so they are
       needed for anything that needs actual interactivity. The runner is in  build_tools/pexpect_helper.py,  in
       case you need to modify something there.

   Local testing
       The tests can be run on your local computer on all operating systems.

          cmake path/to/fish-shell
          make fish_run_tests

   Git hooks
       Since  developers sometimes forget to run the tests, it can be helpful to use git hooks (see githooks(5))
       to automate it.

       One possibility is a pre-push hook script like this one:

          #!/bin/sh
          #### A pre-push hook for the fish-shell project
          # This will run the tests when a push to master is detected, and will stop that if the tests fail
          # Save this as .git/hooks/pre-push and make it executable

          protected_branch='master'

          # Git gives us lines like "refs/heads/frombranch SOMESHA1 refs/heads/tobranch SOMESHA1"
          # We're only interested in the branches
          while read from _ to _; do
              if [ "x$to" = "xrefs/heads/$protected_branch" ]; then
                  isprotected=1
              fi
          done
          if [ "x$isprotected" = x1 ]; then
              echo "Running tests before push to master"
              make fish_run_tests
              RESULT=$?
              if [ $RESULT -ne 0 ]; then
                  echo "Tests failed for a push to master, we can't let you do that" >&2
                  exit 1
              fi
          fi
          exit 0

       This will check if the push is to the master branch and, if it is, only allow the push  if  running  make
       fish_run_tests succeeds. In some circumstances it may be advisable to circumvent this check with git push
       --no-verify, but usually that isn’t necessary.

       To install the hook, place the code in a new file .git/hooks/pre-push and make it executable.

   Coverity Scan
       We  use Coverity’s static analysis tool which offers free access to open source projects. While access to
       the tool itself is restricted, fish-shell organization members should  know  that  they  can  login  here
       <https://scan.coverity.com/projects/fish-shell-fish-shell?tab=overview>   with   their   GitHub  account.
       Currently, tests are triggered upon merging the master branch into coverity_scan_master. Even if you  are
       not a fish developer, you can keep an eye on our statistics there.

   Contributing Translations
       Fish uses the GNU gettext library to translate messages from English to other languages.

       Creating  and  updating translations requires the Gettext tools, including xgettext, msgfmt and msgmerge.
       Translation sources are stored in the po directory, named LANG.po, where LANG is the two letter ISO 639-1
       language code of the target language (eg de for German).

       To create a new translation:

       • generate a messages.pot file by running build_tools/fish_xgettext.fish from the source tree

       • copy messages.pot to po/LANG.po

       To update a translation:

       • generate a messages.pot file by running build_tools/fish_xgettext.fish from the source tree

       • update  the  existing  translation  by  running  msgmerge   --update   --no-fuzzy-matching   po/LANG.po
         messages.pot

       The  --no-fuzzy-matching  is  important  as  we  have  had  terrible  experiences  with gettext's "fuzzy"
       translations in the past.

       Many tools are available for  editing  translation  files,  including  command-line  and  graphical  user
       interface programs. For simple use, you can just use your text editor.

       Open up the po file, for example po/sv.po, and you'll see something like:

          msgid "%ls: No suitable job\n"
          msgstr ""

       The  msgid  here is the "name" of the string to translate, typically the english string to translate. The
       second line (msgstr) is where your translation goes.

       For example:

          msgid "%ls: No suitable job\n"
          msgstr "%ls: Inget passande jobb\n"

       Any %s / %ls or %d are placeholders that fish will use for formatting at runtime. It  is  important  that
       they match - the translated string should have the same placeholders in the same order.

       Also  any  escaped characters, like that \n newline at the end, should be kept so the translation has the
       same behavior.

       Our tests run msgfmt  --check-format  /path/to/file,  so  they  would  catch  mismatched  placeholders  -
       otherwise fish would crash at runtime when the string is about to be used.

       Be  cautious  about blindly updating an existing translation file. Trivial changes to an existing message
       (eg changing the punctuation) will cause existing translations to be removed, since the tools do  literal
       string matching. Therefore, in general, you need to carefully review any recommended deletions.

   Setting Code Up For Translations
       All  non-debug  messages  output  for  user  consumption  should be marked for translation. In Rust, this
       requires the use of the wgettext! or wgettext_fmt!  macros:

          streams.out.append(wgettext_fmt!("%ls: There are no jobs\n", argv[0]));

       All messages in fish script must be enclosed in  single  or  double  quote  characters  for  our  message
       extraction script to find them.  They must also be translated via a command substitution. This means that
       the following are not valid:

          echo (_ hello)
          _ "goodbye"

       Above should be written like this instead:

          echo (_ "hello")
          echo (_ "goodbye")

       You  can  use  either  single  or  double  quotes  to  enclose the message to be translated. You can also
       optionally include spaces after the opening parentheses or before the closing parentheses.

   Versioning
       The fish version is constructed by the build_tools/git_version_gen.sh script. For developers the  version
       is  the  branch  name  plus  the  output  of git describe --always --dirty. Normally the main part of the
       version will be the closest annotated tag. Which itself is usually the most recent release number  (e.g.,
       2.6.0).

   License
   License for fish
       fish  Copyright  © 2005-2009 Axel Liljencrantz, 2009-2024 fish-shell contributors. fish is released under
       the GNU General Public License, version 2.

       fish includes other code licensed under the GNU General Public License, version 2, including GNU printf.

       Copyright © 1990-2007 Free Software Foundation, Inc. Printf (from GNU Coreutils 6.9)  is  released  under
       the GNU General Public License, version 2.

       The GNU General Public License agreement follows.

       GNU GENERAL PUBLIC LICENSE

       Version 2, June 1991
          Copyright  (C)  1989, 1991 Free Software Foundation, Inc.  51 Franklin Street, Fifth Floor, Boston, MA
          02110-1301, USA

          Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it
          is not allowed.

       Preamble

       The licenses for most software are designed to take away  your  freedom  to  share  and  change  it.   By
       contrast,  the  GNU General Public License is intended to guarantee your freedom to share and change free
       software - to make sure the software is free for all its users.  This General Public License  applies  to
       most  of  the  Free Software Foundation's software and to any other program whose authors commit to using
       it.  (Some other Free Software Foundation software is covered by the GNU Library General  Public  License
       instead.)  You can apply it to your programs, too.

       When  we speak of free software, we are referring to freedom, not price.  Our General Public Licenses are
       designed to make sure that you have the freedom to distribute copies of free  software  (and  charge  for
       this service if you wish), that you receive source code or can get it if you want it, that you can change
       the software or use pieces of it in new free programs; and that you know you can do these things.

       To  protect  your  rights, we need to make restrictions that forbid anyone to deny you these rights or to
       ask you to surrender the rights. These restrictions translate to certain responsibilities for you if  you
       distribute copies of the software, or if you modify it.

       For  example,  if you distribute copies of such a program, whether gratis or for a fee, you must give the
       recipients all the rights that you have.  You must make sure that they,  too,  receive  or  can  get  the
       source code.  And you must show them these terms so they know their rights.

       We  protect  your rights with two steps: (1) copyright the software, and (2) offer you this license which
       gives you legal permission to copy, distribute and/or modify the software.

       Also, for each author's protection and ours, we want to make certain that everyone understands that there
       is no warranty for this free software.  If the software is modified by someone else  and  passed  on,  we
       want  its  recipients to know that what they have is not the original, so that any problems introduced by
       others will not reflect on the original authors' reputations.

       Finally, any free program is threatened constantly by software patents.  We wish to avoid the danger that
       redistributors of a free program will individually obtain patent licenses, in effect making  the  program
       proprietary.  To prevent this, we have made it clear that any patent must be licensed for everyone's free
       use or not licensed at all.

       The precise terms and conditions for copying, distribution and modification follow.

       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

       • This License applies to any program or other work which contains  a  notice  placed  by  the  copyright
         holder  saying  it  may  be distributed under the terms of this General Public License.  The "Program",
         below, refers to any such program or work, and a "work based on the Program" means either  the  Program
         or  any derivative work under copyright law: that is to say, a work containing the Program or a portion
         of it, either verbatim or with modifications and/or translated into  another  language.   (Hereinafter,
         translation  is  included without limitation in the term "modification".) Each licensee is addressed as
         "you".
          Activities other than copying, distribution and modification are not covered by this License; they are
          outside its scope.  The act of running the Program is not restricted, and the output from the  Program
          is  covered  only  if  its contents constitute a work based on the Program (independent of having been
          made by running the Program). Whether that is true depends on what the Program does.

       1. You may copy and distribute verbatim copies of the Program's source code as you  receive  it,  in  any
          medium,  provided  that  you  conspicuously  and  appropriately  publish  on  each copy an appropriate
          copyright notice and disclaimer of warranty; keep intact all the notices that refer  to  this  License
          and  to  the  absence  of  any  warranty;  and give any other recipients of the Program a copy of this
          License along with the Program.
          You may charge a fee for the physical act of transferring a copy, and you may  at  your  option  offer
          warranty protection in exchange for a fee.

       2. You  may  modify your copy or copies of the Program or any portion of it, thus forming a work based on
          the Program, and copy and distribute such modifications or work under the terms of  Section  1  above,
          provided that you also meet all of these conditions:

          • You  must cause the modified files to carry prominent notices stating that you changed the files and
            the date of any change.

          • You must cause any work that you distribute or publish, that in whole or  in  part  contains  or  is
            derived  from  the  Program or any part thereof, to be licensed as a whole at no charge to all third
            parties under the terms of this License.

          • If the modified program normally reads commands interactively when run,  you  must  cause  it,  when
            started  running  for  such  interactive  use  in  the  most  ordinary  way,  to print or display an
            announcement including an appropriate copyright notice and a notice that there is  no  warranty  (or
            else,  saying  that  you provide a warranty) and that users may redistribute the program under these
            conditions, and telling the user how to view a copy of this  License.  (Exception:  if  the  Program
            itself  is  interactive  but  does  not  normally print such an announcement, your work based on the
            Program is not required to print an announcement.)

          These requirements apply to the modified work as a whole.  If identifiable sections of that  work  are
          not  derived  from  the  Program,  and  can be reasonably considered independent and separate works in
          themselves, then this License, and its terms, do not apply to those sections when you distribute  them
          as separate works.  But when you distribute the same sections as part of a whole which is a work based
          on  the Program, the distribution of the whole must be on the terms of this License, whose permissions
          for other licensees extend to the entire whole, and thus to each and  every  part  regardless  of  who
          wrote it.

          Thus,  it  is  not  the  intent of this section to claim rights or contest your rights to work written
          entirely by you; rather, the intent is to exercise the right to control the distribution of derivative
          or collective works based on the Program.

          In addition, mere aggregation of another work not based on the Program with the  Program  (or  with  a
          work  based  on  the Program) on a volume of a storage or distribution medium does not bring the other
          work under the scope of this License.

       3. You may copy and distribute the Program (or a work based on it, under Section 2)  in  object  code  or
          executable  form  under  the  terms  of  Sections  1  and 2 above provided that you also do one of the
          following:

          • Accompany it with the complete corresponding machine-readable source code, which must be distributed
            under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

          • Accompany it with a written offer, valid for at least three years, to give any third  party,  for  a
            charge   no   more  than  your  cost  of  physically  performing  source  distribution,  a  complete
            machine-readable copy of the corresponding source  code,  to  be  distributed  under  the  terms  of
            Sections 1 and 2 above on a medium customarily used for software interchange; or,

          • Accompany  it  with  the information you received as to the offer to distribute corresponding source
            code.  (This alternative is allowed only for noncommercial distribution and only if you received the
            program in object code or executable form with such an offer, in accord with Subsection b above.)

          The source code for a work means the preferred form of the work for making modifications to  it.   For
          an  executable  work, complete source code means all the source code for all modules it contains, plus
          any associated  interface  definition  files,  plus  the  scripts  used  to  control  compilation  and
          installation of the executable.  However, as a special exception, the source code distributed need not
          include  anything  that  is  normally  distributed  (in  either  source or binary form) with the major
          components (compiler, kernel, and so on) of the operating system on which the executable runs,  unless
          that component itself accompanies the executable.

          If  distribution  of  executable  or  object code is made by offering access to copy from a designated
          place, then offering equivalent access to  copy  the  source  code  from  the  same  place  counts  as
          distribution  of the source code, even though third parties are not compelled to copy the source along
          with the object code.

       4. You may not copy, modify, sublicense, or distribute the Program except  as  expressly  provided  under
          this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and
          will  automatically  terminate  your  rights  under  this  License. However, parties who have received
          copies, or rights, from you under this License will not have their licenses terminated so long as such
          parties remain in full compliance.

       5. You are not required to accept this License, since you have  not  signed  it.  However,  nothing  else
          grants  you permission to modify or distribute the Program or its derivative works.  These actions are
          prohibited by law if you do not accept this License.  Therefore,  by  modifying  or  distributing  the
          Program (or any work based on the Program), you indicate your acceptance of this License to do so, and
          all its terms and conditions for copying, distributing or modifying the Program or works based on it.

       6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically
          receives  a  license  from  the original licensor to copy, distribute or modify the Program subject to
          these terms and conditions. You may not impose any further restrictions on the recipients' exercise of
          the rights granted herein. You are not responsible for enforcing compliance by third parties  to  this
          License.

       7. If,  as a consequence of a court judgment or allegation of patent infringement or for any other reason
          (not limited to patent issues), conditions are imposed on you (whether by court  order,  agreement  or
          otherwise)  that contradict the conditions of this License, they do not excuse you from the conditions
          of this License.  If you cannot distribute so as to satisfy simultaneously your obligations under this
          License and any other pertinent obligations, then as a consequence you may not distribute the  Program
          at  all.  For example, if a patent license would not permit royalty-free redistribution of the Program
          by all those who receive copies directly or indirectly through  you,  then  the  only  way  you  could
          satisfy both it and this License would be to refrain entirely from distribution of the Program.
          If any portion of this section is held invalid or unenforceable under any particular circumstance, the
          balance  of  the section is intended to apply and the section as a whole is intended to apply in other
          circumstances.

          It is not the purpose of this section to induce you to infringe any patents or  other  property  right
          claims  or to contest validity of any such claims; this section has the sole purpose of protecting the
          integrity of the free software distribution system, which is implemented by public license  practices.
          Many  people  have  made generous contributions to the wide range of software distributed through that
          system in reliance on consistent application of that system; it is up to the author/donor to decide if
          he or she is willing to distribute software through any other system and a licensee cannot impose that
          choice.

          This section is intended to make thoroughly clear what is believed to be a consequence of the rest  of
          this License.

       8. If  the distribution and/or use of the Program is restricted in certain countries either by patents or
          by copyrighted interfaces, the original copyright holder who places the Program under this License may
          add an explicit geographical distribution limitation excluding those countries, so  that  distribution
          is  permitted  only  in or among countries not thus excluded.  In such case, this License incorporates
          the limitation as if written in the body of this License.

       9. The Free Software Foundation may publish revised and/or new versions of  the  General  Public  License
          from time to time.  Such new versions will be similar in spirit to the present version, but may differ
          in detail to address new problems or concerns.
          Each  version  is given a distinguishing version number.  If the Program specifies a version number of
          this License which applies to it and "any later version", you have the option of following  the  terms
          and  conditions  either  of  that  version  or  of  any  later  version published by the Free Software
          Foundation.  If the Program does not specify a version number of this  License,  you  may  choose  any
          version ever published by the Free Software Foundation.

       10.
          If you wish to incorporate parts of the Program into other free programs whose distribution conditions
          are  different,  write  to the author to ask for permission.  For software which is copyrighted by the
          Free Software Foundation, write to the Free Software Foundation;  we  sometimes  make  exceptions  for
          this.   Our  decision will be guided by the two goals of preserving the free status of all derivatives
          of our free software and of promoting the sharing and reuse of software generally.
          NO WARRANTY

       11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO  THE  EXTENT
           PERMITTED  BY  APPLICABLE  LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
           OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR  IMPLIED,
           INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
           PURPOSE.   THE  ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
           PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

       12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT  HOLDER,  OR
           ANY  OTHER  PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
           FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT  OF  THE
           USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
           INACCURATE  OR  LOSSES  SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH
           ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY  OF  SUCH
           DAMAGES.

   License for the Python docs theme
       In doc_src/python_docs_theme/, taken from https://pypi.org/project/python-docs-theme/2020.1/.

       PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2

       1.  This  LICENSE  AGREEMENT  is  between  the  Python Software Foundation ("PSF"), and the Individual or
       Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form
       and its associated documentation.

       2. Subject to the terms  and  conditions  of  this  License  Agreement,  PSF  hereby  grants  Licensee  a
       nonexclusive,  royalty-free,  world-wide  license  to  reproduce,  analyze,  test, perform and/or display
       publicly, prepare derivative works, distribute, and otherwise use  Python  alone  or  in  any  derivative
       version,  provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright
       (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016,  2017
       Python  Software  Foundation;  All  Rights  Reserved"  are  retained in Python alone or in any derivative
       version prepared by Licensee.

       3. In the event Licensee prepares a derivative work that is based on or incorporates Python or  any  part
       thereof,  and  wants  to  make  the derivative work available to others as provided herein, then Licensee
       hereby agrees to include in any such work a brief summary of the changes made to Python.

       4. PSF is making Python available to Licensee on an "AS IS"  basis.   PSF  MAKES  NO  REPRESENTATIONS  OR
       WARRANTIES,  EXPRESS  OR  IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY
       REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT  THE  USE  OF
       PYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.

       5.  PSF  SHALL  NOT  BE  LIABLE  TO LICENSEE OR ANY OTHER USERS OF PYTHON FOR ANY INCIDENTAL, SPECIAL, OR
       CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,  OR  ANY
       DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

       6.  This  License  Agreement  will  automatically  terminate  upon  a  material  breach  of its terms and
       conditions.

       7. Nothing in this License Agreement shall be deemed to create any relationship of  agency,  partnership,
       or  joint  venture between PSF and Licensee.  This License Agreement does not grant permission to use PSF
       trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee,  or
       any third party.

       8.  By  copying,  installing  or  otherwise  using  Python,  Licensee agrees to be bound by the terms and
       conditions of this License Agreement.

   MIT License
       fish includes a copy of Alpine.js, which is  copyright  2019-2021  Caleb  Porzio  and  contributors,  and
       licensed  under  the  MIT  License.  It  also  uses  FindRust.cmake, from the Corrosion project, which is
       copyright 2018 Andrew Gaspar and licensed under the MIT license. It  also  includes  the  Dracula  theme,
       which  is  copyright  2018  Dracula  Team, and the Nord theme, which is copyright 2016-present Sven Greb.
       These themes are also used under the MIT license.

       fish contains code derived from  musl-libc <https://www.musl-libc.org>, which is copyright 2006-2020 Rich
       Felker, et al., to implement printf. This code is used under the terms of the MIT license.

       The MIT license follows.

       Permission is hereby granted, free of charge, to any  person  obtaining  a  copy  of  this  software  and
       associated  documentation  files (the "Software"), to deal in the Software without restriction, including
       without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,  and/or  sell
       copies  of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
       following conditions:

       The above copyright notice and this permission notice shall be included  in  all  copies  or  substantial
       portions of the Software.

       THE  SOFTWARE  IS  PROVIDED  "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
       LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
       EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
       IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE  SOFTWARE  OR
       THE USE OR OTHER DEALINGS IN THE SOFTWARE.

   GNU Library General Public License
       fish contains code derived from the GNU C Library, licensed under the GNU Library General Public License.
       This code is copyright © 1989-1994 Free Software Foundation, Inc.

       The GNU Library General Public License agreement follows.

       GNU LIBRARY GENERAL PUBLIC LICENSE

       Version 2, June 1991

       Copyright  (C)  1991  Free  Software  Foundation,  Inc.   51  Franklin  Street,  Fifth  Floor, Boston, MA
       02110-1301  USA Everyone is permitted to copy and distribute verbatim copies of  this  license  document,
       but changing it is not allowed.

       [This is the first released version of the library GPL. It is
              numbered 2 because it goes with version 2 of the ordinary GPL.]

       Preamble

       The  licenses  for  most  software  are  designed  to  take away your freedom to share and change it.  By
       contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free
       software--to make sure the software is free for all its users.

       This license, the Library General Public License, applies to  some  specially  designated  Free  Software
       Foundation  software, and to any other libraries whose authors decide to use it.  You can use it for your
       libraries, too.

       When we speak of free software, we are referring to freedom, not price.  Our General Public Licenses  are
       designed  to  make  sure  that you have the freedom to distribute copies of free software (and charge for
       this service if you wish), that you receive source code or can get it if you want it, that you can change
       the software or use pieces of it in new free programs; and that you know you can do these things.

       To protect your rights, we need to make restrictions that forbid anyone to deny you these  rights  or  to
       ask you to surrender the rights.  These restrictions translate to certain responsibilities for you if you
       distribute copies of the library, or if you modify it.

       For  example,  if  you  distribute  copies of the library, whether gratis or for a fee, you must give the
       recipients all the rights that we gave you.  You must make sure that they, too, receive or  can  get  the
       source  code.   If  you  link  a  program with the library, you must provide complete object files to the
       recipients so that they can relink them with the  library,  after  making  changes  to  the  library  and
       recompiling it.  And you must show them these terms so they know their rights.

       Our  method  of  protecting  your rights has two steps: (1) copyright the library, and (2) offer you this
       license which gives you legal permission to copy, distribute and/or modify the library.

       Also, for each distributor's protection, we want to make certain that everyone understands that there  is
       no warranty for this free library.  If the library is modified by someone else and passed on, we want its
       recipients  to  know  that what they have is not the original version, so that any problems introduced by
       others will not reflect on the original authors' reputations.

       Finally, any free program is threatened constantly by software patents.  We wish to avoid the danger that
       companies  distributing  free  software  will  individually  obtain  patent  licenses,  thus  in   effect
       transforming  the  program  into  proprietary  software.  To prevent this, we have made it clear that any
       patent must be licensed for everyone's free use or not licensed at all.

       Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which
       was designed for utility programs.  This license, the GNU Library  General  Public  License,  applies  to
       certain  designated libraries.  This license is quite different from the ordinary one; be sure to read it
       in full, and don't assume that anything in it is the same as in the ordinary license.

       The reason we have a separate public license for some libraries is that  they  blur  the  distinction  we
       usually  make  between  modifying  or  adding to a program and simply using it.  Linking a program with a
       library, without changing the library, is in some sense simply using the library,  and  is  analogous  to
       running  a  utility  program  or  application program.  However, in a textual and legal sense, the linked
       executable is a combined work, a derivative of the original library,  and  the  ordinary  General  Public
       License treats it as such.

       Because  of  this  blurred  distinction,  using the ordinary General Public License for libraries did not
       effectively promote software sharing, because most developers did not use the  libraries.   We  concluded
       that weaker conditions might promote sharing better.

       However,  unrestricted  linking  of  non-free  programs  would deprive the users of those programs of all
       benefit from the free status of the  libraries  themselves.   This  Library  General  Public  License  is
       intended  to  permit developers of non-free programs to use free libraries, while preserving your freedom
       as a user of such programs to change the free libraries that are incorporated in them.  (We have not seen
       how to achieve this as regards changes in header files, but we have achieved it as regards changes in the
       actual functions of the Library.)  The hope is  that  this  will  lead  to  faster  development  of  free
       libraries.

       The  precise terms and conditions for copying, distribution and modification follow.  Pay close attention
       to the difference between a "work based on the library" and a "work that uses the library".   The  former
       contains code derived from the library, while the latter only works together with the library.

       Note  that  it is possible for a library to be covered by the ordinary General Public License rather than
       by this special one.

       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

       0. This License Agreement applies to any software library which contains a notice placed by the copyright
       holder or other authorized party saying it may be distributed under the terms  of  this  Library  General
       Public License (also called "this License").  Each licensee is addressed as "you".

       A "library" means a collection of software functions and/or data prepared so as to be conveniently linked
       with application programs (which use some of those functions and data) to form executables.

       The  "Library", below, refers to any such software library or work which has been distributed under these
       terms.  A "work based on the Library" means either the Library or any  derivative  work  under  copyright
       law:  that  is  to  say,  a  work  containing  the  Library  or  a portion of it, either verbatim or with
       modifications and/or translated straightforwardly into another language.   (Hereinafter,  translation  is
       included without limitation in the term "modification".)

       "Source  code"  for  a  work  means the preferred form of the work for making modifications to it.  For a
       library, complete source code means all the source code for all modules it contains, plus any  associated
       interface definition files, plus the scripts used to control compilation and installation of the library.

       Activities  other  than  copying, distribution and modification are not covered by this License; they are
       outside its scope.  The act of running a program using the Library is not  restricted,  and  output  from
       such a program is covered only if its contents constitute a work based on the Library (independent of the
       use  of the Library in a tool for writing it).  Whether that is true depends on what the Library does and
       what the program that uses the Library does.

       1. You may copy and distribute verbatim copies of the Library's complete source code as you  receive  it,
       in  any  medium,  provided  that  you conspicuously and appropriately publish on each copy an appropriate
       copyright notice and disclaimer of warranty; keep intact all the notices that refer to this  License  and
       to the absence of any warranty; and distribute a copy of this License along with the Library.

       You  may  charge  a  fee  for  the  physical act of transferring a copy, and you may at your option offer
       warranty protection in exchange for a fee.

       2. You may modify your copy or copies of the Library or any portion of it, thus forming a work  based  on
       the  Library,  and  copy  and  distribute  such modifications or work under the terms of Section 1 above,
       provided that you also meet all of these conditions:

          a. The modified work must itself be a software library.

          b) You must cause the files modified to carry prominent notices stating that you changed the files and
          the date of any change.

          c) You must cause the whole of the work to be licensed at no charge to all  third  parties  under  the
          terms of this License.

          d)  If a facility in the modified Library refers to a function or a table of data to be supplied by an
          application program that uses the facility, other than as an argument  passed  when  the  facility  is
          invoked,  then  you must make a good faith effort to ensure that, in the event an application does not
          supply such function or table, the facility still operates, and performs whatever part of its  purpose
          remains meaningful.

          (For  example,  a  function  in  a  library  to  compute  square  roots has a purpose that is entirely
          well-defined  independent  of  the  application.   Therefore,  Subsection   2d   requires   that   any
          application-supplied function or table used by this function must be optional: if the application does
          not supply it, the square root function must still compute square roots.)

       These  requirements apply to the modified work as a whole.  If identifiable sections of that work are not
       derived from the Library, and can be reasonably considered independent and separate works in  themselves,
       then  this  License,  and  its terms, do not apply to those sections when you distribute them as separate
       works.  But when you distribute the same sections as part of a  whole  which  is  a  work  based  on  the
       Library,  the distribution of the whole must be on the terms of this License, whose permissions for other
       licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

       Thus, it is not the intent of this section to claim  rights  or  contest  your  rights  to  work  written
       entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or
       collective works based on the Library.

       In  addition,  mere aggregation of another work not based on the Library with the Library (or with a work
       based on the Library) on a volume of a storage or distribution medium does not bring the other work under
       the scope of this License.

       3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a
       given copy of the Library.  To do this, you must alter all the notices that refer  to  this  License,  so
       that they refer to the ordinary GNU General Public License, version 2, instead of to this License.  (If a
       newer  version  than  version  2  of  the  ordinary GNU General Public License has appeared, then you can
       specify that version instead if you wish.)  Do not make any other change in these notices.

       Once this change is made in a given copy, it is irreversible for that copy, so the ordinary  GNU  General
       Public License applies to all subsequent copies and derivative works made from that copy.

       This  option is useful when you wish to copy part of the code of the Library into a program that is not a
       library.

       4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in  object
       code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the
       complete  corresponding  machine-readable  source  code,  which  must  be  distributed under the terms of
       Sections 1 and 2 above on a medium customarily used for software interchange.

       If distribution of object code is made by offering access to copy from a designated place, then  offering
       equivalent access to copy the source code from the same place satisfies the requirement to distribute the
       source code, even though third parties are not compelled to copy the source along with the object code.

       5.  A program that contains no derivative of any portion of the Library, but is designed to work with the
       Library by being compiled or linked with it, is called a "work that uses the Library".  Such a  work,  in
       isolation,  is  not  a  derivative  work  of  the  Library, and therefore falls outside the scope of this
       License.

       However, linking a "work that uses the Library"  with  the  Library  creates  an  executable  that  is  a
       derivative  of  the  Library (because it contains portions of the Library), rather than a "work that uses
       the library".  The executable is  therefore  covered  by  this  License.   Section  6  states  terms  for
       distribution of such executables.

       When  a  "work  that  uses the Library" uses material from a header file that is part of the Library, the
       object code for the work may be a derivative work of the Library even though  the  source  code  is  not.
       Whether  this  is true is especially significant if the work can be linked without the Library, or if the
       work is itself a library.  The threshold for this to be true is not precisely defined by law.

       If such an object file uses only numerical parameters, data structure layouts and  accessors,  and  small
       macros  and  small  inline  functions  (ten  lines or less in length), then the use of the object file is
       unrestricted, regardless of whether it is legally a derivative work.  (Executables containing this object
       code plus portions of the Library will still fall under Section 6.)

       Otherwise, if the work is a derivative of the Library, you may distribute the object code  for  the  work
       under the terms of Section 6.  Any executables containing that work also fall under Section 6, whether or
       not they are linked directly with the Library itself.

       6.  As  an  exception  to the Sections above, you may also compile or link a "work that uses the Library"
       with the Library to produce a work containing portions of the Library, and  distribute  that  work  under
       terms  of your choice, provided that the terms permit modification of the work for the customer's own use
       and reverse engineering for debugging such modifications.

       You must give prominent notice with each copy of the work that the Library is used in  it  and  that  the
       Library  and  its  use are covered by this License.  You must supply a copy of this License.  If the work
       during execution displays copyright notices, you must include the copyright notice for the Library  among
       them,  as  well  as a reference directing the user to the copy of this License.  Also, you must do one of
       these things:
          a) Accompany the work with the complete corresponding machine-readable source  code  for  the  Library
          including  whatever  changes  were  used in the work (which must be distributed under Sections 1 and 2
          above); and, if the work is an executable linked with the Library, with the complete  machine-readable
          "work  that  uses  the  Library",  as  object code and/or source code, so that the user can modify the
          Library and then relink to produce a modified executable containing  the  modified  Library.   (It  is
          understood  that  the  user  who  changes  the  contents  of definitions files in the Library will not
          necessarily be able to recompile the application to use the modified definitions.)

          b) Accompany the work with a written offer, valid for at least three years, to give the same user  the
          materials  specified  in  Subsection  6a, above, for a charge no more than the cost of performing this
          distribution.

          c) If distribution of the work is made by offering access to  copy  from  a  designated  place,  offer
          equivalent access to copy the above specified materials from the same place.

          d)  Verify  that the user has already received a copy of these materials or that you have already sent
          this user a copy.

       For an executable, the required form of the "work that uses  the  Library"  must  include  any  data  and
       utility  programs  needed  for  reproducing the executable from it.  However, as a special exception, the
       source code distributed need not include anything that is  normally  distributed  (in  either  source  or
       binary form) with the major components (compiler, kernel, and so on) of the operating system on which the
       executable runs, unless that component itself accompanies the executable.

       It  may  happen that this requirement contradicts the license restrictions of other proprietary libraries
       that do not normally accompany the operating system.  Such a contradiction means you cannot use both them
       and the Library together in an executable that you distribute.

       7. You may place library facilities that are a work based on the Library side-by-side in a single library
       together with other library facilities not covered by  this  License,  and  distribute  such  a  combined
       library,  provided  that  the  separate  distribution  of  the work based on the Library and of the other
       library facilities is otherwise permitted, and provided that you do these two things:
          a) Accompany the combined library with a copy of the same work based on the Library,  uncombined  with
          any other library facilities.  This must be distributed under the terms of the Sections above.

          b)  Give prominent notice with the combined library of the fact that part of it is a work based on the
          Library, and explaining where to find the accompanying uncombined form of the same work.

       8. You may not copy, modify, sublicense, link  with,  or  distribute  the  Library  except  as  expressly
       provided under this License.  Any attempt otherwise to copy, modify, sublicense, link with, or distribute
       the  Library  is void, and will automatically terminate your rights under this License.  However, parties
       who have received copies, or rights, from you under this License will not have their licenses  terminated
       so long as such parties remain in full compliance.

       9.  You  are  not  required  to accept this License, since you have not signed it.  However, nothing else
       grants you permission to modify or distribute the Library or its derivative  works.   These  actions  are
       prohibited by law if you do not accept this License.  Therefore, by modifying or distributing the Library
       (or  any  work  based on the Library), you indicate your acceptance of this License to do so, and all its
       terms and conditions for copying, distributing or modifying the Library or works based on it.

       10. Each time  you  redistribute  the  Library  (or  any  work  based  on  the  Library),  the  recipient
       automatically  receives a license from the original licensor to copy, distribute, link with or modify the
       Library subject to these terms and conditions.  You may  not  impose  any  further  restrictions  on  the
       recipients'  exercise  of the rights granted herein.  You are not responsible for enforcing compliance by
       third parties to this License.

       11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason
       (not limited to patent issues), conditions are imposed on you  (whether  by  court  order,  agreement  or
       otherwise)  that contradict the conditions of this License, they do not excuse you from the conditions of
       this License.  If you cannot distribute so as to  satisfy  simultaneously  your  obligations  under  this
       License  and any other pertinent obligations, then as a consequence you may not distribute the Library at
       all.  For example, if a patent license would not permit royalty-free redistribution of the Library by all
       those who receive copies directly or indirectly through you, then the only way you could satisfy both  it
       and this License would be to refrain entirely from distribution of the Library.

       If  any  portion  of this section is held invalid or unenforceable under any particular circumstance, the
       balance of the section is intended to apply, and the section as a whole is intended  to  apply  in  other
       circumstances.

       It  is  not  the  purpose  of  this section to induce you to infringe any patents or other property right
       claims or to contest validity of any such claims; this section has the sole  purpose  of  protecting  the
       integrity  of  the  free  software  distribution system which is implemented by public license practices.
       Many people have made generous contributions to the wide  range  of  software  distributed  through  that
       system in reliance on consistent application of that system; it is up to the author/donor to decide if he
       or  she  is  willing  to  distribute  software through any other system and a licensee cannot impose that
       choice.

       This section is intended to make thoroughly clear what is believed to be a consequence  of  the  rest  of
       this License.

       12. If the distribution and/or use of the Library is restricted in certain countries either by patents or
       by  copyrighted  interfaces,  the original copyright holder who places the Library under this License may
       add an explicit geographical distribution limitation excluding those countries, so that  distribution  is
       permitted  only  in  or  among  countries not thus excluded.  In such case, this License incorporates the
       limitation as if written in the body of this License.

       13. The Free Software Foundation may publish revised and/or new versions of the  Library  General  Public
       License  from  time to time.  Such new versions will be similar in spirit to the present version, but may
       differ in detail to address new problems or concerns.

       Each version is given a distinguishing version number.  If the Library specifies a version number of this
       License which applies to it and "any later version", you have the  option  of  following  the  terms  and
       conditions  either of that version or of any later version published by the Free Software Foundation.  If
       the Library does not specify a license version number, you may choose any version ever published  by  the
       Free Software Foundation.

       14.  If  you  wish  to  incorporate  parts  of  the  Library  into other free programs whose distribution
       conditions are incompatible with these, write to the author to ask for permission.  For software which is
       copyrighted by the Free Software Foundation, write to the Free Software  Foundation;  we  sometimes  make
       exceptions  for  this.  Our decision will be guided by the two goals of preserving the free status of all
       derivatives of our free software and of promoting the sharing and reuse of software generally.

       NO WARRANTY

       15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO  THE  EXTENT
       PERMITTED  BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
       PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
       BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.   THE
       ENTIRE  RISK  AS  TO  THE  QUALITY  AND PERFORMANCE OF THE LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE
       DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

       16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT  HOLDER,  OR
       ANY  OTHER  PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
       DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF  THE  USE  OR
       INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE
       OR  LOSSES  SUSTAINED  BY  YOU  OR  THIRD  PARTIES  OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER
       SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

AUTHOR

       fish-shell developers

COPYRIGHT

       2024, fish-shell developers

4.0                                               Apr 20, 2025                                       FISH-DOC(1)