Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
FISH-DOC(1)			  fish-shell			   FISH-DOC(1)

This is	the documentation for fish, the	friendly interactive shell.

A  shell  is  a	program	that helps you operate your computer by	starting other
programs. fish offers a	command-line interface focused on usability and	inter-
active use.

Some of	the special features of	fish are:

        Extensive UI: Syntax highlighting,  Autosuggestions,  tab  completion
	 and selection lists that can be navigated and filtered.

        No  configuration needed: fish	is designed to be ready	to use immedi-
	 ately,	without	requiring extensive configuration.

        Easy scripting: New functions can be added on the fly.	The syntax  is
	 easy to learn and use.

       This page explains how to install and set up fish and where to get more
       information.

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.

SETUP
       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  de-
       fault 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 (e.g. GNOME	Termi-
       nal, Apple's Terminal.app, or Konsole) to start fish directly. See  its
       configuration  and set the program to start to /usr/local/bin/fish (the
       exact path depends on how you installed fish).

       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	incor-
	  rect	PATH. Some operating systems, including	a number of Linux dis-
	  tributions, 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:

	     > command -v fish | sudo tee -a /etc/shells

       2. Change your default shell with:

	     > chsh -s "$(command -v fish)"

       To change it back to another shell, substitute fish with	bash, tcsh  or
       zsh as appropriate in the above command.

   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 ex-
       ecute them. For this, they are expected to have a first line, the  she-
       bang 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	speci-
       fying 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/con-
       fig.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  eas-
       ier.

       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 Matrix room <https://matrix.to/#/#fish-shell:matrix.org>

        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 one command  us-
       ing  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  uni-
       versal and exported. Typically it makes sense to	make an	exported vari-
       able 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 be-
       fore 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	inher-
       its. 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-in-
       teractive 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 ~/.con-
       fig/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 ac-
       tivated 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 started by  fish_config,	or  alter  the
       fish_color  family  of  environment  variables,	or use the fish_config
       theme subcommand, like:

	  > fish_config	theme show
	  # to demonstrate all the colorschemes
	  > fish_config	theme choose coolbeans
	  # to load the	"coolbeans" theme

   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 press alt-s, and it will recall your last comman-
       dline with sudo prefixed	(or toggle a sudo prefix on the	 current  com-
       mandline	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  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 re-
	 called	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 substi-
       tution. Here's !! only:

	  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  new-
       lines, 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,	split-
       ting 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 only	interested in success or failure, you can run the com-
       mand 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 in-
       formation.

   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  re-
       ceiving 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 "Con-
       nection 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 it-
       self 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 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_ambigu-
	 ous_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	termi-
	 nal'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.

   fish	does not work in a specific terminal
       The terminal might not meet all of fish's requirements.	Please	report
       this to your terminal's and to fish's issue tracker.

   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, 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 Lan-
       guage 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-tu-
       torial.

   Autosuggestions
       fish  suggests  commands	as you type, based on command history, comple-
       tions, and valid	file paths. As you type	commands, you will see a  sug-
       gestion	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,  ig-
       nore 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 effi-
       cient 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	exactly	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 comple-
       tions. 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 comple-
	 tions.

        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,	like functions are.  The  dif-
       ference	is the $fish_complete_path list	is used	instead	of $fish_func-
       tion_path.  Typically  you  can	drop  new   completions	  in   ~/.con-
       fig/fish/completions/name-of-command.fish and fish will find them auto-
       matically.

   Syntax highlighting
       Fish  interprets	 the command line as it	is typed and uses syntax high-
       lighting	to provide feedback. The most important	feedback is the	detec-
       tion 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 vari-
       ables 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 from fish:

	  # disable nearly all coloring
	  fish_config theme choose none
	  # restore fish's default theme
	  fish_config theme choose default

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

	  fish_config theme show

       To  update  the	theme  of  all shell sessions without restarting them,
       first have those	sessions define	an event handler by adding the follow-
       ing to your config.fish and restarting them:

	  function apply-my-theme --on-variable=my_theme
	      fish_config theme	choose $my_theme
	  end

       Then, set the corresponding universal variable from any session:

	  > set	-U my_theme lava
	  > set	-U my_theme snow-day

   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.   Options
       accepted	 by  set_color	like  --background=, --bold, --dim, --italics,
       --reverse, --underline and --underline-color= 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	|
	  |	   fish_color_keyword	   | falls  back on the	command	|
	  |				   | color if unset		|
	  +--------------------------------+----------------------------+
	  |				   | quoted text like "abc"	|
	  |	   fish_color_quote	   |				|
	  +--------------------------------+----------------------------+
	  |				   | IO	   redirections	   like	|
	  |	   fish_color_redirec-	   | >/dev/null			|
	  |	   tion			   |				|
	  +--------------------------------+----------------------------+
	  |				   | process  separators like ;	|
	  |	   fish_color_end	   | and &			|
	  +--------------------------------+----------------------------+
	  |				   | syntax errors		|
	  |	   fish_color_error	   |				|
	  +--------------------------------+----------------------------+
	  |				   | ordinary  command	parame-	|
	  |	   fish_color_param	   | ters			|
	  +--------------------------------+----------------------------+
	  |				   | parameters	and redirection	|
	  |	   fish_color_valid_path   | targets that are filenames	|
	  |				   | (if the file exists)	|
	  +--------------------------------+----------------------------+
	  |				   | options starting with "-",	|
	  |	   fish_color_option	   | up	to the first "--" para-	|
	  |				   | meter			|
	  +--------------------------------+----------------------------+
	  |				   | comments  like  '#	 impor-	|
	  |	   fish_color_comment	   | tant'			|
	  +--------------------------------+----------------------------+
	  |				   | selected text in vi visual	|
	  |	   fish_color_selection	   | mode			|
	  +--------------------------------+----------------------------+
	  |				   | parameter expansion opera-	|
	  |	   fish_color_operator	   | tors like * and ~		|
	  +--------------------------------+----------------------------+
	  |				   | character escapes like  \n	|
	  |	   fish_color_escape	   | and \x70			|
	  +--------------------------------+----------------------------+
	  |				   | autosuggestions  (the pro-	|
	  |	   fish_color_autosug-	   | posed rest	of a command)	|
	  |	   gestion		   |				|
	  +--------------------------------+----------------------------+
	  |				   | the current working direc-	|
	  |	   fish_color_cwd	   | tory in the default prompt	|
	  +--------------------------------+----------------------------+
	  |				   | the current working direc-	|
	  |	   fish_color_cwd_root	   | tory in the default prompt	|
	  |				   | for the root user		|
	  +--------------------------------+----------------------------+
	  |				   | the username  in  the  de-	|
	  |	   fish_color_user	   | fault prompt		|
	  +--------------------------------+----------------------------+
	  |				   | the  hostname  in	the de-	|
	  |	   fish_color_host	   | fault prompt		|
	  +--------------------------------+----------------------------+
	  |				   | the hostname  in  the  de-	|
	  |	   fish_color_host_re-	   | fault  prompt  for	 remote	|
	  |	   mote			   | sessions (like ssh)	|
	  +--------------------------------+----------------------------+
	  |				   | the last command's	nonzero	|
	  |	   fish_color_status	   | exit code in  the	default	|
	  |				   | prompt			|
	  +--------------------------------+----------------------------+
	  |				   | the  '^C'	indicator  on a	|
	  |	   fish_color_cancel	   | canceled command		|
	  +--------------------------------+----------------------------+
	  |				   | history search matches and	|
	  |	   fish_color_search_match | selected	 pager	  items	|
	  |				   | (background only)		|
	  +--------------------------------+----------------------------+
	  |				   | the  current  position  in	|
	  |	   fish_color_history_cur- | the history  for  commands	|
	  |	   rent			   | like dirh and cdh		|
	  +--------------------------------+----------------------------+

       If a variable isn't set or is empty after subtracting any --theme=THEME
       options,	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 |
	 |	  fish_pager_color_progress | bottom left corner	 |
	 +----------------------------------+----------------------------+
	 |				    | the  background color of a |
	 |	  fish_pager_color_back-    | line			 |
	 |	  ground		    |				 |
	 +----------------------------------+----------------------------+
	 |				    | the  prefix  string,  i.e. |
	 |	  fish_pager_color_prefix   | the  string  that	is to be |
	 |				    | completed			 |
	 +----------------------------------+----------------------------+
	 |				    | the   completion	 itself, |
	 |	  fish_pager_color_comple-  | i.e.  the	proposed rest of |
	 |	  tion			    | the string		 |
	 +----------------------------------+----------------------------+
	 |				    | the completion description |
	 |	  fish_pager_color_descrip- |				 |
	 |	  tion			    |				 |
	 +----------------------------------+----------------------------+
	 |				    | background of the	selected |
	 |	  fish_pager_color_se-	    | completion		 |
	 |	  lected_background	    |				 |
	 +----------------------------------+----------------------------+
	 |				    | prefix  of  the	selected |
	 |	  fish_pager_color_se-	    | completion		 |
	 |	  lected_prefix		    |				 |
	 +----------------------------------+----------------------------+
	 |				    | suffix   of  the	selected |
	 |	  fish_pager_color_se-	    | completion		 |
	 |	  lected_completion	    |				 |
	 +----------------------------------+----------------------------+
	 |				    | description  of  the   se- |
	 |	  fish_pager_color_se-	    | lected completion		 |
	 |	  lected_description	    |				 |
	 +----------------------------------+----------------------------+
	 |				    | background of every second |
	 |	  fish_pager_color_sec-	    | unselected completion	 |
	 |	  ondary_background	    |				 |
	 +----------------------------------+----------------------------+
	 |				    | prefix of	every second un- |
	 |	  fish_pager_color_sec-	    | selected completion	 |
	 |	  ondary_prefix		    |				 |
	 +----------------------------------+----------------------------+
	 |				    | suffix of	every second un- |
	 |	  fish_pager_color_sec-	    | selected completion	 |
	 |	  ondary_completion	    |				 |
	 +----------------------------------+----------------------------+
	 |				    | description  of every sec- |
	 |	  fish_pager_color_sec-	    | ond unselected completion	 |
	 |	  ondary_description	    |				 |
	 +----------------------------------+----------------------------+

       When the	secondary or selected variables	aren't set or are  empty,  the
       normal  variables are used, except for $fish_pager_color_selected_back-
       ground, 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	 posi-
       tion  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 eas-
       ier 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  be-
       fore  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 out-
       put  on	the  right  side  of the terminal.  For	vi mode, the output of
       fish_mode_prompt	will be	prepended on the left.

       If fish_transient_prompt	is set to 1, fish will redraw the prompt  with
       a --final-rendering argument before running a commandline, allowing you
       to change it before pushing it to the scrollback.

       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  re-
	    quires 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
       Most  terminals allow setting 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 cur-
       rently running command (unless it is fish) and the current working  di-
       rectory.	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	short-
       cuts  (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  im-
       plementation.  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  to-
	 ken 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  autosugges-
	 tion 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 left or right by one ar-
	 gument	(or one	word on	macOS).	 If the	command	line  is  empty,  they
	 move forward/backward in the directory	history.  If the cursor	is al-
	 ready	at  the	 end  of the line, and an autosuggestion is available,
	 alt-right () (or alt-f) accepts the first argument (or	word on	macOS)
	 in the	suggestion.

        ctrl-left () and ctrl-right ()	move the cursor	left or	right  by  one
	 word.	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 his-
	 tory searching.

        alt-up	() and alt-down	() search the command history for  the	previ-
	 ous/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  com-
	 mand 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	pushes any text	above the prompt to the	terminal's scrollback,
	 then clears and repaints the screen.

        ctrl-w	removes	the previous path component (everything	up to the pre-
	 vious "/", ":"	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 moves the next word to the Copy and paste (Kill Ring).

        ctrl-delete moves the next word (or next argument on  macOS)  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 (or	word on	macOS) 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  di-
	 rectory 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  cur-
	 sor.  The  result is that the output of the command will be paged. If
	 you set the PAGER variable, its value is used instead of less.

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

        alt-e edits the current command line in an external editor. The  edi-
	 tor  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.	If  sudo  is  not  in-
	 stalled, various similar commands are tried: doas, please, and	run0.

        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 for-
	 ward/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 back-
	 wards respectively.

        ctrl-backspace	 removes  one word backwards and alt-backspace removes
	 one argument backwards.  On macOS, it's the other way round.

        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 se-
	 lected.

       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.  Ini-
       tially, 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 in-
       dicator 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/func-
       tions/fish_mode_prompt.fish.  (Bindings	that  change the mode are sup-
       posed 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 parame-
       ters 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 con-
	 taining 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	infor-
	 mation	 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 mode

        O (capital-"o") inserts a new line above the current one  and	enters
	 insert	mode

        0  (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 con-
	 taining 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	match-
	 ing 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 / G moves the cursor to the beginning/end of the commandline, re-
	 spectively.

        ~ toggles the case (upper/lower) of the character and	moves  to  the
	 next character.

        g,u lowercases	to the end of the word.

        g,U uppercases	to the end of the word.

        :,q exits fish.

   Insert mode
        escape	enters command mode.

        backspace removes one character to the	left.

        ctrl-n	accepts	the autosuggestion.

   Visual mode
        left  (```)  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  en-
	 ter 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.

        g,u lowercases	the selection, and enters command mode.

        g,U uppercases	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:

	  # Prints ``^C`` and a	new prompt
	  bind ctrl-c cancel-commandline

       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  de-
       fault, you can 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 in-
       distinguishable	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 se-
       quence 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	termi-
       nal.  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 con-
       figurable 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	subse-
       quence 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  po-
       sition 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 func-
       tions  [3])  and	 via the terminal's paste function, for	which fish en-
       ables "Bracketed	Paste Mode", so	it can tell a paste from manually  en-
       tered  text.   In  addition,  when pasting inside single	quotes,	pasted
       single quotes and backslashes are automatically escaped so that the re-
       sult can	be used	as a single token 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 ar-
       row 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	press-
       ing 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 his-
       tory 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 per-
       formed, but instead of searching	for a complete commandline, each  com-
       mandline	 is broken into	separate elements like it would	be before exe-
       cution, 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 en-
       tries 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 re-
       fine 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_his-
       tory (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>_his-
       tory  file); both before	starting the shell and while the shell is run-
       ning.

       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_pri-
       vate_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 in-
       formation (e.g. for screencasts)	or when	dealing	with sensitive	infor-
       mation.

       You  can	 query	the variable fish_private_mode (if test	-n "$fish_pri-
       vate_mode" ...) if you would like to respect the	user's wish  for  pri-
       vacy 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 cur-
	 rent 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  exe-
       cuted 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  re-
       peating	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" com-
	 mand, 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 sepa-
       rating them with	semicolons.

       A switch	is a very common special type of argument. Switches almost al-
       ways start with one or more hyphens - and alter the way a command oper-
       ates.  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  com-
       mand'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-com-
       mand-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 charac-
       ters 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	expan-
       sion or parameter expansion) is performed, and  escape  sequences  (for
       example,	\n) are	ignored. Within	quotes,	whitespace is not used to sep-
       arate arguments,	allowing quoted	arguments to contain spaces.

       The only	meaningful escape sequences in single quotes are \', which es-
       capes  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-some-
       thing".

   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 in-
	 valid strings.	Typically fish is run with the ASCII or	 UTF-8	encod-
	 ing, 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  se-
	 quence	 generated  by pressing	the control key	and the	specified let-
	 ter. 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 ex-
       ample, 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 lat-
       ter 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 key-
	 board.

        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 redi-
       rection.	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	desti-
	 nation	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_out-
       put.txt redirects both stdout and stderr	to  the	 file  all_output.txt.
       This  is	 equivalent to echo hello > all_output.txt 2>&1.  You can also
       use &>> to append both stdout and stderr	to the same destination.

       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>>DESTINA-
	 TION_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  de-
       scriptor	above 2. However this is supported for external	commands.

       [1]  Previous  versions of fish also allowed specifying this as ^DESTI-
	    NATION, but	that made another character special so it  was	depre-
	    cated 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  descrip-
       tors 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:

	  # 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 it 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	inter-
       face.

       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 com-
       mand will not execute correctly.

       If the &	character is followed by a non-separating character, it	is not
       interpreted  as	background  operator. Separating characters are	white-
       space 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  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 passed on to the ls  com-
       mand. 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 be-
       havior 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 com-
       mand. Unlike other shells, this just makes functions - fish has no sep-
       arate concept of	an "alias", we just use	the word for a simple wrapping
       function	like this. alias immediately creates a function. Consider  us-
       ing  alias  --save or funcsave to save the created function into	an au-
       toload file instead of recreating the alias each	time.

       For an alternative, try abbreviations. These are	 words	that  are  ex-
       panded  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	 auto-
	 matically 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 con-
       sisting 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 ~/.con-
	 fig/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	~/.lo-
	 cal/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/lo-
	 cal/share/fish/vendor_functions.d.

       If   you	  are  unsure,	your  functions	 probably  belong  in  ~/.con-
       fig/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 func-
       tions 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  in-
       stallation  system should support a custom path to override the pkgcon-
       fig 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, 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 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:

	  # Check 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 com-
       mand 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 de-
       termine 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 execute step-by-step, so it isn't recommended to build	longer
       chains of them because they might do something  you  don't  want.  Con-
       sider:

	  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 $sta-
       tus 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
       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  ex-
       pansions:

        Wildcards, to create filenames	from patterns -	*.jpg

        Variable expansion, to	use the	value of a variable - $HOME

        Command  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,}/bin

        Tilde	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 de-
	 scends	into subdirectories. If	** is a	segment	by itself,  that  seg-
	 ment 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 be an ordi-
	 nary 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 directo-
	 ries 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 be-
       havior  is like what bash does with shopt -s failglob. There are	excep-
       tions, namely set and path, overriding variables	 in  overrides,	 count
       and for.	Their globs will instead expand	to zero	arguments (so the com-
       mand 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 char-
       acter 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	expan-
       sion". This is the replacing of a dollar	sign ($) followed by  a	 vari-
       able name with the _value_ of that variable.

       A simple	example:

	  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 de-
       fault 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 (:)  in-
       stead [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	Split-
       ting", 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 vari-
       able 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 "derefer-
       ence" 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[2] 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  syntacti-
       cal 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  com-
       mand 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 argu-
       ments 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 pass it
       via a pipe, like:

	  grep fish myanimallist1 | wc -l

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

	  # Compare only 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 1 GiB 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  use-
       less  and  harmful. This	limit can be adjusted with the fish_read_limit
       variable	(0 meaning no limit). This limit also affects  the  read  com-
       mand.

       [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 surround-
       ing  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, like a bare `echo`.

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

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

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

       The very	first character	of a command token is never interpreted	as ex-
       panding brace, because it's the beginning of a compound statement:

	  > {echo hello, && echo world}
	  hello,
	  world

   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	direc-
       tories 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	disap-
       pearing	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 substi-
       tution 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 in-
       dex.

       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 cur-
       rently 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 re-
       sult 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  com-
       mand 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 expansion	| echo $foo	      |
	     +------------+---------------------+---------------------+
	     | $() and () | Command   substitu-	| cat (grep foo	 bar) |
	     |		  | tion		| or  cat  $(grep foo |
	     |		  |			| bar)		      |
	     +------------+---------------------+---------------------+
	     | < and >	  | Redirection,   like	| git shortlog -nse . |
	     |		  | command > file	| > authors	      |
	     +------------+---------------------+---------------------+
	     | |	  | Pipe,  connect  two	| foo |	 grep  bar  | |
	     |		  | or more commands	| grep baz	      |
	     +------------+---------------------+---------------------+
	     | ;	  | End	of the command,	| command1; command2  |
	     |		  | instead  of	 a new-	|		      |
	     |		  | line		|		      |
	     +------------+---------------------+---------------------+
	     | &	  | Backgrounding	| sleep	5m &	      |
	     +------------+---------------------+---------------------+
	     | {}	  | Brace expansion	| ls {/usr,}/bin      |
	     +------------+---------------------+---------------------+
	     | && and ||  | Combiners		| mkdir	foo && cd foo |
	     |		  |			| or rm	foo || exit   |
	     +------------+---------------------+---------------------+
	     | * and **	  | Wildcards		| cat *.fish or	count |
	     |		  |			| **.jpg	      |
	     +------------+---------------------+---------------------+
	     | \\	  | Escaping		| echo	foo\nbar   or |
	     |		  |			| echo \$foo	      |
	     +------------+---------------------+---------------------+
	     | '' and ""  | Quoting		| rm	"file	 with |
	     |		  |			| spaces"   or	 echo |
	     |		  |			| '$foo'	      |
	     +------------+---------------------+---------------------+
	     | ~	  | Home  directory ex-	| ls ~/	or ls ~root/  |
	     |		  | pansion		|		      |
	     +------------+---------------------+---------------------+
	     | #	  | Comments		| echo 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 ex-
       ported 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 af-
	 ter 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 com-
	 mands 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	--uni-
       versal  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 vari-
	 able  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 vari-
	 able 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

       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  per-
       sistently  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 simi-
       lar). 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.  All changes to  universal	 vari-
       ables are persistent and	instantly propagated across fish sessions.

       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  in-
       stead.

       Do  not	append	to  universal  variables in config.fish, because these
       variables will then get longer with each	new shell  instance.  Instead,
       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	 vari-
       ables  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  in-
       clude 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  export-
       ing  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 vari-
       able didn't exist yet it	is not exported.

       As  a  naming convention, exported variables are	in uppercase and unex-
       ported 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-ex-
       ported 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 ac-
       cessible	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 in-
       valid index is silently ignored resulting in  no	 value	(not  even  an
       empty string, 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,	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 exam-
       ple, 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 ele-
       ment as one argument, so	once you've set	your list, you can 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 er-
       ror-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 posi-
       tional 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-de-
       limited	path  lists  including	PATH,  CDPATH,	MANPATH,   PYTHONPATH,
       LANGUAGE	 (for  localization)  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 MY-
       PATH 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
	      Locale variables such as LANG, LC_ALL,  LC_MESSAGES,  LC_NUMERIC
	      and  LC_TIME  set	 the language option for the shell and subpro-
	      grams.  See the section Locale variables and status language 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 0, fish will not output 24-bit	RGB true-color
	      sequences	but the	nearest	color on the 256 color palette (or the
	      16 color palette,	if fish_term256	is 0).	 See  also  set_color.
	      The  default  is	1 but for historical reasons, fish defaults to
	      behaving as if it	was 0 on some terminals	that are known to  not
	      support true-color sequences.

       fish_term256
	      If  this is set to 0 and fish_term24bit is 0, translate RGB col-
	      ors down to the 16 color palette.	 Also, if this is  set	to  0,
	      set_color	 commands such as set_color ff0000 red will prefer the
	      named color.

       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 "spe-
	      cial" 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_transient_prompt
	      If this is set to	1, fish	 will  redraw  prompts	with  a	 --fi-
	      nal-rendering  argument  before  running a commandline, allowing
	      you to change it before pushing it to the	scrollback.  This  en-
	      ables transient prompts.

       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 dis-
	      able.

       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 es-
	      cape sequence. The default is 30ms. Increasing it	increases  the
	      latency  but allows pressing escape instead of alt for alt+char-
	      acter 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 se-
	      quences.

       fish_complete_path
	      determines  where	fish looks for completion. When	trying to com-
	      plete 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 com-
	      plicated changes (see funced)

       fish_history
	      the current history session name.	If set,	 all  subsequent  com-
	      mands  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.  Set
	      it to all	to also	trace execution	of key	bindings,  event  han-
	      dlers as well as prompt and title	functions.

       FISH_DEBUG
	      Controls	which debug categories fish enables for	output,	analo-
	      gous 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	depre-
	      cated, and the use of status current-command is preferred).

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

       argv_opts
	      argparse sets this to the	list of	successfully  parsed  options,
	      including	option-arguments. 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 val-
	      ues  are	only used by fish if the operating system does not re-
	      port 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 sub-
	      stitution.

       fish_pid
	      the process ID (PID) of the shell.

       fish_terminal_color_theme
	      a	read-only variable; set	to light or  dark  when	 the  terminal
	      uses a light or dark color theme respectively; set to unknown if
	      the  terminal does not report its	colors.	 Like status terminal,
	      this is only populated once  the	first  interactive  prompt  is
	      shown.  This is used in an --on-variable event handler to	update
	      syntax  highlighting  variables  whenever	 the  terminal's color
	      theme changes.  See here for how to specify light	and dark vari-
	      ants in your theme.

       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	 vari-
	      able 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 interac-
	      tive shells, otherwise it	only 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  ex-
	      ample, background	jobs will not increment	this).

       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 vari-
       ables, 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 ex-
       ported 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 ex-
       ecuted 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  per-
	 formed	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 wild-
	 cards in the command produced any matches.

        125 means that	while an executable with the specified	name  was  lo-
	 cated,	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  ex-
       ample 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", de-
       pending 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.
       In  UNIX,  these	are made up of several categories. The categories used
       by fish are:

       LANG   This is the typical environment variable for  specifying	a  lo-
	      cale.  A user may	set this variable to express the language they
	      speak,  their  region,  and  a character encoding.  The encoding
	      part is ignored, fish always assumes UTF-8.  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.

	      Example  values  are  en_US.UTF-8	 for  the  American English or
	      de_AT.UTF-8 for Austrian German.	Your  operating	 system	 might
	      have  a  locale  command that you	can call as locale -a to see a
	      list of defined locales.

       LANGUAGE
	      This is treated like LC_MESSAGES except that it can hold	multi-
	      ple values, which	allows to specify a priority list of languages
	      for  translation.	  It's	a  PATH	 variable, like	in GNU gettext
	      <https://www.gnu.org/software/gettext/manual/html_node/The-LAN-
	      GUAGE-variable.html>.

	      Language identifiers without a region specified (e.g. zh)	result
	      in all available variants	of this	language being tried in	 arbi-
	      trary  order.  In	this example, we might first look for messages
	      in the zh_CN catalog,  followed  by  zh_TW,  or  the  other  way
	      around.	This  is different from	GNU gettext, which uses	a "de-
	      fault" variant of	the language instead.  If you prefer a certain
	      variant, specify it earlier in the list, e.g. zh_TW:zh  if  your
	      preferred	 language  is zh_TW, and you prefer any	other variants
	      of zh over the English default.  If zh_TW	is the only variant of
	      zh you want, specifying zh_TW in the LANGUAGE variable will  re-
	      sult  in	messages  which	 are not available in zh_TW being dis-
	      played in	English.

	      See also builtin _ (underscore).

       LC_ALL Overrides	the LANG and all other	LC_*  variables.   Please  use
	      LC_ALL only as a temporary override.

       LC_MESSAGES
	      Determines  the  language	 in  which messages are	displayed, see
	      builtin _	(underscore).

       LC_NUMERIC
	      Sets the locale for formatting numbers.

       LC_TIME
	      Determines how date and time are displayed.  Used	in the history
	      builtin.

   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 cur-
       rent 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
       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  re-
	 served	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  (be-
       cause 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	~/.lo-
	     cal/share/fish, controlled	by the XDG_DATA_HOME environment vari-
	     able)

	    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 be-
	 fore "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  configura-
       tion  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 in-
       stall 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 in-
       stance 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 be-
       come 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
	  mark-prompt		  on  4.0 write	OSC 133	prompt markers to the terminal
	  ignore-terminfo	  on  4.1 do not look up $TERM in terminfo database
	  query-term		  on  4.1 query	the TTY	to enable extra	functionality
	  omit-term-workarounds	  off 4.3 skip workarounds for incompatible terminals

       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 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  de-
	 fault	in  3.5).  It  makes it	so a & is 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 in-
	 troduced  in  4.0.  To	get fish's pid,	you can	use the	fish_pid vari-
	 able.

        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.

        mark-prompt makes fish	report to the terminal the beginning  and  and
	 of both shell prompts and command output.

        ignore-terminfo  disables  lookup  of $TERM in	the terminfo database.
	 Use no-ignore-terminfo	to turn	it back	on.

        query-term allows fish	to query the terminal by  writing  escape  se-
	 quences  and  reading the terminal's response.	 This enables features
	 such as scrolling.  If	you use	an incompatible	terminal, you  can  --
	 for  the  time	 being	--  work  around  it by	running	(once) set -Ua
	 fish_features no-query-term.

        omit-term-workarounds prevents	fish from trying to work around	incom-
	 patible terminals.

       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  spe-
       cific  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 dis-
	 played.

        fish_preexec is emitted right before executing	 an  interactive  com-
	 mand.	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  com-
	 mand.	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  de-
       fined 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 docu-
       mentation 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 re-
       sume normal execution of	the script, type exit or ctrl-d.

       To  start  a debug session 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  exe-
       cuted.

       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_tab_title	to change the terminal tab'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  reposi-
	 tory.

        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 configura-
	 tion.

        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.

       This only works with messages which are translated as  part  of	fish's
       own sources, so using it	as part	of your	own fish scripts which are not
       upstreamed  into	the fish repo will not work unless the exact same mes-
       sage also exists	upstream.

       It requires fish	to be built with gettext support. If that  support  is
       disabled	or there is no translation it will echo	the argument back.

       The language depends on the current locale, set with LANG, LC_MESSAGES,
       LC_ALL,	and  LANGUAGE.	These variables	do not have to be exported for
       fish to use them, and fish's variable scopes are	supported.   If	 other
       programs	 launched  via fish should respect these locale	variables they
       have to be exported to make them	available outside of fish.

       For LANGUAGE you	can use	a list,	or use	colons	to  separate  multiple
       languages.

       If  the status language set command was used, its arguments specify the
       language	precedence, and	the environment	variables are ignored.

   Options
       _ takes no options.

   Examples
       Use German translations:

	  > set	LANG de_DE.UTF-8
	  > _ file
	  Datei

       Specify a precedence of languages (only works with LANGUAGE):

	  > set	LANGUAGE pt de
	  > _ file  # This message has a Portuguese translation.
	  arquivo
	  > _ "Invalid arguments"  # This message does not have	a Portuguese translation, but a	German one.
	  Ungltige Argumente
	  > _ untranslatable  #	No translation in Portuguese, nor in German.
	  untranslatable

       Note  that  the	specific  examples  may	 change	 if  translations  are
       added/modified.

   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 [ [-c | --command COMMAND]... ] NAME ...
       abbr --rename [ [-c | --command COMMAND]... ] OLD_WORD NEW_WORD
       abbr [--show] [--color WHEN]
       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  ex-
	  panded in scripts.

       For example, a frequently-run command like git checkout can be abbrevi-
       ated  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 bind-
       ing 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	expan-
       sion function interprets	them. See the Examples section.

       Changed in version 3.6.0: Previous versions of this allowed saving  ab-
       breviations  in universal variables.  That's no longer possible.	Exist-
       ing 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 do-
       ing 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 abbrevia-
       tions 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 COM-
       MAND means it will expand only when there is no command.	--command  im-
       plies  --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	inter-
       preted 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 ab-
       breviation 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 func-
       tion. 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	direc-
       tory, 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	[ [-c |	--command COMMAND]... ]	OLD_NAME NEW_NAME

       Renames an abbreviation,	from OLD_NAME to NEW_NAME.   For  command-spe-
       cific  abbreviations,  the --command options must be provided to	disam-
       biguate which abbreviation to rename.

	  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] [	[-c | --command	COMMAND]... ] NAME ...

       Erases the abbreviation with the	given name.  For command-specific  ab-
       breviations,  the  --command  options  must be provided to disambiguate
       which abbreviation to rename.

	  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  documen-
       tation 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 us-
       ing 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 ap-
	 pends $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 configu-
	      ration directory using funcsave.

   Example
       The following code will create rmi, which runs rm with additional argu-
       ments 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 Also
        or 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 ar-
       guments.	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 op-
       tions with their	values,	sets $argv_opts	to the options and their  val-
       ues,  and  sets $argv to	the remaining arguments. See the usage section
       below.

       Each option specification (OPTION_SPEC) is written in the  domain  spe-
       cific  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 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 NAME
	      Use NAME 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 mutu-
	      ally  exclusive options.	You give either	the short or long ver-
	      sion 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 de-
	      fault is zero.

       -X or --max-args	NUMBER
	      The maximum number of acceptable non-option arguments.  The  de-
	      fault is infinity.

       -u or --move-unknown
	      Allow  unknown  options, and move	them from $argv	to $argv_opts.
	      By default, Unknown options are treated as if they take optional
	      arguments	(i.e. have option spec =?).

	      The above	means that if a	group of short options contains	an un-
	      known short option followed by a known short option,  the	 known
	      short  option is treated as an argument to the unknown one (e.g.
	      --move-unknown h -- -oh will treat h as the argument to -o,  and
	      so  _flag_h  will	not be set).  In contrast, if the known	option
	      comes first (and does not	take any arguments), the known	option
	      will  be	recognised (e.g. argparse --move-unknown h -- -ho will
	      set $_flag_h to -h)

       -i or --ignore-unknown
	      Deprecated. This is like --move-unknown, except that unknown op-
	      tions and	their arguments	are kept in $argv  and	not  moved  to
	      $argv_opts. Unlike --move-unknown, this option makes it impossi-
	      ble  to distinguish between an unknown option and	non-option ar-
	      gument that starts with a	- (since any  --  seperator  in	 $argv
	      will be removed).

       -S or --strict-longopts
	      This  makes the parsing of long options more strict. In particu-
	      lar, without this	flag, if long is a  known  long	 option	 flag,
	      --long and --long=<value>	can be abbreviated as:

	      	-long and -long=<value>, but only if there is no short flag l.

	      	--lo and --lo=<value>, but only	if there is no other long flag
		that starts with lo. Similarly with any	other non-empty	prefix
		of long.

	      	-lo and	-lo=<value> (i.e. combining the	above two).

	      With  the	 --strict-longopts flag, the above three are parse er-
	      rors: one	must use the syntax --long or --long=<value> to	use  a
	      long option called long.

	      This flag	has no effect on the parsing of	unknown	options	(which
	      are parsed as if this flag is on).

	      This option may be on all	the time in the	future,	so do not rely
	      on the behaviour without it.

       --unknown-arguments KIND
	      This  option  implies --move-unknown, unless --ignore-unknown is
	      also given.  This	will modify the	parsing	behaviour  of  unknown
	      options depending	on the value of	KIND:

		  optional  (the default), allows each	unknown	option to take
		   an optional argument	(i.e. as if it had =? or =* in its op-
		   tion	specification).	For example, argparse --ignore-unknown
		   --unknown-arguments=optional	ab  --	-u  -a	-ub  will  set
		   _flag_a but not _flag_b, as the b is	treated	as an argument
		   to the second use of	-u.

		  required  requires  each unknown option to take an argument
		   (i.e. as if it had =	or =+ in its option specification). If
		   the	above  example	was  changed  to  use  --unknown-argu-
		   ments=required,  neither  _flag_a nor _flag_b would be set:
		   the -a will be treated as an	argument to the	first  use  of
		   -u, and the b as an argument	to the second.

		  none	 forbids  each	unknown	option from taking an argument
		   (i.e. as if it had no = in its  option  specification).  If
		   the	above  example	was  changed  to  use  --unknown-argu-
		   ments=none, both _flag_a and	_flag_b	would be set, as  nei-
		   ther	use of -u will be passed as taking an argument.

		 Note  that  the above assumes that unknown long flags use the
		 -- "GNU-style"	(e.g. if KIND is none, and  there  is  no  bar
		 long  option, -bar is interpreted as three short flags, b, a,
		 and r;	but if bar is known,  -bar  is	treated	 the  same  as
		 --bar).

		 When  using --unknown-arguments=required, you will get	an er-
		 ror if	the provided arguments end in an unknown option, since
		 it has	no argument. Similarly,	with --unknown-arguments=none,
		 you will get an error if you use the --flag=value syntax  and
		 flag is an unknown option.

       -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 sepa-
       rate the	option specifications and options  to  argparse	 itself	 (like
       --move-unknown) from the	command	arguments, so it is required.

   Option Specifications
       Each option specification consists of:

        An optional alphanumeric short	flag character.

        An  optional  long flag name preceded by a /. If neither a short flag
	 nor long flag are present, an error is	reported.

	     If there is no short flag, and the long flag name	is  more  than
	      one character, the / can be omitted.

	     For  backwards  compatibility,  if  there	 is a short and	a long
	      flag, a -	can be used in place of	the /, if the  short  flag  is
	      not to be	usable by users	(in which case it will also not	be ex-
	      posed as a flag variable).

        Nothing  if the flag is a boolean that	takes no argument or is	an in-
	 teger 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, or

	     =*  if  it takes an optional value and each instance of the flag
	      is saved,	storing	the empty string when the flag was not given a
	      value.

        Optionally a &, indicating that the option and	 any  attached	values
	 are  not to be	saved in $argv or $argv_opts. This does	not affect the
	 the _flag_ variables.

        Nothing if the	flag is	a boolean that takes no	argument, or

	     !	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 er-
	      ror 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 cre-
       ate 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	=? or =* 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 some-
       thing entirely different. You can always	do this	after argparse returns
       but you can also	request	that argparse perform the validation  by  exe-
       cuting  arbitrary  fish script. To do so	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  op-
       tion  like  this:  m/max=!_validate_int --min 0 --max 5.	The default if
       you call	_validate_int without those flags is to	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.

        help&	is  similar (it	will remove --help from	$argv),	the difference
	 is that --help` will not placed in $argv_opts.

        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  op-
	 tional	 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.

        n/name=* is similar, but the flag can be used more than once. If  the
	 flag  is seen then _flag_n and	_flag_name will	be set with the	values
	 associated with each occurence. Each value will be the	value given to
	 the option, or	the empty string if no value was given.

        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 is similar,	but only --x is	valid (instead of -x).

        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 pre-
	 fixing	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 pre-
	 fixing	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_lon-
	 gonly.

       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.
       Similarly, the argv_opts	variable is set	with local scope to the	 argu-
       ments that were consumed	during flag processing.	This allows forwarding
       $argv_opts to another command, together with additional arguments.

       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 supports 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

       An example of using $argv_opts to forward known options to another com-
       mand, whilst adding new options:

	  function my-head
	      #	The following option is	the only existing one to head that takes arguments
	      #	(we will forward it verbatim).
	      set -l opt_spec n/lines=
	      #	--qwords is a new option, but --bytes is an existing one which we will modify below
	      set -a opt_spec "qwords=&" "c/bytes=&"
	      argparse --strict-longopts --move-unknown	--unknown-arguments=none $opt_spec -- $argv || return
	      if set -q	_flag_qwords
		  # --qwords allows specifying the size	in multiples of	8 bytes
		  set -a argv_opts --bytes=(math -- $_flag_qwords \* 8 || return)
	      else if set -q _flag_bytes
		  # Allows using a 'q' suffix, e.g. --bytes=4q to mean 4*8 bytes.
		  if string match -qr 'q$' -- $_flag_bytes
		      set -a argv_opts --bytes=(math --	(string	replace	-r 'q$'	'*8' --	$_flag_bytes) || return)
		  else
		      #	Keep the users setting
		      set -a argv_opts --bytes=$_flag_bytes
		  end

	      end

	      if test (count $argv) -eq	0
		  # Default to heading /dev/kmsg (whereas head defaults	to stdin)
		  set -l argv /dev/kmsg
	      end

	      #	Call the real head with	our modified options and arguments.
	      head $argv_opts -- $argv
	  end

       The argparse call above saves all the options we	do not want to process
       in $argv_opts. (The --qwords and	--bytes	options	are not	saved there as
       their  option  spec's end in a ~). The code then	processes the --qwords
       and --bytess options using the the $_flag_OPTION	 variables,  and  puts
       the  transformed	 options in $argv_opts (which already contains all the
       original	options, other than --qwords and --bytes).

       Note that because the argparse call above uses --move-unknown and --un-
       known-arguments=none, we	only need to tell it  the  arguments  to  head
       that  take  a  value. This allows the wrapper script to accurately work
       out the non-option arguments (i.e. $argv, the filenames that head is to
       operate on). Using --unknown-arguments=optional and explicitly  listing
       all  the	known options to head however would have the advantage that if
       head were to add	new options, they could	still be used with the wrapper
       script  using  the  "stuck"  form  for  arguments  (e.g.	 -o<arg>,   or
       --opt=<arg>).

       Note  that  the	--strict-longopts  is required to be able to correctly
       pass short options, e.g.	without	it my-head -q --bytes 10q, will	 actu-
       ally parse the -q as shorthand for --qwords.

   begin - start a new block of	code
   Synopsis
       begin; [COMMANDS	...]; end
       { [COMMANDS ...]	}

   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.

       Some other shells only support the { [COMMANDS ...] ; } notation.

       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 con-
       tinue 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 process ID.

       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] [--color WHEN] [KEYS]
       bind [-a	| --all] [--preset] [--user] [--color WHEN]
       bind (-f	| --function-names)
       bind (-K	| --key-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 for those keys in
       the  given  MODE	will be	printed.  If no	KEYS argument is provided, all
       bindings	(in the	given MODE) are	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	print-
       able character representation.  They are:

        the arrow keys	up, down, left and right,

        backspace,

        comma (,),

        delete,

        end,

        enter,

        escape,

        f1 through f12.

        home,

        insert,

        menu,

        minus (-),

        pageup,

        pagedown,

        printscreen,

        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-print-
       able  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.

       Key bindings may	use "modes", which mimics vi's modal  input  behavior.
       The  default mode is "default" (in vi-mode, that's vi's "normal"	mode).
       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 spec-
       ify 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

       -K or --key-names
	      Display a	list of	available named	keys such as backspace.

       -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  "de-
	      fault".	If  you	use vi bindings, that's	the command mode, what
	      vi calls "normal"	mode.

       -m NEW_MODE or --sets-mode NEW_MODE
	      Change the current mode to NEW_MODE after	this binding  is  exe-
	      cuted

       -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 re-
	      gardless 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 in-
	      vocations	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.

       --color WHEN
	      Controls	when  to  use  syntax highlighting colors when listing
	      bindings.	 WHEN can be auto (the default,	colorize if the	output
	      is a terminal), always, or never.

       -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  ac-
	      tive, select the previous	completion instead.

       backward-char-passive
	      move one character to the	left, but do not trigger any non-move-
	      ment-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 kill-
	      ring. 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-path-component
	      move one path component to the left.

       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  comple-
	      tion if one was just inserted

       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.

       scrollback-push
	      pushes  earlier  output  to the terminal scrollback, positioning
	      the prompt at the	top.  This requires the	terminal to  implement
	      the ECMA-48 SCROLL UP command and	cursor position	reporting.

       complete
	      guess the	remainder of the current token

       complete-and-search
	      invoke  the  searchable  pager on	completion options (for	conve-
	      nience, 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 comman-
	      dline,  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-path-component
	      move  one	 path  component to the	right; or if at	the end	of the
	      commandline, accept a path component from	the  current  autosug-
	      gestion.

       forward-single-char
	      move one character to the	right; or if at	the end	of the comman-
	      dline, 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-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

       history-last-token-search-backward
	      search the history for the previous matching last	argument

       history-last-token-search-forward
	      search the history for the next matching last argument

       forward-jump and	backward-jump
	      read another character and jump to its next occurrence after/be-
	      fore 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 consid-
	      ered: ([{}])

       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-path-component
	      move one path component 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 re-
	      moved

       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 autosugges-
	      tion.

       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 cur-
	      sor

       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  par-
       ticularly 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 envi-
	      ronment 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 al-
	      ready 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  in-
	      stead.  Starts  with  the	 last command from history if the com-
	      mand-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

       Swap  tab and shift-tab,	making tab focus the search field.  But	if the
       search field is already active, keep the	behavior (tab cycles  forward,
       shift-tab backward).:

	  bind tab '
	      if commandline --search-field >/dev/null
		  commandline -f complete
	      else
		  commandline -f complete-and-search
	      end
	  '
	  bind shift-tab '
	      if commandline --search-field >/dev/null
		  commandline -f complete-and-search
	      else
		  commandline -f complete
	      end
	  '

   Terminal Limitations
       Unix  terminals,	like the ones fish operates in,	are at heart 70s tech-
       nology. They have some limitations  that	 applications  running	inside
       them can't workaround.

       For instance, historically the control key modifies a character by set-
       ting 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 se-
       quences.	For example right () usually sends \e\[C.

       Some modern terminals support newer encodings for keys, that allow dis-
       tinguishing 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  ter-
       minal  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 ar-
       row  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	inner-
	      most 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.

       The -h or --help	option displays	help about using this command.

   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 com-
       mand 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	expan-
       sion 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 clas-
       sify 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  documenta-
       tion 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 parame-
       ter 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	under-
       stands  cd  -  as  changing to the previous directory.  See also	prevd.
       This wrapper function maintains a history of the	25 most	recently  vis-
       ited 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  re-
       moved 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	DIREC-
       TORY.

       Note that the cd	command	limits directory history to the	 25  most  re-
       cently  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 in-
       stances.

   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	 docu-
       mentation 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	other-
	      wise.  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 com-
       mand line buffer.

       With no parameters, commandline returns the current value of  the  com-
       mand 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  po-
	      sition  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 func-
	      tions, and puts them into	the queue, so that they	will  be  read
	      before  any additional actual key	presses	are.  This option can-
	      not 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, --insert or --insert-smart
	      Do  not  remove  the  current  commandline, insert the specified
	      string at	the current cursor position.  The  --insert-smart  op-
	      tion turns on a Do-What-I-Mean (DWIM) mode: it strips any	$ pre-
	      fix from the first command on each line.

       -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 auto-
	      suggestion (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.

       --input=INPUT
	      Operate on this string instead of	the  commandline.  Useful  for
	      using options like --tokens-expanded.

       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 comple-
	      tions.  To get both, use both commandline	--cut-at-cursor	 --to-
	      kens-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	 argu-
	      ment  per	line.  Command substitutions are not expanded but for-
	      warded as-is.

       -o, tokenize, --tokens-raw
	      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.  Oth-
	      erwise, 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 al-
	      ready at the end of the line would have no effect	or if it would
	      cause a completion to be accepted	(note  that  forward-char-pas-
	      sive 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 sec-
       ond.

       $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 com-
       pleted 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] [--color WHEN]
       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  com-
	      mand.

       -p or --path COMMAND
	      Specifies	 that COMMAND is the absolute path of the command (op-
	      tionally 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  com-
	      pletion pager.

       -w or --wraps WRAPPED_COMMAND
	      Causes   the  specified  command	to  inherit  completions  from
	      WRAPPED_COMMAND.	This is	used for "this command completes  like
	      that  other  command" kinds of relationships.  See below for de-
	      tails.

       -n or --condition CONDITION
	      This completion should only be used if the  CONDITION  (a	 shell
	      command)	returns	 0.  This makes	it possible to specify comple-
	      tions that should	only be	used in	some cases. If multiple	condi-
	      tions 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.

       --color WHEN
	      Controls when to use syntax highlighting	colors	when  printing
	      completions.   WHEN  can	be  auto (the default, colorize	if the
	      output is	a terminal), always, or	never.

       -h or --help
	      Displays help about using	this command.

       Command-specific	tab-completions	in fish	are based on the notion	of op-
       tions and arguments. An option is a parameter which begins with	a  hy-
       phen, 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-para-
	 meter 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 de-
       fine multiple completions in one	call.

       Invoking	complete multiple times	for the	same command adds the new def-
       initions	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	 argu-
       ments  for any of the specified options.	If -a or --arguments is	speci-
       fied without any	long, short, or	old-style options, the specified argu-
       ments are used when completing non-option arguments to the command (ex-
       cept when completing an option argument that was	specified with	-r  or
       --require-parameter).

       Command	substitutions found in ARGUMENTS should	return a newline-sepa-
       rated 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  com-
       pletions	 from another command, "wrapping" the other command. The wrap-
       ping 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	speci-
       fying completions with -p or --path.

       When  erasing  completions,  it is possible to either erase all comple-
       tions 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 com-
       pletions	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.

   Cygwin / MSYS2 / Windows
       On Windows, binary executables have a .exe extension, but  this	exten-
       sion  is	 not  required when calling an application (and	if the name is
       not ambiguous, i.e. there isn't also a script called myprog in the same
       directory as myprog.exe).

       To  unify  completions  between	Windows	 and  other  OSes,   on	  Cyg-
       win/MSYS2/Windows,  COMMAND  does not require the .exe extension.  Com-
       pletions	for myprog will	also be	used for myprog.exe if	there  are  no
       ambiguities,  i.e.  if there are	no completions for myprog.exe specifi-
       cally.  However,	completions for	myprog.exe will	only be	used when also
       using the .exe extension	on the command line.

       In other	words:

	  complete -c myprog.exe ...  #1

       will only work for myprog.exe

	  complete -c myprog ...  #2

       can work	for both myprog	and myprog.exe.	But if both completions	exist,
       #2 will only be used for	myprog while myprog.exe	will use #1.

   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 op-
       tion 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  in-
       cluded:

	  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 op-
       tion:

	  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 in-
       side of a conditional block such	as an if statement or a	switch	state-
       ment.

       The -h or --help	option displays	help about using this command.

   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_his-
       tory_current environment	variable.

       dirh does not accept any	parameters.

       Note that the cd	command	limits directory history to the	 25  most  re-
       cently  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	 modi-
       fied 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	termi-
       nates,  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 con-
       tinue 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 documenta-
       tion 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  op-
       tions.

   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 follow-
       ing 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 in-
       stead.

       If no piping or other compound shell  constructs	 are  required,	 vari-
       able-expansion-as-command,  as in  set cmd ls -la; $cmd,	is also	an op-
       tion.

   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 documenta-
       tion on any non-fish versions, use command man exec.

       exec  replaces  the currently running shell with	a new command. On suc-
       cessful 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-ex-
       ported 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 Also
        true 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 sus-
       pended.	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 com-
	      mandline.	  Any  additional  positional  arguments  are  used as
	      $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.

       -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  com-
	      mands  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 his-
	      tory.

       --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	 fore-
       ground 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 com-
       mand 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 sup-
       ports glob syntax.  The following command turns on debugging  for  com-
       plete,  history,	 history-file, and profile-history, as well as the de-
       fault 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 out-
       put 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 dis-
       ables ast debugging).

       The  file  given	 in  --debug-output  takes precedence over the file in
       FISH_DEBUG_OUTPUT.

   Examples
       To just start fish:

	  fish

       To run a	file with fish:

	  fish /path/to/script.fish

       To run some commands with fish:

	  fish -c 'echo	Hi there!'

       You can also pass arguments to those commands:

	  > fish -c 'printf %s\n $argv'	"first line" "second line"
	  first	line
	  second line

       To run a	script,	except read this other file first:

	  fish --init-cmd "source otherfile" script.fish

       To profile fish's startup and find what takes the  most	time  in  your
       configuration:

	  fish --profile-startup /tmp/start.prof -ic exit
	  sort -nk2 /tmp/start.prof

   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 di-
       rectly 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  di-
       rectly, so this doesn't happen.

       With  --path,  because PATH must	be a global variable instead of	a uni-
       versal 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	 trig-
       gered.

       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 de-
	      fault).

       -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 mod-
       ify the value of	$status	outside	of  the	 fish_breakpoint_prompt	 func-
       tion.

       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:

        pbcopy

        wl-copy using wayland

        xsel and xclip	for X11

        clip.exe on Windows.

        The OSC 52 clipboard sequence,	which your terminal might support

   See also
        fish_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 clip-
       board.

       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 out-
       put  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:

        pbpaste

        wl-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 also
        fish_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_com-
       mand_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,  de-
       fine 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
       fish_config theme choose	THEME [	--color-theme=(dark | light) ]
       fish_config theme demo
       fish_config theme dump
       fish_config theme list
       fish_config theme show [THEME...]

   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 theme in the current session.	If the theme has light
	 and	dark	variants    (see    below),    the    one     matching
	 fish_terminal_color_theme  will  be applied (also whenever that vari-
	 able  changes).   To  override	 fish_terminal_color_theme,  pass  the
	 --color-theme argument.

        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 themes.

        show shows what the given themes (or all) would look like.

        (not  recommended) save saves the given theme to universal variables.
	 A theme set this way will  not	 update	 as  fish_terminal_color_theme
	 changes.

       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  configura-
       tion 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: 'My Theme'

	  [light]
	  # preferred_background: ffffff
	  fish_color_normal 000000
	  fish_color_autosuggestion 7f7f7f
	  fish_color_command 0000ee

	  [dark]
	  # preferred_background: 000000
	  fish_color_normal ffffff
	  fish_color_autosuggestion 7f7f7f
	  fish_color_command 5c5cff

	  [unknown]
	  fish_color_normal normal
	  fish_color_autosuggestion brblack
	  fish_color_cancel -r
	  fish_color_command normal

       The comments provide name and background	color to the web config	tool.

       Themes  can have	three variants,	one for	light mode, one	for dark mode,
       and   one   for	 terminals   that   don't   report    colors	(where
       fish_terminal_color_theme is set	to unknown).

       The other lines are just	like set variable value, except	that no	expan-
       sions are allowed. Quotes are, but aren't necessary.

       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 comple-
       tions) 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, in-
       cluding 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 [FORMAT]

	  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.

       It is possible to modify	the output format by passing an	argument.  The
       default value is	" (%s)".

       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.show-
	 InformativeStatus  false.  It	also changes the characters the	prompt
	 uses to less plain ones ( instead of *	for the	dirty state for	 exam-
	 ple)	,   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.showUn-
	 trackedFiles.

        $__fish_git_prompt_showdirtystate  or the git option bash.showDirtyS-
	 tate 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.showUn-
	 trackedFiles 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 de-
	 termine 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 en-
	 able 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 en-
       abled, or $__fish_git_prompt_use_informative_chars set. The  usual  de-
       fault  is  given	 first,	then the informative default (if it is differ-
       ent).  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 reposi-
	 tory -	one without a working tree

        $__fish_git_prompt_color_merging - the	color when a  merge/rebase/re-
	 vert/bisect or	cherry-pick is in progress

        $__fish_git_prompt_char_cleanstate ( in informative mode) - the char-
	 acter 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  un-
	 tracked 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 ex-
       ample,  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_greet-
       ing 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  er-
       rors.

   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 Mer-
       curial 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 exam-
       ple:

	  set 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 re-
	 spective 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	using the col-
	      ors defined in the environment (such as fish_color_command).

       --html Outputs HTML, which supports syntax highlighting if  the	appro-
	      priate  CSS  is defined. The CSS class names are the same	as the
	      variable names, such as fish_color_command.

       --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 se-
       quence.	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 se-
	      quence.

       -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. De-
       fine your own function to customize the appearance of the mode  indica-
       tor.  The $fish_bind_mode variable can be used to determine the current
       mode. It	will be	one of default,	insert,	replace_one, replace,  or  vi-
       sual.

       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 pro-
       duces 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.

       If fish_transient_prompt	is set to 1, fish_mode_prompt  --final-render-
       ing is run before executing the commandline.

   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 replace
		set_color --bold bryellow
		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	[-s ALPHANUM] [-l LONG-NAME] [-ormd] [--long-only] [-v COMMAND OPTIONS ... ]
       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 ALPHANUM
	      Takes a single letter or number that is used as the  short  flag
	      in  the  option  being defined. Either this option or the	--long
	      option must be provided.

       -l or --long LONG-NAME
	      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
	      Deprecated. The option being defined will	only  allow  the  long
	      flag  name  to be	used, even if the short	flag is	defined	(i.e.,
	      --short is specified).

       -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  ele-
	      ments  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 arg-
	      parse will have exactly one element.

       -m or --multiple-vals
	      The  value  of  each  instance  of the option is accumulated. If
	      --optional-val is	provided, the value is optional, and an	 empty
	      string  is  stored if no value is	provided. Otherwise, the --re-
	      quiured-val option is implied and	each instance  of  the	option
	      requires a value.	This means the resulting flag variable created
	      by  argparse will	have one element for each instance of this op-
	      tion in the arguments, even for instances	that did not provide a
	      value.

       -d or --delete
	      The option and any values	will be	deleted	 from  the  $argv_opts
	      variables	 set  by argparse (as with other options, it will also
	      be deleted from $argv).

       -v or --validate	COMMAND	OPTION...
	      This option must be the last one,	and requires one of -o,	-r, or
	      -m. All the remaining arguments are interpreted a	fish script to
	      run to validate the value	of the argument, see argparse documen-
	      tation for more details. Note that the interpretation of COMMAND
	      OPTION...	is similar to eval, so you may need to quote or	escape
	      special characters twice if you want them	to be interpreted lit-
	      erally when the validate script is run.

       -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 -r)
	  argparse $options -- $argv

       Same as above but the value of the second  flag	cannot	be  the	 empty
       string:

	  set -l options (fish_opt -s h	-l help)
	  set options $options (fish_opt -s m -l max -rv test \$_flag_value != "''")
	  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 a long flag name	(--to-
       ken) is defined:

	  set -l options (fish_opt --short=h --long=help)
	  set options $options (fish_opt --short=m --long=max --required-val --validate	test \$_flag_value != "''")
	  set options $options (fish_opt --long=token --multiple-vals)
	  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.

       If fish_transient_prompt	is set to 1, fish_prompt --final-rendering  is
       run before executing the	commandline.

       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.

       If fish_transient_prompt	is set to 1, fish_right_prompt --final-render-
       ing is run before executing the commandline.

   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 any-
       thing  else, it is not. In the latter case the command can still	be re-
       called 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 com-
       mand 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	 func-
       tion  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' -- "$argv"
	      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 hu-
       man-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_tab_title - define the terminal	tab's title
   Synopsis
       fish_title
       fish_tab_title

	  function fish_title
	      ...
	  end

	  function fish_tab_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	title-
       bar 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).

       To set the terminal tab title to	something other	than the terminal win-
       dow  title,  define  the	 fish_tab_title	 function,  which  works  like
       fish_title but overrides	that one.

   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

       Change the tab title only:

	  function fish_tab_title
	      echo fish	$fish_pid
	  end

   fish_title -	define the terminal's title
   Synopsis
       fish_title
       fish_tab_title

	  function fish_title
	      ...
	  end

	  function fish_tab_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	title-
       bar 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).

       To set the terminal tab title to	something other	than the terminal win-
       dow  title,  define  the	 fish_tab_title	 function,  which  works  like
       fish_title but overrides	that one.

   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

       Change the tab title only:

	  function fish_tab_title
	      echo fish	$fish_pid
	  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 di-
       rectory.

       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_prompt

        fish_hg_prompt

        fish_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  de-
       faults 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 COM-
       MANDS  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 VAR-
       NAME 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 pro-
       gram 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 func-
       tion. 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  com-
	      mand (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	direc-
       tory
   Synopsis
       funcsave	FUNCTION_NAME
       funcsave	[-q | --quiet] [(-d | --directory) DIR]	FUNCTION_NAME

   Description
       funcsave	saves a	function to a file in the  fish	 configuration	direc-
       tory.  This function will be automatically loaded by current and	future
       fish sessions. This can be useful to commit functions created  interac-
       tively for permanent use.

       If  you	have erased a function using functions's --erase option, func-
       save 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
	      Assigns the value	of successive command-line  arguments  to  the
	      names  given  in NAMES (separated	by spaces). These are the same
	      arguments	given in argv, and are still available	there  (unless
	      --inherit-variable  argv	was  used or one of the	given NAMES is
	      argv). See also Argument Handling.

       -d DESCRIPTION or --description DESCRIPTION
	      A	description of what the	function does, suitable	as  a  comple-
	      tion description.

       -w WRAPPED_COMMAND or --wraps WRAPPED_COMMAND
	      Inherit  completions  from  the  given WRAPPED_COMMAND.  This is
	      used to say that this function completes like that command,  for
	      example  if you're creating an alias.  See the documentation for
	      complete for more	information.  If the wrapped  command  is  the
	      same as the function name, this will be ignored.

       -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	 show-
	      ing the prompt. Custom events can	be emitted using the emit com-
	      mand.

       -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  ID  PID exits. Instead of a PID, the	string
	      'caller' can be specified. This is only allowed when in  a  com-
	      mand  substitution,  and	will result in the handler being trig-
	      gered by the exit	of the job which created this command  substi-
	      tution.  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 func-
	      tions. 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 vari-
	      able 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  de-
	      fined.  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 (typ-
	      ically 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  ad-
       ditional	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] [--color WHEN]
       functions [-D | --details] [-v] [--color	WHEN] 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	under-
	      score.

       -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  interac-
	      tively 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	-, be-
	      cause 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 func-
		tion was originally  defined,  otherwise  autoloaded,  not-au-
		toloaded or n/a,

	      	the line number	within the file	or zero	if not applicable,

	      	scope-shadowing	 if the	function shadows the vars in the call-
		ing 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 descrip-
		tion.

	      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.

       --color WHEN
	      Controls	when  to  use syntax highlighting colors when printing
	      function definitions.  WHEN can be auto (the  default,  colorize
	      if the output is a terminal), always, or never.

       -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  out-
       put.

       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 de-
	      fault 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	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  en-
	      ter 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. Press [enter]
	      to not delete anything. Note that	the interactive	delete	behav-
	      ior  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	 imme-
	      diately.

       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  his-
	      tory  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  ses-
	      sion.  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-com-
       mands listed above.

       -C or --case-sensitive
	      Does a case-sensitive search. The	default	is case-insensitive.

       -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  sub-
	      command.	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 subcom-
	      mand.

       -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	multi-
	      line 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.

       --color WHEN
	      Controls when to use syntax highlighting colors for the  history
	      entries.	 WHEN can be auto (the default,	colorize if the	output
	      is a terminal), always, or never.

       -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		~/.lo-
       cal/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_his-
       tory.  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 sig-
       nal  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	sensi-
       tive 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 spec-
       ified 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 ele-
	 ment 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  as-
       sumed.

       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 mes-
       sages 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 documenta-
       tion 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 ex-
       pressed as a percentage of full CPU activity. Note that on multiproces-
       sor 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 sub-
       stitution, 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 multiplica-
       tion,  but it needs to be followed by whitespace	to distinguish it from
       hexadecimal numbers.

       Parentheses for functions are optional -	math sin pi  prints  0.	  How-
       ever,  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	multi-
       ple  arguments  (internally joined with a space), so math 2 +2 and math
       "2 +    2" work the same.  math 2 2 is an error.

       NOTE:
	  math is a simple tool	for simple uses, provided for convenience.  It
	  internally  works  with  floats for simplicity of implementation and
	  can't	do a number of things real calculators can.  If	you find your-
	  self limited by that,	use a more full-featured tool.

       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	() de-
	      notes 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-inte-
	      ger 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 oper-
	      ations 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. To	compute	the logarithm for an arbitrary
	      base b, use log(x) / log(b).

       log2   the base-2 logarithm

       max    returns  the  largest of the given numbers - this	takes an arbi-
	      trary number of arguments	(but at	least one)

       min    returns the smallest of the given	numbers	- this takes an	 arbi-
	      trary 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 com-
       mand 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 mul-
       tiplied 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 scan-
       ning 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 directo-
       ries; 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 re-
       cently 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 ex-
       ists (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  suc-
       cessful (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 Also
        and 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] [--all] [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	 stan-
       dard  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 rela-
       tive 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 fur-
       ther processing,	e.g. passing to	another	path, or xargs -0. This	is not
       recommended when	the output goes	to the terminal	or a command substitu-
       tion.

       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	nonex-
       istent 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 re-
       moving  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	exten-
       sion)  removed, i.e. the	"filename" without an extension	(akin to call-
       ing 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] [--all] [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 di-
	 rectory,  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  per-
	 missions.

       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 be-
       ing interpreted as an option otherwise.

       It returns 0 if at least	one path passed	the filter.

       With --all, return status 0 (true) if all paths pass  the  filter,  and
       status 1	(false)	if any path fails. This	is equivalent to not path fil-
       ter -v. It produces no output, only a status.

       When  --all  combined  with --invert, it	returns	status 0 (true)	if all
       paths fail the filter and status	1 (false) if any path passes.

       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!

	  >_ path filter --all /usr/bin	/usr/argagagji
	  # This returns 1 (false) because not all paths pass the filter.

   "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 op-
       tions 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 mod-
       ification 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, con-
       sider 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	direc-
       tory. 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 op-
       tions.

       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	compo-
       nents  and removes "." components. Then it turns	that path into the ab-
       solute 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 log-
       ical 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 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 base-
       name, 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	direc-
       tory.

       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  com-
	 mand  substitution,  so just doing (path ...) handles all paths, even
	 those containing newlines, correctly

        path has --null-in to handle null-delimited input (typically automat-
	 ically	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  directo-
       ries 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  directo-
       ries;  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 dis-
       played.

       Note that the cd	command	limits directory history to the	 25  most  re-
       cently  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 documen-
       tation 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 re-
       places 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 un-
	 signed)

        %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  in-
       teger,  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),  fol-
       lowed  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 char-
       acter.

       To  change  the	number	of  characters	per   path   component,	  pass
       --dir-length=  or set fish_prompt_pwd_dir_length	to the number of char-
       acters. Setting it to 0 or an invalid value will	disable	shortening en-
       tirely. 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

	  >_ echo (prompt_pwd |	string split /)[-1]
	  mustard

	  >_ echo (string join / (prompt_pwd | string split /)[-3..-1])
	  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  pro-
       gram.  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  ad-
	      vantage 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  out-
	      put 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 documenta-
       tion 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 argu-
       ments.

       The -h or --help	option displays	help about using this command.

       Note that seeding the engine will NOT give the same result across  dif-
       ferent systems.

       You  should  not	consider random	cryptographically secure, or even sta-
       tistically 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 documenta-
       tion on any non-fish versions, use command man read.

       read reads from standard	input and stores the  result  in  shell	 vari-
       ables.  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 --func-
	      tion.

       -g or --global
	      Sets a globally-scoped variable.	Global variables are available
	      to all functions running in the same shell.  They	can  be	 modi-
	      fied 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	termi-
	      nation 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, --tokenize or --tokenize-raw
	      Causes read to split the input into variables by the shell's to-
	      kenization rules.	 This means it will honor quotes and escaping.
	      This option is of	course incompatible with other options to con-
	      trol  splitting  like  --delimiter  and does not honor IFS (like
	      fish's tokenizer).  The -t -or --tokenize	variants perform quote
	      removal, so e.g. a\ b is stored as a b.  However	variables  and
	      command substitutions are	not expanded.

       -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 --de-
	      limiter option.

       Without the --line option, read reads a single line of input from stan-
       dard  input,  breaks it into tokens, and	then assigns one token to each
       variable	specified in VARIABLES.	If there are more  tokens  than	 vari-
       ables, 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 pro-
       vides 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  his-
       tory:

	  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	 pass-
       ing:

	  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 docu-
       mentation 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	multi-
	      ple 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 (-e | --erase) [-Uflg] [-xu]	[NAME][[INDEX]]	...]
       set (-q | --query) [-Uflg] [-xu]	[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 --func-
	      tion.

       -g or --global
	      Sets a globally-scoped variable.	Global variables are available
	      to  all  functions running in the	same shell.  They can be modi-
	      fied 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 vari-
	      ables.

       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.  With a  given	 scope
	      (like  --global)	or attribute (like --exported or --path) check
	      only variables that match.  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  ele-
       ments, 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  in-
       dex  will be calculated from the	end of the list.  For example, the in-
       dex -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  execut-
	 ing, 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 unex-
	 ported	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 exam-
       ple,  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 ter-
       minal. 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, white

	   brblack,  brred, brgreen, bryellow,	brblue,	brmagenta, brcyan, br-
	    white

       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.  A	three digit value  is  equivalent  to  specifying  each	 digit
       twice;  e.g., set_color 2BC is the same as set_color 22BBCC.  Hexadeci-
       mal RGB values can be in	lower or uppercase.

       If fish_term24bit is set	to 0, fish will	translate RGB  values  to  the
       nearest color on	the 256-color palette.	If fish_term256	is also	set to
       0,  fish	 will  translate  them	to the 16-color	palette	instead.  Fish
       launched	as fish	-d term_support	will include diagnostic	messages  that
       indicate	the color support mode in use.

       If multiple colors are specified, fish prefers the first	RGB one.  How-
       ever  if	 fish_term256  is set to 0, fish prefers the first named color
       specified.

       The following options are available:

       -b or --background COLOR
	      Sets the background color.

       --underline-color COLOR
	      Set the underline	color.

       -c or --print-colors
	      Prints the given colors or a colored list	of the 16  named  col-
	      ors.

       -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, or -uSTYLE or	--underline=STYLE
	      Set  the	underline mode;	supported styles are single (default),
	      double, curly, dotted and	dashed.

       --theme=THEME
	      Ignored.	Color variables	that  contain  only  this  option  are
	      treated like missing / empty color variables, i.e. fish will use
	      the fallback color instead.  fish_config theme choose erases all
	      color  variable  whose value includes this option, and adds this
	      option to	all color variables it sets.  This allows  identifying
	      variables	 set  by  a  theme, and	it allows fish to update color
	      variables	whenever fish_terminal_color_theme changes.

       -h or --help
	      Displays help about using	this command.

   Notes
       1. Using	set_color normal will reset all	colors and modes to the	termi-
	  nal's	default.

       2. Setting the background color only affects subsequently written char-
	  acters. Fish provides	no way to set the background color for the en-
	  tire 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 out-
	  put.	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 use-
	  ful 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

   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  exe-
       cute. 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  fu-
       ture 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.

   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 build-info
       status get-file FILE
       status list-files [PATH ...]
       status terminal
       status test-terminal-feature FEATURE
       status language [list-available|set [LANGUAGE ...]|unset]

   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 key-
	      board.

       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,	inclu-
	      sive of all jobs and operators.

       filename, current-filename, -f or --current-filename
	      Prints the filename of the currently-running script. If the cur-
	      rent  script was called via a symlink, this will return the sym-
	      link. 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.

       build-info
	      This prints information on how fish was build - which  architec-
	      ture,  which  build  system  or  profile was used, etc.  This is
	      mainly useful for	debugging.

       get-file	FILE
	      NOTE: this subcommand is mainly  intended	 for  fish's  internal
	      use; let us know if you want to use it elsewhere.

	      This  prints a file embedded in the fish binary at compile time.
	      This includes the	default	set of functions and  completions,  as
	      well  as	the man	pages and themes. Which	files are included de-
	      pends on build settings.	Returns	0 if the file was included,  1
	      otherwise.

       list-files FILE...
	      NOTE:  this  subcommand  is  mainly intended for fish's internal
	      use; let us know if you want to use it elsewhere.

	      This lists the files embedded in	the  fish  binary  at  compile
	      time.  Only  files  where	the path starts	with the optional FILE
	      argument are shown.  Returns 0 if	something was printed, 1  oth-
	      erwise.

       terminal
	      Prints  the name and version of the terminal fish	is running in-
	      side (for	example	as  reported  via  XTVERSION).	 This  is  not
	      available	 during	 early startup but only	starting from when the
	      first interactive	prompt is shown, possibly via builtin read, so
	      before the first fish_prompt or fish_read	event.

       terminal-os
	      Prints the name of the operating system  (OS)  the  terminal  is
	      running  on,  as	reported  via  XTGETTCAP  query-os-name.  Like
	      status terminal, this only  works	 once  the  first  interactive
	      prompt is	shown.	Returns	1 if the OS name is not	available.

       test-terminal-feature FEATURE
	      Returns  0  when	the terminal was detected to support the given
	      feature.	Like status terminal, this only	works once  the	 first
	      interactive prompt is shown.

	      Currently	 the  only available FEATURE is	scroll-content-up.  An
	      error will be printed when passed	an unrecognized	feature.

       language
	      Show or modify  message  localization  settings.	 When  invoked
	      without arguments, the current language settings are shown.

	      Available	subcommands:

	      list-available  prints  the  language  names  for	which fish has
	      translations.  These names can be	used with the set subcommand.

	      set sets the language precedence for fish's messages.  Overrides
	      language settings	configured via environment variables, but only
	      applies to fish itself, not to any  child	 processes.   Takes  a
	      list  of language	names from the set shown by the	list-available
	      subcommand.  For some languages, fish's translation catalogs are
	      incomplete, meaning not all messages can be shown	in these  lan-
	      guages.  Therefore, we allow specifying a	list here, with	trans-
	      lations  taken  from  the	 first	specified language which has a
	      translation available for	a message.  For	example, after running
	      status language set pt_BR	fr, all	messages which have a transla-
	      tion into	Brazilian Portuguese will be shown in  that  language.
	      The  remaining  messages	will  be  shown	in French, if a	French
	      translation is available.	 If none of  the  specified  languages
	      have  a translation available for	a message, the message will be
	      shown in English.

	      unset undoes the effects of the set subcommand.	Language  set-
	      tings will be taken from environment variables again.

   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  re-
       moved in	a future release.

       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] [-n | --no-empty] [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 | --center] [(-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,	 with-
       out  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  in-
       terpolation.

       If  invoked  with  multiple  arguments instead of input,	string collect
       preserves each argument separately, where the number  of	 output	 argu-
       ments 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 unescap-
       ing --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] [-n |	--no-empty] [--] SEP [STRING ...]
       string join0 [-q	| --quiet] [-n | --no-empty] [--] [STRING ...]

       Joins its STRING	arguments into a single	string separated by  SEP  (for
       string  join)  or by the	zero byte (NUL)	(for string join0).  Exit sta-
       tus: 0 if at least one join was performed, or 1 otherwise.

       -n, --no-empty
	      Exclude empty strings from consideration (e.g. string join -n  +
	      a	b "" c would expand to a+b+c not a+b++c).

       -q, --quiet
	      Do  not print the	strings, only set the exit status as described
	      above.

       WARNING:	Insert a  -- before positional arguments to prevent them  from
       being  interpreted  as  flags.	Otherwise, any strings starting	with -
       will be treated as flag arguments, meaning they will most likely	result
       in the command failing.	This is	also true if you  specify  a  variable
       which  expands  to  such	 a string instead of a literal string.	If you
       don't need to append flag arguments at the end of the command, just al-
       ways use	-- to avoid unwelcome surprises.

       string join0 adds a trailing NUL. This is most  useful  in  conjunction
       with tools that accept NUL-delimited input, such	as sort	-z.

       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 limi-
       tation 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

	  >_ set -l markdown_list '- first' '- second' '- third'
	  # Strings with leading hyphens (also in variable expansions) are interpreted as flag arguments by default.
	  >_ string join \n $markdown_list
	  string join: - first:	unknown	option
	  # Use	'--' to	prevent	this.
	  >_ string join -- \n $markdown_list
	  - first
	  - second
	  - third

   "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	other-
       wise.

       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 sub-
       strings.	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 re-
       sult by prepending and appending	* or .*	depending on  whether  or  not
       you  have  specified  the  --regex  flag. The --entire flag is a	way to
       avoid having to complicate the pattern in that fashion and make the in-
       tent of the string match	clearer. Without --entire and --regex, a  PAT-
       TERN 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 re-
       ported -	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 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 | --center] [(-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  -C  or  --center  is	given, add the padding to before and after the
       string. If it is	impossible to perfectly	center the result (because the
       required	amount of padding is an	odd number),  extra  padding  will  be
       added to	the left, unless --right is also given.

       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  ac-
       counting	 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 mul-
       tiline.	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 be-
       cause 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 also
        string	pad does the inverse of	this command, adding padding to	a spe-
	 cific 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  out-
       putted  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	inter-
       preted 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 se-
       quences 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 pro-
       cessing long inputs but expecting a limited and fixed number of outputs
       that might be found considerably	before the input stream	has  been  ex-
       hausted.

       Exit  status:  0	if at least one	replacement was	performed, or 1	other-
       wise.

   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 [-a	| --allow-empty]] [(-m | --max)	MAX] [-n | --no-empty]
		    [-q	| --quiet] [-r | --right] SEP [STRING ...]
       string split0 [(-f | --fields) FIELDS [-a | --allow-empty]] [(-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	 only  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-sep-
       arated 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,  un-
       less --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 substitu-
       tion  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.

       Be  aware that commandline arguments cannot include NULs, so you	likely
       want to pass to string split0 via a pipe, not a command substitution.

   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.
	  >_ # Note: Don't use `string split0 (find . -print0)`, because arguments cannot include NUL.
	  >_ 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	speci-
       fied, 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  re-
       place defaults to literal matching. If set to regex-mode, they use PCRE
       regular expressions, which is comparable	to grep's -P option. match de-
       faults  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, with-
       out 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 in-
       terpolation.

       If invoked with multiple	arguments instead  of  input,  string  collect
       preserves  each	argument  separately, where the	number of output argu-
       ments 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 unescap-
       ing --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] [-n |	--no-empty] [--] SEP [STRING ...]
       string join0 [-q	| --quiet] [-n | --no-empty] [--] [STRING ...]

   Description
       Joins  its  STRING arguments into a single string separated by SEP (for
       string join) or by the zero byte	(NUL) (for string join0).   Exit  sta-
       tus: 0 if at least one join was performed, or 1 otherwise.

       -n, --no-empty
	      Exclude  empty strings from consideration	(e.g. string join -n +
	      a	b "" c would expand to a+b+c not a+b++c).

       -q, --quiet
	      Do not print the strings,	only set the exit status as  described
	      above.

       WARNING:	 Insert	a  -- before positional	arguments to prevent them from
       being interpreted as flags.  Otherwise, any  strings  starting  with  -
       will be treated as flag arguments, meaning they will most likely	result
       in  the	command	 failing.  This	is also	true if	you specify a variable
       which expands to	such a string instead of a  literal  string.   If  you
       don't need to append flag arguments at the end of the command, just al-
       ways use	-- to avoid unwelcome surprises.

       string  join0  adds  a trailing NUL. This is most useful	in conjunction
       with tools that accept NUL-delimited input, such	as sort	-z.

       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 limi-
       tation 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

	  >_ set -l markdown_list '- first' '- second' '- third'
	  # Strings with leading hyphens (also in variable expansions) are interpreted as flag arguments by default.
	  >_ string join \n $markdown_list
	  string join: - first:	unknown	option
	  # Use	'--' to	prevent	this.
	  >_ string join -- \n $markdown_list
	  - first
	  - second
	  - third

   string-join0	- join strings with zero bytes
   Synopsis
       string join [-q | --quiet] [-n |	--no-empty] [--] SEP [STRING ...]
       string join0 [-q	| --quiet] [-n | --no-empty] [--] [STRING ...]

   Description
       Joins  its  STRING arguments into a single string separated by SEP (for
       string join) or by the zero byte	(NUL) (for string join0).   Exit  sta-
       tus: 0 if at least one join was performed, or 1 otherwise.

       -n, --no-empty
	      Exclude  empty strings from consideration	(e.g. string join -n +
	      a	b "" c would expand to a+b+c not a+b++c).

       -q, --quiet
	      Do not print the strings,	only set the exit status as  described
	      above.

       WARNING:	 Insert	a  -- before positional	arguments to prevent them from
       being interpreted as flags.  Otherwise, any  strings  starting  with  -
       will be treated as flag arguments, meaning they will most likely	result
       in  the	command	 failing.  This	is also	true if	you specify a variable
       which expands to	such a string instead of a  literal  string.   If  you
       don't need to append flag arguments at the end of the command, just al-
       ways use	-- to avoid unwelcome surprises.

       string  join0  adds  a trailing NUL. This is most useful	in conjunction
       with tools that accept NUL-delimited input, such	as sort	-z.

       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 limi-
       tation 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

	  >_ set -l markdown_list '- first' '- second' '- third'
	  # Strings with leading hyphens (also in variable expansions) are interpreted as flag arguments by default.
	  >_ string join \n $markdown_list
	  string join: - first:	unknown	option
	  # Use	'--' to	prevent	this.
	  >_ string join -- \n $markdown_list
	  - first
	  - second
	  - third

   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	other-
       wise.

       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 sub-
       strings.	 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  re-
       sult  by	 prepending  and appending * or	.* depending on	whether	or not
       you have	specified the --regex flag. The	--entire  flag	is  a  way  to
       avoid having to complicate the pattern in that fashion and make the in-
       tent  of	the string match clearer. Without --entire and --regex,	a PAT-
       TERN 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  re-
       ported  -  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 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 | --center] [(-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 -C or	--center is given, add the padding to  before  and  after  the
       string. If it is	impossible to perfectly	center the result (because the
       required	 amount	 of  padding  is an odd	number), extra padding will be
       added to	the left, unless --right is also given.

       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 out-
       putted 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	inter-
       preted 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  se-
       quences	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  pro-
       cessing long inputs but expecting a limited and fixed number of outputs
       that  might  be found considerably before the input stream has been ex-
       hausted.

       Exit status: 0 if at least one replacement was performed, or  1	other-
       wise.

   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  ac-
       counting	 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 mul-
       tiline.	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 be-
       cause 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 Also
        string	pad does the inverse of	this command, adding padding to	a spe-
	 cific 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 [-a	| --allow-empty]] [(-m | --max)	MAX] [-n | --no-empty]
		    [-q	| --quiet] [-r | --right] SEP [STRING ...]
       string split0 [(-f | --fields) FIELDS [-a | --allow-empty]] [(-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 only 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-sep-
       arated 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, un-
       less --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 substitu-
       tion 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.

       Be aware	that commandline arguments cannot include NULs,	so you	likely
       want to pass to string split0 via a pipe, not a command substitution.

   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.
	  >_ # Note: Don't use `string split0 (find . -print0)`, because arguments cannot include NUL.
	  >_ 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 [-a	| --allow-empty]] [(-m | --max)	MAX] [-n | --no-empty]
		    [-q	| --quiet] [-r | --right] SEP [STRING ...]
       string split0 [(-f | --fields) FIELDS [-a | --allow-empty]] [(-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 only 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-sep-
       arated 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, un-
       less --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 substitu-
       tion 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.

       Be aware	that commandline arguments cannot include NULs,	so you	likely
       want to pass to string split0 via a pipe, not a command substitution.

   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.
	  >_ # Note: Don't use `string split0 (find . -print0)`, because arguments cannot include NUL.
	  >_ 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	speci-
       fied, 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 unescap-
       ing --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  com-
       mand  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 documenta-
       tion 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	brack-
       ets ([ [EXPRESSION] ]).

       When  using a variable or command substitution as an argument with test
       you should almost always	enclose	it in double-quotes, as	variables  ex-
       panding	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  identi-
	      cal.

       -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 ap-
       pear as \( and \)) to avoid being interpreted as	 a  command  substitu-
       tion.

   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,  un-
       less 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	 $MAN-
       PATH 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 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/on-
       linepubs/9699919799/utilities/test.html>. The following exceptions  ap-
       ply:

        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 oper-
	 ations, 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 documenta-
       tion on any non-fish versions, use command man time.

       time causes fish	to measure how long a command takes and	print the  re-
       sults  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	 some-
       thing  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 com-
       mand  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 it-
       self, 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 documenta-
       tion 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	deliv-
       ered).

       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 en-
       trance 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. Trap-
       ping  a	signal will prevent fish from exiting in response to that sig-
       nal.

       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 Also
        false 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 documenta-
       tion 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 noth-
	      ing 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 sta-
	      tus. For compatibility with  old	fish  versions	this  is  also
	      --quiet.

       --color WHEN
	      Controls	when  to  use syntax highlighting colors when printing
	      function definitions.  WHEN can be auto (the  default,  colorize
	      if the output is a terminal), always, or never.

       -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  sub-
	      tracted 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 re-
       source 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 in-
       creased;	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  im-
       plementation 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 empiri-
	 cally	guesses	 this number by	writing	to a pipe and waiting for SIG-
	 PIPE. Fish does not do	this because this method of  determining  pipe
	 size is unreliable. Depending on bash version,	there may also be fur-
	 ther 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  documen-
       tation 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 rep-
       resents the only	rights that will be granted by default.

       Access rights are explained in the manual page for  the	chmod(1)  pro-
       gram.

       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 vari-
       able. Array variables as	a whole	can not	be edited using	vared, but in-
       dividual	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 documenta-
       tion 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	itera-
       tion 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 sub-
       stitution 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 vari-
       ety 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  ar-
       gument (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  num-
       bers like 1 instead of 01.

       See Wildcards for more.

   Quoting
       Fish  has two quoting styles: ""	and ''.	Variables are expanded in dou-
       ble-quotes, nothing is expanded in single-quotes.

       There is	no $'',	instead	the sequences that would transform are	trans-
       formed 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  equiva-
       lent to >(command).

       Note that both of these are bashisms, and most things can easily	be ex-
       pressed without.	E.g. instead of:

	  source (command | psub)

       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

       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 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  han-
       dled 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. Be-
       cause 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  a	function.  To  achieve the effect of \h, fish provides
	 helper	functions like prompt_hostname,	which prints a shortened  ver-
	 sion 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 differ-
       ent  solution.  The  isolation can usually be achieved by scoping vari-
       ables (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 ex-
       plicitly.

       ()  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 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	$(com-
       mand) 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 in-
	 teractive 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 sys-
       tem, they should	provide	their own documentation, often in the man sys-
       tem.  For  example man ls should	tell you about your computer's ls com-
       mand.

   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  sin-
       gle  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 parenthe-
       ses there (that "command" and "directory") is the  completion  descrip-
       tion. 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 re-
       placed 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  substitu-
       tion:

	  > 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 Noo-
       dle", 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	 some-
       thing  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 emu-
       lator also gave it some variables that it will then pass	on  unless  it
       specifically decides not	to. This is how	fish usually receives the val-
       ues for things like $LANG, $PATH	and $TERM, without you having to spec-
       ify 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  subcom-
       mands.  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  com-
       mand substitutions. Instead, it uses parentheses	with or	without	a dol-
       lar:

	  > 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 inte-
       ger (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 usu-
       ally 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 "stats" 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 suc-
       ceed.

       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	 argu-
       ments or	(quoted) wildcards.

       For more, see Conditions.

   Functions
       A  fish function	is a list of commands, which may optionally take argu-
       ments. Unlike other shells, arguments are not passed in "numbered vari-
       ables" like $1, but instead in a	single list $argv. To create  a	 func-
       tion, 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 syn-
       tax. 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 func-
       tions:

	  > 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 com-
	    mand.

   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 func-
       save   fish_prompt.  This  saves	 the  prompt  in  ~/.config/fish/func-
       tions/fish_prompt.fish. (Or, if you want, you can create	that file man-
       ually from the start.)

       Multiple	lines are OK. Colors can be set	via set_color  by  passing  it
       named ANSI colors, or hex RGB values:

	  function fish_prompt
	      set_color	purple
	      date "+%m/%d/%y"
	      set_color	FF0000
	      echo (pwd) '>' (set_color	normal)
	  end

       This prompt would look like:

	  02/06/13
	  /home/tutorial > _

       See also	Writing	your own prompt.

       You can choose among 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 in-
       herited	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 di-
       rectories to the	path if	they aren't already included. It does this  by
       modifying  the  $fish_user_paths	universal variable, which is automati-
       cally prepended to $PATH. For  example,	to  permanently	 add  /usr/lo-
       cal/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 con-
       fig.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 in-
       stances 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 docu-
       mentation,  the	official   gitter   channel   <https://gitter.im/fish-
       shell/fish-shell>,  an  official	 mailing  list	<https://lists.source-
       forge.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  ex-
       ample,  to  add	a  completion for the program myprog (or myprog.exe on
       Cygwin/MSYS2), start the	completion command with	complete -c myprog ...

       For a complete description of the various switches accepted by the com-
       plete 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  tok-
       enized 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),  re-
       spectively.  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  --argu-
       ment 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-para-
       meter / -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 op-
       tion:

	  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 spe-
       cific 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 com-
       pletions	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_subcommand_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  com-
       mand-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 sepa-
       rated list of strings. For example, __fish_print_filesystems  prints  a
       list  of	 all  known file systems. Functions beginning with __fish_com-
       plete_ print out	a newline separated list of completions	with  descrip-
       tions.  The description is separated from the completion	by a tab char-
       acter.

        __fish_complete_directories STRING DESCRIPTION	performs path  comple-
	 tion  on  STRING,  allowing only directories, and giving them the de-
	 scription 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 com-
	 mand name as description.

        __fish_complete_suffix	SUFFIX	performs  file	completion  but	 sorts
	 files ending in SUFFIX	first. This is useful in conjunction with com-
	 plete --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 sys-
	 tems 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	inter-
	 faces.

   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_com-
       plete_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	 envi-
	 ronment 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, usu-
	 ally  ~/.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 com-
	 pletions for their software,  usually	/usr/share/fish/vendor_comple-
	 tions.d;

        The   completions   shipped   with   fish,   usually	installed   in
	 /usr/share/fish/completions; and

        Completions automatically generated from the operating	system's  man-
	 ual,  usually	stored	in  ~/.cache/fish/generated_completions	 (con-
	 trolled 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  comple-
       tions  with  your program, install them to the "vendor" completions di-
       rectory.	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  sig-
       nify 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/Oneknow-
       ing", 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>false
	  ~/M/L/Oneknowing[1]>_

       after we	run false (which returns 1).

   Transient prompt
       To enable transient prompt functionality, set the fish_transient_prompt
       variable	to 1:

	  set -g fish_transient_prompt 1

       With this set, fish re-runs prompt functions with  a  --final-rendering
       argument	 before	running	a commandline.	So you can use it to declutter
       your old	prompts. For example if	you want to see	only the  current  di-
       rectory name when you scroll up:

	  function fish_prompt
	      set -l last_status $status
	      set -l stat
	      set -l pwd
	      #	Check if it's a	transient or final prompt
	      if contains -- --final-rendering $argv
		  set pwd (path	basename $PWD)
	      else
		  set pwd (prompt_pwd)
		  # Prompt status only if it's not 0
		  if test $last_status -ne 0
		      set stat (set_color red)"[$last_status]"(set_color normal)
		  end
	      end

	      string join '' --	(set_color green) $pwd (set_color normal) $stat	'>'
	  end

       Now  running  two  commands  in the same	directory could	result in this
       screen:

	  Oneknowing>false
	  ~/M/L/Oneknowing[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/func-
       tions/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 pos-
	  sible	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 expressive-
	  ness.	Most tradeoffs between power and ease of use  can  be  avoided
	  with careful design.

       3. Whenever possible without breaking the above goals, fish should fol-
	  low 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  im-
       ply  assumptions	 about	the  code which	change when reimplementing the
       code, causing issues with backwards compatibility. But mostly, configu-
       ration 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, differ-
	 ent language substyles	or any number of other common shell configura-
	 tion 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  de-
       fault.  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 dis-
       abled by	default	include	tab-completion	of  strings  containing	 wild-
       cards, 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 de-
       scribes 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 com-
	 mands.	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 func-
	 tions 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  pro-
       gram  is	 discoverability. In a graphical program, one can discover all
       the common features by simply looking at	the user interface and	guess-
       ing  what the different buttons,	menus and other	widgets	do. The	tradi-
       tional way to discover features in  command-line	 programs  is  through
       manual  pages. This requires both that the user starts to use a differ-
       ent 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 high-
	 lighter.

        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.3.3 (released	January	07, 2026)
       This release fixes the following	problems identified in fish 4.3.0:

        Selecting a completion	could insert only part of  the	token  (#12249
	 <https://github.com/fish-shell/fish-shell/issues/12249>).

        Glitch	 with  soft-wrapped  autosuggestions  and fish_right_prompt (-
	 #12255	<https://github.com/fish-shell/fish-shell/issues/12255>).

        Spurious echo in tmux when  typing  a	command	 really	 fast  (#12261
	 <https://github.com/fish-shell/fish-shell/issues/12261>).

        tomorrow    theme    always   using   the   light   variant   (#12266
	 <https://github.com/fish-shell/fish-shell/issues/12266>).

        fish_config theme choose sometimes not	shadowing themes set  by  e.g.
	 webconfig    (#12278	 <https://github.com/fish-shell/fish-shell/is-
	 sues/12278>).

        The  sample  prompts  and  themes  are	 correctly  installed  (#12241
	 <https://github.com/fish-shell/fish-shell/issues/12241>).

        Last  line  of	command	output could be	hidden when missing newline (-
	 #12246	<https://github.com/fish-shell/fish-shell/issues/12246>).

       Other improvements include:

        The abbr, bind, complete, functions, history and  type	 commands  now
	 support a --color option to control syntax highlighting in their out-
	 put. Valid values are auto (default), always, or never.

        Existing file paths in	redirection targets such as > file.txt are now
	 highlighted  using  fish_color_valid_path,  indicating	 that file.txt
	 will  be   clobbered	(#12260	  <https://github.com/fish-shell/fish-
	 shell/issues/12260>).

   fish	4.3.2 (released	December 30, 2025)
       This release fixes the following	problems identified in 4.3.0:

        Pre-built  macOS  packages  failed to start due to a Malformed	Mach-O
	 file  error   (#12224	 <https://github.com/fish-shell/fish-shell/is-
	 sues/12224>).

        extra_functionsdir  (usually vendor_functions.d) and friends were not
	 used	   (#12226	 <https://github.com/fish-shell/fish-shell/is-
	 sues/12226>).

        Sample	config file ~/.config/fish/config.fish/	and config directories
	 ~/.config/fish/conf.d/,   ~/.config/fish/completions/	 and   ~/.con-
	 fig/fish/functions/ were recreated on every startup instead  of  only
	 the	 first	  time	  fish	  runs	  on	a    system    (#12230
	 <https://github.com/fish-shell/fish-shell/issues/12230>).

        Spurious    echo    of	   ^[[I	   in	 some	 scenarios     (#12232
	 <https://github.com/fish-shell/fish-shell/issues/12232>).

        Infinite    prompt    redraw	 loop	 on   some   prompts   (#12233
	 <https://github.com/fish-shell/fish-shell/issues/12233>).

        The removal of	pre-built HTML docs from tarballs revealed that	 cross
	 compilation  is broken	because	we use ${CMAKE_BINARY_DIR}/fish_indent
	 for building HTML docs.  As a workaround, the new CMake build	option
	 FISH_INDENT_FOR_BUILDING_DOCS	can  be	 set to	the path of a runnable
	 fish_indent binary.

   fish	4.3.1 (released	December 28, 2025)
       This release fixes the following	problem	identified in 4.3.0:

        Possible   crash   after   expanding	 an    abbreviation    (#12223
	 <https://github.com/fish-shell/fish-shell/issues/12223>).

   fish	4.3.0 (released	December 28, 2025)
   Deprecations	and removed features
        fish  no longer sets user-facing universal variables by default, mak-
	 ing  the  configuration  easier  to  understand.   Specifically,  the
	 fish_color_*,	fish_pager_color_* and fish_key_bindings variables are
	 now set in the	global scope by	default.  After	 upgrading  to	4.3.0,
	 fish  will (once and never again) migrate these universals to globals
	 set at	startup	 in  the  ~/.config/fish/conf.d/fish_frozen_theme.fish
	 and  ~/.config/fish/conf.d/fish_frozen_key_bindings.fish  files.   We
	 suggest that you delete those files and set  your  theme  in  ~/.con-
	 fig/fish/config.fish.

	  You	can still configure fish to propagate theme changes instantly;
	   see here for	an example.

	  You can still opt into storing color	 variables  in	the  universal
	   scope  via  fish_config  theme save though unlike fish_config theme
	   choose, it does not support dynamic theme switching	based  on  the
	   terminal's color theme (see below).

        In  addition to setting the variables which are explicitly defined in
	 the given theme, fish_config theme choose now clears only color vari-
	 ables that were set by	earlier	invocations  of	 a  fish_config	 theme
	 choose	command	(which is how fish's default theme is set).

   Scripting improvements
        New  status  language	command	 allows	showing	and modifying language
	 settings for fish messages without having to modify environment vari-
	 ables.

        When using a noninteractive fish  instance  to	 compute  completions,
	 commandline  --cursor	works as expected instead of throwing an error
	 (#11993 <https://github.com/fish-shell/fish-shell/issues/11993>).

        fish_trace can	now be set to all to also trace	execution of key bind-
	 ings, event handlers as well as prompt	and title functions.

   Interactive improvements
        When typing immediately after starting	fish, the first	prompt is  now
	 rendered correctly.

        Completion  accuracy was improved for file paths containing = or : (-
	 #5363 <https://github.com/fish-shell/fish-shell/issues/5363>).

        Prefix-matching completions are now shown even	if  they  don't	 match
	 the   case   typed   by  the  user  (#7944  <https://github.com/fish-
	 shell/fish-shell/issues/7944>).

        On Cygwin/MSYS, command name completion will favor the	 non-exe  name
	 (foo) unless the user started typing the extension.

        When  using the exe name (foo.exe), fish will use the description and
	 completions for foo if	there are none for foo.exe.

        Autosuggestions  now  also   show   soft-wrapped   portions   (#12045
	 <https://github.com/fish-shell/fish-shell/issues/12045>).

   New or improved bindings
        ctrl-w	 (backward-kill-path-component)	also deletes escaped spaces (-
	 #2016 <https://github.com/fish-shell/fish-shell/issues/2016>).

        New   special	 input	 functions    backward-path-component,	  for-
	 ward-path-component	   and	     kill-path-component       (#12127
	 <https://github.com/fish-shell/fish-shell/issues/12127>).

   Improved terminal support
        Themes	can now	be made	color-theme-aware by  including	 both  [light]
	 and [dark] sections in	the theme file.	 Some default themes have been
	 made  color-theme-aware, meaning they dynamically adjust as your ter-
	 minal's background color switches between light and  dark  colors  (-
	 #11580	<https://github.com/fish-shell/fish-shell/issues/11580>).

        The  working directory	is now reported	on every fresh prompt (via OSC
	 7), fixing scenarios where a child process (like ssh) left  behind  a
	 stale	working	directory (#12191 <https://github.com/fish-shell/fish-
	 shell/issues/12191>).

        OSC 133 prompt	markers	now also mark the prompt end,  which  improves
	 shell	  integration	 with	 terminals    like    iTerm2   (#11837
	 <https://github.com/fish-shell/fish-shell/issues/11837>).

        Operating-system-specific key bindings	are now	decided	based  on  the
	 terminal's host OS.

        New  feature  flag  omit-term-workarounds can be turned on to prevent
	 fish from trying to work around some incompatible terminals.

   For distributors and	developers
        Tarballs no longer contain prebuilt documentation,  so	 building  and
	 installing  documentation  requires  Sphinx.  To avoid	users acciden-
	 tally losing docs, the	BUILD_DOCS and INSTALL_DOCS configuration  op-
	 tions have been replaced with a new WITH_DOCS option.

        fish_key_reader  and  fish_indent  are	 now installed as hardlinks to
	 fish, to save some space.

   Regression fixes:
        (from	4.1.0)	Crash  on  incorrectly-set  color  variables   (#12078
	 <https://github.com/fish-shell/fish-shell/issues/12078>).

        (from	4.1.0)	Crash when autosuggesting Unicode characters with non-
	 trivial lowercase mapping.

        (from 4.2.0) Incorrect	emoji width computation	on macOS.

        (from 4.2.0) Mouse clicks and ctrl-l edge cases in multiline  command
	 lines	    (#12121	 <https://github.com/fish-shell/fish-shell/is-
	 sues/12121>).

        (from 4.2.0) Completions for Git remote names on some non-glibc  sys-
	 tems.

        (from 4.2.0) Expansion	of ~$USER.

   fish	4.2.1 (released	November 13, 2025)
       This release fixes the following	problems identified in 4.2.0:

        When	building   from	 a  tarball  without  Sphinx  (that  is,  with
	 -DBUILD_DOCS=OFF or when sphinx-build	is  not	 found),  builtin  man
	 pages	and  help  files  were	missing,  which	has been fixed (#12052
	 <https://github.com/fish-shell/fish-shell/issues/12052>).

        fish_config's theme selector (the "colors" tab) was broken, which has
	 been  fixed   (#12053	 <https://github.com/fish-shell/fish-shell/is-
	 sues/12053>).

   fish	4.2.0 (released	November 10, 2025)
   Notable improvements	and fixes
        History-based autosuggestions now include multi-line commands.

        A  transient  prompt containing more lines than the final prompt will
	 now be	cleared	properly (#11875  <https://github.com/fish-shell/fish-
	 shell/issues/11875>).

        Taiwanese Chinese translations	have been added.

        French	    translations     have     been     supplemented    (#11842
	 <https://github.com/fish-shell/fish-shell/issues/11842>).

   Deprecations	and removed features
        fish now assumes UTF-8	for character encoding even if the system does
	 not have a UTF-8 locale.  Input bytes which are not valid  UTF-8  are
	 still	round-tripped correctly.  For example, file paths using	legacy
	 encodings can still be	used, but may be rendered differently  on  the
	 command line.

        On  systems  where  no	 multi-byte  locale is available, fish will no
	 longer	fall back to using ASCII replacements for  Unicode  characters
	 such as "".

   Interactive improvements
        The title of the terminal tab can now be set separately from the win-
	 dow   title   by   defining   the   fish_tab_title   function	(#2692
	 <https://github.com/fish-shell/fish-shell/issues/2692>).

        fish now hides	the portion of a multiline prompt that is scrolled out
	 of view due to	a huge command line. This prevents duplicate lines af-
	 ter   repainting    with    partially	  visible    prompt    (#11911
	 <https://github.com/fish-shell/fish-shell/issues/11911>).

        fish_config  prompt's choose and save subcommands have	been taught to
	 reset fish_mode_prompt	in addition to the other prompt	 functions  (-
	 #11937	<https://github.com/fish-shell/fish-shell/issues/11937>).

        fish  no longer force-disables	mouse capture (DECSET/DECRST 1000), so
	 you can use those commands to let mouse clicks	move the cursor	or se-
	 lect completions  items  (#4918  <https://github.com/fish-shell/fish-
	 shell/issues/4918>).

        The  alt-p  binding  no  longer adds a	redundant space	to the command
	 line.

        When run as a login shell on macOS, fish now sets  MANPATH  correctly
	 when  that  variable  was  already present in the environment (#10684
	 <https://github.com/fish-shell/fish-shell/issues/10684>).

        A Windows-specific case of the	web-based config failing to launch has
	 been  fixed   (#11805	 <https://github.com/fish-shell/fish-shell/is-
	 sues/11805>).

        A  MSYS2-specific  workaround for Konsole and WezTerm has been	added,
	 to prevent them from using the	wrong working directory	 when  opening
	 new	tabs   (#11981	 <https://github.com/fish-shell/fish-shell/is-
	 sues/11981>).

   For distributors and	developers
        Release tags and source code tarballs are  GPG-signed	again  (#11996
	 <https://github.com/fish-shell/fish-shell/issues/11996>).

        Documentation	in  release tarballs is	now built with the latest ver-
	 sion of Sphinx, which means that pre-built man	pages  include	OSC  8
	 hyperlinks.

        The  Sphinx  dependency is now	specified in pyproject.toml, which al-
	 lows you  to  use  uv	<https://github.com/astral-sh/uv>  to  provide
	 Sphinx	 for  building documentation (e.g. uv run cargo	install	--path
	 .).

        The minimum supported Rust version (MSRV) has been updated to 1.85.

        The standalone	build mode has been made the default.  This means that
	 the files in $CMAKE_INSTALL_PREFIX/share/fish will not	be  used  any-
	 more,	except	for  HTML  docs.  As a result, future upgrades will no
	 longer	break running shells if	one of fish's  internal	 helper	 func-
	 tions	has  been  changed  in the updated version.  For now, the data
	 files are still  installed  redundantly,  to  prevent	upgrades  from
	 breaking  already-running  shells  (#11921  <https://github.com/fish-
	 shell/fish-shell/issues/11921>).   To	reverse	 this  change	(which
	 should	 not  be  necessary),  patch  out  the embed-data feature from
	 cmake/Rust.cmake.  This option	will be	removed	in future.

        OpenBSD 7.8 revealed an issue with  fish's  approach  for  displaying
	 builtin man pages, which has been fixed.

   Regression fixes:
        (from	4.1.0)	Fix  the  web-based config for Python 3.9 and older (-
	 #12039	<https://github.com/fish-shell/fish-shell/issues/12039>).

        (from 4.1.0) Correct wrong terminal modes set by fish -c  'read;  cat
	 (#12024 <https://github.com/fish-shell/fish-shell/issues/12024>).

        (from 4.1.0) On VTE-based terminals, stop redrawing the prompt	on re-
	 size again, to	avoid glitches.

        (from	4.1.0)	On MSYS2, fix saving/loading of	universal variables (-
	 #11948	<https://github.com/fish-shell/fish-shell/issues/11948>).

        (from 4.1.0) Fix error	using man for the commands ! . : [  {  (#11955
	 <https://github.com/fish-shell/fish-shell/issues/11955>).

        (from	 4.1.0)	  Fix	build	issues	 on  illumos  systems  (#11982
	 <https://github.com/fish-shell/fish-shell/issues/11982>).

        (from	4.1.0)	Fix  crash  on	invalid	  function   command   (#11912
	 <https://github.com/fish-shell/fish-shell/issues/11912>).

        (from	4.0.0)	Fix build on SPARC and MIPS Linux by disabling SIGSTK-
	 FLT.

        (from 4.0.0) Fix crash	when passing negative PIDs to builtin wait  (-
	 #11929	<https://github.com/fish-shell/fish-shell/issues/11929>).

        (from 4.0.0) On Linux,	fix status fish-path output when fish has been
	 reinstalled since it was started.

   fish	4.1.2 (released	October	7, 2025)
       This release fixes the following	regressions identified in 4.1.0:

        Fixed spurious	error output when completing remote file paths for scp
	 (#11860 <https://github.com/fish-shell/fish-shell/issues/11860>).

        Fixed the alt-l binding not formatting	ls output correctly (one entry
	 per  line,  no	 colors)  (#11888 <https://github.com/fish-shell/fish-
	 shell/issues/11888>).

        Fixed an issue	where focus events (currently only  enabled  in	 tmux)
	 would cause multiline prompts to be redrawn in	the wrong line (#11870
	 <https://github.com/fish-shell/fish-shell/issues/11870>).

        Stopped  printing output that would cause a glitch on old versions of
	 Midnight   Commander	(#11869	  <https://github.com/fish-shell/fish-
	 shell/issues/11869>).

        Added	a  fix for some	configurations of Zellij where escape key pro-
	 cessing  was  delayed	(#11868	  <https://github.com/fish-shell/fish-
	 shell/issues/11868>).

        Fixed	a  case	 where the web-based configuration tool	would generate
	 invalid  configuration	 (#11861  <https://github.com/fish-shell/fish-
	 shell/issues/11861>).

        Fixed	a case where pasting into fish -c read would fail with a noisy
	 error	    (#11836	 <https://github.com/fish-shell/fish-shell/is-
	 sues/11836>).

        Fixed	a  case	 where upgrading fish would break old versions of fish
	 that were still running.

	 In general, fish still	needs to be restarted after  it	 is  upgraded,
	 except	 for  standalone  builds  <https://github.com/fish-shell/fish-
	 shell/?tab=readme-ov-file#building-fish-with-embedded-data-experimen-
	 tal>.

   fish	4.1.1 (released	September 30, 2025)
       This release fixes the following	regressions identified in 4.1.0:

        Many of our new Chinese translations were more	confusing  than	 help-
	 ful;	  they	   have	    been     fixed    or    removed    (#11833
	 <https://github.com/fish-shell/fish-shell/issues/11833>).

	 Note that you can work	around	this  type  of	issue  by  configuring
	 fish's	 message  localization:	if your	environment contains something
	 like LANG=zh_CN.UTF-8,	you can	use set	-g LC_MESSAGES en to use  Eng-
	 lish  messages	 inside	 fish.	 This  will  not  affect  fish's child
	 processes unless LC_MESSAGES was already exported.

        Some fish_config subcommands for showing prompts and themes had  been
	 broken	 in  standalone	Linux builds (those using the embed-data cargo
	 feature), which  has  been  fixed  (#11832  <https://github.com/fish-
	 shell/fish-shell/issues/11832>).

        On  Windows  Terminal,	 we observed an	issue where fish would fail to
	 read the terminal's response to our new startup queries, causing  no-
	 ticeable  lags	 and a misleading error	message. A workaround has been
	 added	    (#11841	 <https://github.com/fish-shell/fish-shell/is-
	 sues/11841>).

        A	WezTerm	     issue	breaking     shifted	 key	 input
	 <https://github.com/wezterm/wezterm/issues/6087>  has	resurfaced  on
	 some  versions	 of WezTerm; our workaround has	been extended to cover
	 all versions  for  now	 (#11204  <https://github.com/fish-shell/fish-
	 shell/issues/11204>).

        Fixed	a crash	in the web-based configuration tool when using the new
	 underline   styles    (#11840	  <https://github.com/fish-shell/fish-
	 shell/issues/11840>).

   fish	4.1.0 (released	September 27, 2025)
   Notable improvements	and fixes
        Compound commands (begin; echo	1; echo	2; end)	can now	be written us-
	 ing braces ({ echo1; echo 2 }), like in other shells.

        fish  now supports transient prompts: if fish_transient_prompt	is set
	 to 1, fish will reexecute prompt functions with the --final-rendering
	 argument     before	  running      a      commandline      (#11153
	 <https://github.com/fish-shell/fish-shell/issues/11153>).

        Tab completion	results	are truncated up to the	common directory path,
	 instead   of  somewhere  inside  that	path.  E.g.  if	 you  complete
	 "share/functions",  and  it  includes	the   files   "foo.fish"   and
	 "bar.fish",  the  completion  pager  will  now	 show  "/foo.fish" and
	 "/bar.fish"   (#11250	 <https://github.com/fish-shell/fish-shell/is-
	 sues/11250>).

        Self-installing builds	as created by e.g. cargo install no longer in-
	 stall other files, see	below.

        Our  gettext-based  message-localization  has	been  reworked,	adding
	 translations to self-installing builds; see below.

   Deprecations	and removed features
        set_color --background=COLOR  no  longer  implicitly  activates  bold
	 mode.	If your	theme is stored	in universal variables (the historical
	 default),  some  bold formatting might	be lost.  To fix this, we sug-
	 gest updating to the latest version of	our theme, to explicitly acti-
	 vate bold mode, for example use  fish_config  theme  save  "fish  de-
	 fault".

        {echo,echo}  or { echo, echo }	are no longer interpreted as brace ex-
	 pansion tokens	but as compound	commands.

        Terminfo-style	key names (bind	-k nul)	are no longer supported.  They
	 had  been  superseded	by  fish's  own	 key  names  since 4.0 (#11342
	 <https://github.com/fish-shell/fish-shell/issues/11342>).

        fish no longer	reads the terminfo database, so	its behavior is	gener-
	 ally no longer	affected by  the  TERM	environment  variable  (#11344
	 <https://github.com/fish-shell/fish-shell/issues/11344>).    For  the
	 time being, this change  can  be  reversed  via  the  ignore-terminfo
	 feature flag.	To do so, run the following once and restart fish:

	    set	-Ua fish_features no-ignore-terminfo

        The  --install	 option	 when  fish is built as	self-installing	is re-
	 moved,	see below.

        set_color ff0000 now outputs 24-bit RGB true-color even if  COLORTERM
	 is  unset.   One  can override	this by	setting	fish_term24bit to 0 (-
	 #11372	<https://github.com/fish-shell/fish-shell/issues/11372>).

        fish now requires the terminal	to respond to queries for the  Primary
	 Device	 Attribute.  For now, this can be reversed via a feature flag,
	 by running (once) set -Ua fish_features no-query-term and  restarting
	 fish.

        Users of GNU screen may experience minor glitches when	starting fish.

   Scripting improvements
        The argparse builtin has seen many improvements, see below.

        The string pad	command	now has	a -C/--center option.

        The  psub  command  now allows	combining --suffix with	--fifo (#11729
	 <https://github.com/fish-shell/fish-shell/issues/11729>).

        The read builtin has learned the --tokenize-raw  option  to  tokenize
	 without  quote	 removal  (#11084 <https://github.com/fish-shell/fish-
	 shell/issues/11084>).

   Interactive improvements
        Autosuggestions are now also provided in  multi-line  command	lines.
	 Like ctrl-r, these operate only on the	current	line.

        Autosuggestions  used	to  not	 suggest multi-line command-lines from
	 history; now autosuggestions include individual lines from multi-line
	 command-lines.

        The history pager search now preserves	ordering between  ctrl-s  for-
	 ward and ctrl-r backward searches.

        Instead  of  highlighting  events by flashing all text	to the left of
	 the cursor, failing history token search (alt-.) flashes the  associ-
	 ated  token, failing tab-completion flashes the to-be-completed token
	 (#11050     <https://github.com/fish-shell/fish-shell/issues/11050>),
	 deleting an autosuggestion (shift-delete) flashes the suggestion, and
	 all other scenarios flash the full command line.

        Pasted	 commands are now stripped of any $  command prefixes, to help
	 pasting code snippets.

        Builtin help options (e.g. abbr --help) now use man directly, meaning
	 that	 variables    like    MANWIDTH	  are	 respected     (#11786
	 <https://github.com/fish-shell/fish-shell/issues/11786>).

        funced	 will  now edit	copied functions directly, instead of the file
	 where function	--copy was invoked. (#11614  <https://github.com/fish-
	 shell/fish-shell/issues/11614>)

        Added	a  simple  fish_jj_prompt  which  reduces  visual noise	in the
	 prompt	inside Jujutsu <https://jj-vcs.github.io/jj/latest/> reposito-
	 ries that are colocated with Git.

   New or improved bindings
        On  non-macOS	systems,  alt-left,   alt-right,   alt-backspace   and
	 alt-delete  no	 longer	 operate on punctuation-delimited words	but on
	 whole arguments, possibly including special  characters  like	/  and
	 quoted	spaces.	 On macOS, the corresponding ctrl- prefixed keys oper-
	 ate  on whole arguments.  Word	operations are still available via the
	 other respective modifier, just like in most web browsers.

        ctrl-z	(undo) after executing a command  will	restore	 the  previous
	 cursor	 position instead of placing the cursor	at the end of the com-
	 mand line.

        The alt-s binding will	now also use run0 if available.

        Some mouse support has	been added: the	OSC 133	prompt marking feature
	 has learned about kitty's click_events=1 flag,	 which	allows	moving
	 fish's	 cursor	 by  clicking in the command line, and selecting pager
	 items	    (#10932	 <https://github.com/fish-shell/fish-shell/is-
	 sues/10932>).

        Before	 clearing the screen and redrawing, ctrl-l now pushes all text
	 located above the prompt to the terminal's scrollback,	via a new spe-
	 cial input function scrollback-push.  For compatibility  with	termi-
	 nals that do not implement ECMA-48's SCROLL UP	command, this function
	 is  only  used	 if  the  terminal  advertises	support	 for  that via
	 XTGETTCAP.

        Vi mode has learned ctrl-a (increment)	and ctrl-x (decrement) (#11570
	 <https://github.com/fish-shell/fish-shell/issues/11570>).

   Completions
        git completions now show the remote URL as description	when  complet-
	 ing remotes.

        systemctl  completions	no longer print	escape codes if	SYSTEMD_COLORS
	 happens  to  be  set	(#11465	  <https://github.com/fish-shell/fish-
	 shell/issues/11465>).

        Added and improved many completion scripts, notably tmux.

   Improved terminal support
        Support  for  double, curly, dotted and dashed	underlines, for	use in
	 fish_color_*	variables   and	  the	set_color   builtin    (#10957
	 <https://github.com/fish-shell/fish-shell/issues/10957>).

        Underlines   can   now	  be   colored	 independent  of  text	(#7619
	 <https://github.com/fish-shell/fish-shell/issues/7619>).

        New documentation page	Terminal Compatibility	(also  accessible  via
	 man fish-terminal-compatibility) lists	the terminal control sequences
	 used by fish.

   Other improvements
        Updated Chinese and German translations.

        fish_indent --dump-parse-tree now emits simple	metrics	about the tree
	 including its memory consumption.

        We  added  some  tools	 to improve development	workflows, for example
	 build_tools/{check,update_translations,release}.sh		   and
	 tests/test_driver.py.	In conjunction with cargo, these enable	almost
	 all day-to-day	development tasks without using	CMake.

   For distributors
        Builtin  commands  that support the --help option now require the man
	 program.  The direct dependency on mandoc and nroff has been removed.

        fish no longer	uses gettext MO	files, see below.   If	you  have  use
	 cases	which  are  incompatible  with our new approach, please	let us
	 know.

        The fish_indent and fish_key_reader programs are now  also  available
	 as builtins.  If fish is invoked via e.g. a symlink with one of these
	 names,	 it  will  act like the	given tool (i.e. it's a	multi-call bi-
	 nary).	 This allows truly distributing	fish as	a single file  (#10876
	 <https://github.com/fish-shell/fish-shell/issues/10876>).

        The  CMake build configuration	has been simplified and	no longer sec-
	 ond-guesses rustup.  It will run rustc	 and  cargo  via  PATH	or  in
	 ~/.cargo/bin/.	  If  that doesn't match your setup, set the Rust_COM-
	 PILER	    and	     Rust_CARGO	     CMake	variables      (#11328
	 <https://github.com/fish-shell/fish-shell/issues/11328>).

        Cygwin	support	has been reintroduced, since Rust gained a Cygwin tar-
	 get	  <https://github.com/rust-lang/rust/pull/134999>      (#11238
	 <https://github.com/fish-shell/fish-shell/issues/11238>).

        CMake 3.15 is now required.

   Changes to self-installing builds
       The self-installing build type introduced in fish 4.0 has been  changed
       (#11143	<https://github.com/fish-shell/fish-shell/issues/11143>).  Now
       fish built with embedded	data will just read the	data straight from its
       own binary or write it out to temporary files when  necessary,  instead
       of  requiring an	installation step on start.  That means	it is now pos-
       sible to	build fish as a	single file and	copy it	to any system  with  a
       compatible CPU architecture, including as a different user, without ex-
       tracting	 any  files.  As before, this is the default when building via
       cargo, and disabled when	building via CMake.  For packagers we continue
       to recommend CMake.

       Note: When fish is built	like this, the __fish_data_dir	variable  will
       be empty	because	that directory no longer has meaning.  You should gen-
       erally  not  need  these	 files.	 For example, if you want to make sure
       that completions	for "foo" are loaded, use complete -C"foo " >/dev/null
       instead).  The raw files	are  still  exposed  via  status  subcommands,
       mainly for fish's internal use, but you can also	use them as a last re-
       sort.

       Remaining  benefits of a	full installation (as currently	done by	CMake)
       are:

        man pages like	fish(1)	in standard locations, easily accessible  from
	 outside fish.

        a  local  copy	 of the	HTML documentation, typically accessed via the
	 help function.	 In builds with	embedded data, help will  redirect  to
	 e.g. https://fishshell.com/docs/current/

        fish_indent and fish_key_reader as separate files, making them	easily
	 accessible outside fish

        an   (empty)  /etc/fish/config.fish  as  well	as  empty  directories
	 /etc/fish/{functions,completions,conf.d}

        $PREFIX/share/pkgconfig/fish.pc, which	defines	directories  for  con-
	 figuration-snippets, like vendor_completions.d

   Changes to gettext localization
       We  replaced several parts of the gettext functionality with custom im-
       plementations   (#11726	 <https://github.com/fish-shell/fish-shell/is-
       sues/11726>).   Most notably, message extraction, which should now work
       reliably, and the runtime implementation, where we  no  longer  dynami-
       cally  link  to	gettext, but instead use our own implementation, whose
       behavior	is similar to GNU gettext, with	some  minor  deviations.   Our
       implementation  now  fully respects fish	variables, so locale variables
       do not have to be exported for fish localizations to work.  They	 still
       have  to	 be  exported  to inform other programs	about language prefer-
       ences.  The LANGUAGE environment	variable is  now  treated  as  a  path
       variable,  meaning  it is an implicitly colon-separated list.  While we
       no longer have any runtime dependency on	gettext, we still need gettext
       tools for building, most	notably	msgfmt.	 When building without	msgfmt
       available,  localization	 will  not work	with the resulting executable.
       Localization data is no longer sourced at runtime from MO files on  the
       file  system,  but  instead  built into the executable.	This is	always
       done, independently of the other	data embedding,	so all	fish  executa-
       bles  will have access to all message catalogs, regardless of the state
       of the file system.  Disabling our new localize-messages	cargo  feature
       will cause fish to be built without localization	support.  CMake	builds
       can continue to use the WITH_GETTEXT option, with the same semantics as
       the  localize-messages  feature.	  The  current implementation does not
       provide any configuration options for controlling which language	 cata-
       logs are	built into the executable (other than disabling	them all).  As
       a  workaround, you can delete files in the po directory before building
       to exclude unwanted languages.

   Changes to the argparse builtin
        argparse now saves recognised options,	including option-arguments  in
	 argv_opts,  allowing  them  to	 be forwarded to other commands	(#6466
	 <https://github.com/fish-shell/fish-shell/issues/6466>).

        argparse options can now be marked to be deleted from	argv_opts  (by
	 adding	 a  &  at  the end of the option spec, before a	! if present).
	 There is now also a corresponding -d /	--delete option	to fish_opt.

        argparse --ignore-unknown now removes preceding known	short  options
	 from  groups containing unknown options (e.g. when parsing -abc, if a
	 is known but b	is not,	then argv will contain -bc).

        argparse now has an -u	/ --move-unknown option	that works like	 --ig-
	 nore-unknown but preserves unknown options in argv.

        argparse now has an -S	/ --strict-longopts option that	forbids	abbre-
	 viating  long	options	 or  passing  them with	a single dash (e.g. if
	 there is a long option	called foo, --fo and --foo won't match it).

        argparse now has a -U / --unknown-arguments option to specify how  to
	 parse unknown option's	arguments.

        argparse  now	allows	specifying options that	take multiple optional
	 values	   by	 using	  =*	in    the    option    spec	(#8432
	 <https://github.com/fish-shell/fish-shell/issues/8432>).    In	 addi-
	 tion, fish_opt	has been modified to support such options by using the
	 --multiple-vals together with -o / --optional-val; -m is also now ac-
	 ceptable as an	abbreviation for --multiple-vals.

        fish_opt no longer requires you give a	short flag name	when  defining
	 options,  provided  you  give	it a long flag name with more than one
	 character.

        argparse option specifiers for	long-only options can now  start  with
	 /,  allowing the definition of	long options with a single letter. Due
	 to this change, the --long-only option	to fish_opt is now  no	longer
	 necessary and is deprecated.

        fish_opt  now has a -v	/ --validate option you	can use	to give	a fish
	 script	to validate values of the option.

					----

   fish	4.0.9 (released	September 27, 2025)
       This release fixes:

        a regression in 4.0.6 causing shifted keys to not be inserted on some
	 terminals    (#11813	 <https://github.com/fish-shell/fish-shell/is-
	 sues/11813>).

        a regression in 4.0.6 causing the build to fail on systems where char
	 is   unsigned	(#11804	 <https://github.com/fish-shell/fish-shell/is-
	 sues/11804>).

        a regression in 4.0.0 causing a crash on an invalid bg	invocation.

					----

   fish	4.0.8 (released	September 18, 2025)
       This release fixes a regression in 4.0.6	that caused user  bindings  to
       be   shadowed   by   either  fish's  or	a  plugin's  bindings  (#11803
       <https://github.com/fish-shell/fish-shell/issues/11803>).

					----

   fish	4.0.6 (released	September 12, 2025)
       This release of fish fixes a number of issues identified	in fish	4.0.2:

        fish  now  properly  inherits	$PATH  under  Windows	WSL2   (#11354
	 <https://github.com/fish-shell/fish-shell/issues/11354>).

        Remote	filesystems are	detected properly again	on non-Linux systems.

        the  printf builtin no	longer miscalculates width of multi-byte char-
	 acters	    (#11412	 <https://github.com/fish-shell/fish-shell/is-
	 sues/11412>).

        For  many  years,  fish  has been "relocatable" -- it was possible to
	 move the entire CMAKE_INSTALL_PREFIX and fish would use  paths	 rela-
	 tive  to its binary.  Only gettext locale paths were still determined
	 purely	at compile time, which has been	fixed.

        the commandline builtin failed	to print the commandline set by	a com-
	 mandline -C invocation, which broke some  completion  scripts.	  This
	 has   been   corrected	 (#11423  <https://github.com/fish-shell/fish-
	 shell/issues/11423>).

        To work around	terminals that fail to parse Operating System  Command
	 (OSC)	sequences, a temporary feature flag has	been added.  It	allows
	 you to	disable	prompt marking (OSC 133) by  running  (once)  set  -Ua
	 fish_features	  no-mark-prompt    and	   restarting	fish   (#11749
	 <https://github.com/fish-shell/fish-shell/issues/11749>).

        The routines to save history and universal variables have  seen  some
	 robustness improvements.

        builtin  status  current-command  no  longer  prints a	trailing blank
	 line.

        A crash displaying multi-line quoted command substitutions  has  been
	 fixed	    (#11444	 <https://github.com/fish-shell/fish-shell/is-
	 sues/11444>).

        Commands like set fish_complete_path ... accidentally	disabled  com-
	 pletion autoloading, which has	been corrected.

        nmcli completions have	been fixed to query network information	dynam-
	 ically	instead	of only	when completing	the first time.

        Git  completions  no longer print an error when no git-foo executable
	 is in PATH.

        Custom	completions like complete foo -l long -xa  ...	that  use  the
	 output	 of  commandline  -t.  on a command-line like foo --long= have
	 been invalidated by a change in 4.0; the completion scripts have been
	 adjusted  accordingly	(#11508	  <https://github.com/fish-shell/fish-
	 shell/issues/11508>).

        Some completions were misinterpreted, which caused garbage to be dis-
	 played	in the completion list.	This has been fixed.

        fish no longer	interprets invalid control sequences from the terminal
	 as if they were alt-[ or alt-o	key strokes.

        bind has been taught about the	printscreen and	menu keys.

        alt-delete now	deletes	the word right of the cursor.

        ctrl-alt-h	erases	   the	   last	    word     again     (#11548
	 <https://github.com/fish-shell/fish-shell/issues/11548>).

        alt-left alt-right were misinterpreted	because	they  send  unexpected
	 sequences  on	some  terminals; a workaround has been added.  (#11479
	 <https://github.com/fish-shell/fish-shell/issues/11479>).

        Key bindings like bind	shift-A	 are  no  longer  accepted;  use  bind
	 shift-a or bind A.

        Key  bindings	like bind shift-a take precedence over bind A when the
	 key event included the	shift modifier.

        Bindings using	shift with non-ASCII letters (such as ctrl-shift-) are
	 now supported.

        Bindings with modifiers such as bind ctrl-w work again	 on  non-Latin
	 keyboard  layouts  such as a Russian one.  This is implemented	by al-
	 lowing	key events such	as ctrl- to match bindings of the  correspond-
	 ing Latin key,	using the kitty	keyboard protocol's base layout	key (-
	 #11520	<https://github.com/fish-shell/fish-shell/issues/11520>).

        Vi mode: The cursor position after pasting via	p has been corrected.

        Vi  mode:  Trying  to	replace	the last character via r no longer re-
	 places	the last-but-one character  (#11484  <https://github.com/fish-
	 shell/fish-shell/issues/11484>).

					----

   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/is-
	 sues/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	 down-
	 graded	 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	(actu-
	 ally)	  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 ad-
	 ditional    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/is-
	 sues/11324>).

        Improvements  to  various  completions, including new completions for
	 wl-randr    (#11301	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/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  con-
	 taining   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/is-
	 sues/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' modi-
	 fications    (#11173	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 set-
	 ting::
		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  dis-
	 play  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>).

        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/is-
	 sues/11192>).

        The  kitty keyboard protocol is no longer used	under Midnight Comman-
	 der, 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  com-
	 pleted	 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/is-
	 sues/11248>).

        A number of crashes have been fixed, including	file names longer than
	 255   bytes   (#11221	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  Dis-
       tributors 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-com-
	 mandline    (#10935	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 de-
	 fault.	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 af-
	 fected, 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/is-
	 sues/10506>).

        Under Microsoft Windows Subsystem for Linux  1	 (not  WSL  2),	 back-
	 grounded  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-proto-
	 col/>	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 combina-
	 tions of modifiers ctrl, alt and shift, and distinguishing (for exam-
	 ple) 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 compati-
	 bility	for the	majority of bindings.

	 Keyboard  protocols can be turned off by disabling the	"keyboard-pro-
	 tocols" 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  ap-
	 pear 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 installa-
	 tion 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	 exam-
	 ple, 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/is-
	 sues/9751>).

        Abbreviations	can  now  be  restricted to specific commands. For in-
	 stance:

	    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/is-
	 sues/9411>).

   Deprecations	and removed features
        commandline --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 re-
	   gard.  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 eventu-
	 ally 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 data-
	 bases,	 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/redirec-
	 tion	    (#10774	 <https://github.com/fish-shell/fish-shell/is-
	 sues/10774>).

   Scripting improvements
        for loops will	no longer remember local variables from	 the  previous
	 iteration    (#10525	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  in-
	 put, 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/is-
	 sues/10212>).

        A  new	option commandline --showing-suggestion	tests whether an auto-
	 suggestion 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/is-
	 sues/9899>).

        string	shorten	behaves	better in the presence of non-printable	 char-
	 acters,  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/is-
	 sues/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 de-
	 fined 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 trigger-
	 ing a variable	event. This can	be useful to change a variable	in  an
	 event	handler	 (#10480 <https://github.com/fish-shell/fish-shell/is-
	 sues/10480>).

        Commas	in command substitution	output are no longer used  as  separa-
	 tors  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	exten-
	 sion (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	 vari-
	 able	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 interac-
	 tive  command line editor (#8603 <https://github.com/fish-shell/fish-
	 shell/issues/8603>).

        ctrl-x	(fish_clipboard_copy) on multiline commands now	 includes  in-
	 dentation    (#10437	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  er-
	 ror (#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/is-
	 sues/10088>).

        fish  no longer fails to open a FIFO if interrupted by	a terminal re-
	 size  signal  (#10250	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 com-
	 mand	substitution	(#9100	  <https://github.com/fish-shell/fish-
	 shell/issues/9100>).

        fish_add_path now automatically enables verbose mode when used	inter-
	 actively (in the command line), in an effort to be clearer about what
	 it    does    (#10532	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/10758>,	#10786	 <https://github.com/fish-shell/fish-shell/is-
	 sues/10786>) The color	scheme will not	be upgraded for	 existing  in-
	 stalls. 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>).

        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  dis-
	 played	  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/is-
	 sues/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	termi-
	 nal   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, im-
	 proving    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  cur-
	   rently 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 char-
	   acter     (#10741	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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  fo-
	   cus	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 al-
	   ternative 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/is-
	   sues/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/is-
	   sues/10648>).

	  Support  ab	and ib vi text objects.	New input functions are	intro-
	   duced	    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-com-
	 plete git add for files with leading periods. The default  file  com-
	 pletions  hide	these files, unless the	token itself has a leading pe-
	 riod (#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	--foo-
	 bar 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 to-
	 ken.	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/is-
	 sues/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	 bind-
	 ings (#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	 vari-
	 able,	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 vari-
	 able, 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 improvements
        status	 gained	 a  build-info 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/is-
	 sues/10624>).

        Performance  in  launching  external  processes has been improved for
	 many  cases   (#10869	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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	depen-
       dencies,	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 com-
       piler 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 ter-
       minfo 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/is-
	 sues/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  im-
	 proved,     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/is-
	   sues/10293>)

	  dmidecode   (#10368	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10368>)

	  mycli     (#10309	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10309>)

	  ollama     (#10327	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10327>)

	  pstree    (#10317	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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	inter-
       nals 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 re-
       main 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 edit-
	   ing	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/is-
	 sues/9891>,	#9931	 <https://github.com/fish-shell/fish-shell/is-
	 sues/9931>,	#10032	 <https://github.com/fish-shell/fish-shell/is-
	 sues/10032>,	#10052	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 pos-
	 sible.	 The timeout can be set	via the	new fish_sequence_key_delay_ms
	 variable     (#7401	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7401>), and may be set by	default	in future versions.

   Deprecations	and removed features
        LS_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/is-
	 sues/9900>).

        The builtin builtin will now properly error out  with	invalid	 argu-
	 ments	 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/is-
	 sues/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/is-
	 sues/10177>).

        Improved error	messages for errors occurring in command substitutions
	 (#10054 <https://github.com/fish-shell/fish-shell/issues/10054>).

   Interactive improvements
        read  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 ex-
	 ternal	 commands (#4656 <https://github.com/fish-shell/fish-shell/is-
	 sues/4656>).

        Opening the history search in vi mode switches	to  insert  mode  cor-
	 rectly	     (#10141	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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, fix-
	 ing	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/is-
	 sues/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	 posi-
	 tion.

        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/is-
	 sues/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 se-
	 lection 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-com-
	 plete	git  add for files with	leading	periods. The default file com-
	 pletions hide these files, unless the token itself has	a leading  pe-
	 riod (#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/is-
	   sues/10116>)

	  ar (#9720 <https://github.com/fish-shell/fish-shell/issues/9720>)

	  blender    (#9905	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9905>)

	  bws	    (#10165	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10165>)

	  calendar   (#10138	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10138>)

	  checkinstall	 (#10106 <https://github.com/fish-shell/fish-shell/is-
	   sues/10106>)

	  crc	    (#10034	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10034>)

	  doctl

	  gimp	(#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/is-
	   sues/9922>)

	  ibmcloud   (#10004	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10004>)

	  iwctl      (#6884	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6884>)

	  java_home   (#9998	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9998>)

	  krita      (#9903	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	   sues/10136>)

	  rpm-ostool	(#9669	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9669>)

	  smerge    (#10135	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10135>)

	  userdel    (#10056	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10056>)

	  watchexec   (#10027	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10027>)

	  wpctl     (#10043	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10043>)

	  xxd	    (#10137	 <https://github.com/fish-shell/fish-shell/is-
	   sues/10137>)

	  zabbix     (#9647	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9647>)

        The zfs completions no	longer print errors about setting a  read-only
	 variable     (#9705	 <https://github.com/fish-shell/fish-shell/is-
	 sues/9705>).

        The kitty completions have been removed in favor of keeping them  up-
	 stream	     (#9750	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 al-
	 ternative  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  mi-
       nor  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	 wild-
       cards  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  ex-
       ternal 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 fixes
        abbr  --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-func-
	 tional, 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 improvements
        abbr --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, in-
	 stead 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/is-
	 sues/2613>,	#9473	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 code-
	 points	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 cor-
	 rectly	     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/is-
	 sues/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/is-
	 sues/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/is-
	   sues/9558>)

	  neovim     (#9543	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9543>)

	  otool

	  pre-commit	(#9521	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9521>)

	  proxychains	(#9486	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9486>)

	  scrypt     (#9583	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	   sues/9560>)

	  ssh-copy-id	(#9675	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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 cor-
	 rect	 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 re-
	 gression   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 stan-
	 dard  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 incremen-
	 tal search seen in other shells. The new special input	function  his-
	 tory-pager has	been added for custom bindings.

        Abbreviations	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/is-
	 sues/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/is-
	 sues/7711>,	#9280	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 be-
	 haved 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") in-
	 stead 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	 exam-
	 ple,  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 improvements
        argparse can now be used without option specifications, to allow  us-
	 ing  --min-args, --max-args or	for commands that take no options (but
	 might in future) (#9006 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  no-
	 ticeable   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 be-
	 havior	 back	(#7762	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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,  se-
	 lects	 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 interactively.

        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 con-
	 tainer), 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 --selec-
	 tion-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:

	  ark

	  asciinema	(#9257	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9257>)

	  clojure    (#9272	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9272>)

	  csh

	  direnv     (#9268	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9268>)

	  dive	(#9082 <https://github.com/fish-shell/fish-shell/issues/9082>)

	  dolphin

	  dua (#9277 <https://github.com/fish-shell/fish-shell/issues/9277>)

	  efivar     (#9318	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9318>)

	  eg

	  es (#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/is-
	   sues/9177>)

	  kb

	  kind	(#9110 <https://github.com/fish-shell/fish-shell/issues/9110>)

	  konsole

	  ksh

	  loadkeys    (#9312	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9312>)

	  okular

	  op (#9300 <https://github.com/fish-shell/fish-shell/issues/9300>)

	  ouch	(#9405 <https://github.com/fish-shell/fish-shell/issues/9405>)

	  pix

	  readelf    (#8746	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8746>,	 #9386	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9386>)

	  qshell

	  rc

	  sad (#9145 <https://github.com/fish-shell/fish-shell/issues/9145>)

	  tcsh

	  toot

	  tox (#9078 <https://github.com/fish-shell/fish-shell/issues/9078>)

	  wish

	  xed

	  xonsh     (#9389	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9389>)

	  xplayer

	  xreader

	  xviewer

	  yash	(#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/is-
	 sues/9220>).

        Completion of tilde (~) works properly	even when the file  name  con-
	 tains	 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	 rela-
	 tive  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	avail-
	 able,	  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  dis-
	 abled (#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  cor-
	 rectly	 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/is-
	 sues/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/is-
	 sues/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/is-
	 sues/9321>).

        fish_key_reader now correctly exits when receiving a SIGHUP (like af-
	 ter 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/is-
	 sues/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 vari-
	 able 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/is-
	 sues/9035>).

        history  merge	when in	private	mode is	now an error, rather than wip-
	 ing 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/is-
	   sues/9065>)

	  expect     (#9060	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9060>)

	  navi	(#9064 <https://github.com/fish-shell/fish-shell/issues/9064>)

	  qdbus      (#9031	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9031>)

	  reflector   (#9027	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	 sues/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	multi-
	 ple  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/is-
	 sues/954>,	#8593	 <https://github.com/fish-shell/fish-shell/is-
	 sues/8593>).

        Scripts can now catch and handle the SIGINT and SIGTERM signals,  ei-
	 ther	 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/is-
	 sues/8857>,	#8865	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 expres-
	   sion	(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 back-
	   ground 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, turn-
	   ing 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-amper-
	 sand-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 re-
	 moved.	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 ter-
	 minal).  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 ad-
	 justed	 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/is-
	 sues/9011>,	#7918	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7918>,	#8979	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  com-
	 mands.	     (#8705	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 ap-
	 pend 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	avail-
	 able 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/is-
	 sues/8836>,	#8837	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/8879>,	#8583	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 pre-
	 ceding	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 preserv-
	 ing   newlines	 (#8983	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	   sues/8911>)

	  apk (#8951 <https://github.com/fish-shell/fish-shell/issues/8951>)

	  brightnessctl  (#8758 <https://github.com/fish-shell/fish-shell/is-
	   sues/8758>)

	  efibootmgr	(#9010	 <https://github.com/fish-shell/fish-shell/is-
	   sues/9010>)

	  fastboot    (#8904	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8904>)

	  optimus-manager     (#8913	  <https://github.com/fish-shell/fish-
	   shell/issues/8913>)

	  rclone     (#8819	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8819>)

	  sops	(#8821 <https://github.com/fish-shell/fish-shell/issues/8821>)

	  tuned-adm   (#8760	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8760>)

	  wg-quick    (#8687	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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_func-
	 tions.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  inadver-
	 tently	 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 scop-
	 ing  variables	 and  avoids  issues  with  --local, which is actually
	 block-scoped	(#565	 <https://github.com/fish-shell/fish-shell/is-
	 sues/565>,	#8145	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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_autosugges-
	 tion_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 back-
	 ground	 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	--fea-
	 tures	ampersand-nobg-in-token,qmark-noglob or	with a universal vari-
	 able called fish_features:

	    > set -Ua fish_features ampersand-nobg-in-token

        $status is now	forbidden as a command,	to prevent a surprisingly com-
	 mon   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 desirable	(#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 improvements
        string	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 out-
	 put 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 exit-
	 ing (#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/is-
	 sues/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 in-
	 dexes (#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/is-
	 sues/8258>)

        Some error messages occurring after fork, like	"text file busy"  have
	 been  replaced	by bespoke error messages for fish (like "File is cur-
	 rently	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  re-
	 turning    1	(#8211	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 es-
	 caped	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/is-
	 sues/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 abbrevia-
	 tion 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/is-
	 sues/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  ig-
	 nore	   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 to-
	 kenizer 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  defini-
	 tion,	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 substitu-
	 tion.

        history and __fish_print_help now properly support less  before  ver-
	 sion  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	exist-
	 ing   setups	(#8292	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  informa-
	 tion	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/is-
	 sues/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	 clos-
	 ing  is  faster  (#8209 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/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/is-
	 sues/8550>).

        The clipboard bindings	ignore X-based clipboard programs if the  DIS-
	 PLAY  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, in-
	 cluding 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/is-
	 sues/8610>).

        Multi-char bindings are no longer interrupted if a signal handler en-
	 queues	an event. (#8628 <https://github.com/fish-shell/fish-shell/is-
	 sues/8628>).

   New or improved bindings
        escape	 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 commands manual page) now	 also  ignores
	 command      (#8447	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 shortcuts

	  argparse    (#8434	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	   sues/8123>)

	  clasp      (#8373	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8373>)

	  cpupower    (#8302	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8302>)

	  dart	(#8315 <https://github.com/fish-shell/fish-shell/issues/8315>)

	  dscacheutil

	  elvish     (#8416	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8416>)

	  ethtool    (#8283	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8283>)

	  exif	(#8246 <https://github.com/fish-shell/fish-shell/issues/8246>)

	  findstr     (#8481	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8481>)

	  git-sizer   (#8156	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8156>)

	  gnome-extensions	(#8732	  <https://github.com/fish-shell/fish-
	   shell/issues/8732>)

	  gping     (#8181	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8181>)

	  isatty     (#8609	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8609>)

	  istioctl    (#8343	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8343>)

	  kmutil

	  kubectl     (#8734	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8734>)

	  matlab     (#8505	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8505>)

	  mono	(#8415 <https://github.com/fish-shell/fish-shell/issues/8415>)
	   and	related	tools csharp, gacutil, gendarme, ikdasm, ilasm,	mkbun-
	   dle,	   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/is-
	   sues/8111>)

	  nodeenv    (#8533	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8533>)

	  octave     (#8505	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8505>)

	  pabcnet_clear (#8421	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8421>)

	  qmk (#8180 <https://github.com/fish-shell/fish-shell/issues/8180>)

	  rakudo     (#8113	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8113>)

	  rc-status   (#8757	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8757>)

	  roswell     (#8330	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8330>)

	  sbcl	(#8330 <https://github.com/fish-shell/fish-shell/issues/8330>)

	  starship    (#8520	 <https://github.com/fish-shell/fish-shell/is-
	   sues/8520>)

	  topgrade    (#8651	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	   sues/8483>),	attrib,	attributes, choice, clean, cleanmgr, cmd, cmd-
	   key,	 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/is-
	 sues/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	Termi-
	 nal'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/is-
	 sues/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/is-
	 sues/8218>).

        The HTML version of the documentation and the web-based configuration
	 tool now pick more modern system fonts	instead	of falling back	to Ar-
	 ial  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  in-
	 stall	  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/is-
	 sues/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_IN-
	 STALL_DATADIR	 (#8150	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 uni-
	 versal	 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 comple-
       tions, 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 fixes
        fish_config gained a prompt subcommand	to show	and pick from the sam-
	 ple  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 improvements
        math  gained new functions log2 (like the documentation claimed), max
	 and	min    (#7856	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7856>).  math  functions can be used without the parentheses (eg
	 math sin 2 + 6), and functions	have the lowest	precedence in the  or-
	 der   of   operations	 (#7877	  <https://github.com/fish-shell/fish-
	 shell/issues/7877>).

        Shebang (#!) lines are	no longer required within shell	 scripts,  im-
	 proving  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  re-
	 ports	$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  per-
	 formance and allowing use with	Linux's	special	API files (/proc, /sys
	 and	such)	(#7836	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7836>).

        fish should now better	handle cd on filesystems with  broken  stat(3)
	 responses     (#7577	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 argu-
	 ments	 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 sub-
	 stitution 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  directo-
	 ries  (#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 cor-
	 rectly	     (#8082	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  di-
	 rectories  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/is-
	 sues/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/is-
	 sues/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 mod-
	 ify  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/is-
	 sues/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	 back-
	 grounds      (#3412	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 com-
	 mands (#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, fol-
	 lowing	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/is-
	 sues/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_ap-
	 pend  allow  toggling	the presence of	a prefix/suffix	on the current
	 commandline.	(#7905	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 ter-
	 lar  prompts	(#7932	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7932>).

        The  Web-based	 configuration's  prompt picker	now shows and installs
	 right	prompts	 (#7930	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7930>).

        The  git prompt now has the same symbol order in normal and "informa-
	 tive" 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/is-
	   sues/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 com-
	 pletions as cd	 (#4693	 <https://github.com/fish-shell/fish-shell/is-
	 sues/4693>).

        The  --force-files  option  to	complete works for bare	arguments, not
	 just  options	(#7920	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7920>).

        Completion descriptions for functions don't include the function def-
	 inition,  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 rela-
	 tive 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/is-
	 sues/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	expan-
	 sion.

   For distributors
        fish  runs  correctly	on  platforms  without	the O_CLOEXEC flag for
	 open(2)     (#8023	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/7841>).

        fish  will  no	longer hang on exit if another process is in the fore-
	 ground	on macOS (#7901	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/7853>).

        Arguments longer than 1024 characters no longer trigger excessive CPU
	 usage on macOS	 (#7837	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  re-
	 gression  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/is-
	 sues/7774>).

        fish_git_prompt  no longer causes screen flickering in	certain	termi-
	 nals (#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_tok-
	 enizer_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/is-
	 sues/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 over-
	 written     (#7754	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7754>),  matching	 a similar improvement for the universal vari-
	 able 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/is-
	 sues/7785>).

        Improvements	   to	   the	    rsync      completions	(#7763
	 <https://github.com/fish-shell/fish-shell/issues/7763>), some comple-
	 tion	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 fixes
        Undo and redo support for the command-line editor and pager search (-
	 #1367 <https://github.com/fish-shell/fish-shell/issues/1367>).	By de-
	 fault,	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  com-
	 mand 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	 exam-
	 ple:

	    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  con-
	 fig.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 run-
	 time (especially for functions). This makes it	 usable	 as  a	static
	 syntax	 checker  (#977	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  op-
	 erating  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 com-
	 pletion 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)  respec-
	 tively	     (#6574	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  di-
	 rectories.  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 im-
	 plemented    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 vari-
	 able is a path	variable.

        A  new	 variable,  fish_kill_signal, is set to	the signal that	termi-
	 nated 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 sub-
	 string	(#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 suc-
	 cessful     (#6947	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 sim-
	 plify 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 descrip-
	 tor. 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 com-
	 plete --command git, and it can show the loaded completions for  spe-
	 cific	    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 ter-
	 minal,	 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/is-
	 sues/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,  in-
	 cluding 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/is-
	 sues/7614>).

        fish  now finds user configuration even if the	HOME environment vari-
	 able is not set (#7620	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7620>).

        fish  no longer crashes when started from a Windows-style working di-
	 rectory  (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  exe-
	 cute commands (all configuration is completed). There is a new	--pro-
	 file-startup  option that only	profiles the startup and configuration
	 process     (#7648	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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	 exam-
	 ple 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	inter-
	 active	  mode	 (#7060	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7060>). This helps avoid hangs in	certain	circumstances, and al-
	 lows  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	opera-
	 tors (&& 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/is-
	 sues/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/is-
	 sues/6786>).

        fish_key_reader  sets	the  exit status to 0 when used	with --help or
	 --version    (#6964	 <https://github.com/fish-shell/fish-shell/is-
	 sues/6964>).

        fish_key_reader  and  fish_indent send	output from --version to stan-
	 dard	 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	previ-
	 ous  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 con-
	 fig.fish     (#7265	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/4829>,	#7085	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 in-
	 stead	 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_DE-
	 BUG_OUTPUT environment	variables.  This helps with debugging when  no
	 commandline options can be passed, like when fish is called in	a she-
	 bang (#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,	match-
	 ing other shells (#6926 <https://github.com/fish-shell/fish-shell/is-
	 sues/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_com-
	 mand_not_found	instead	of firing an event, making it  easier  to  re-
	 place	  and	 reason	   about.     Previously-defined   __fish_com-
	 mand_not_found_handler	functions with an appropriate  event  listener
	 will  still work (#7293 <https://github.com/fish-shell/fish-shell/is-
	 sues/7293>).

        ctrl-c	handling has  been  reimplemented  in  C++  and	 is  therefore
	 quicker      (#5259	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  dis-
	 abled,	 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 com-
	 mand	line   (#6937	 <https://github.com/fish-shell/fish-shell/is-
	 sues/6937>).

        History  search is now	case-insensitive unless	the search string con-
	 tains	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  out-
	 put  of  alias	 (#6910	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 docu-
	 mented,     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 Fire-
	 fox'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>).   Re-
	 sumed	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/is-
	 sues/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 com-
	 pletion, which	keeps the status display in the	 prompt	 as  the  last
	 command's status (#7555 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/7515>).

        A  crash in completions with inline variable assignment (eg A=	b) has
	 been	fixed	(#7344	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/7407>,	#7497	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7497>).

        bind  now shows \x7f for the del key instead of a literal DEL charac-
	 ter (#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 exe-
	 cuted	quickly	 (#5912	 <https://github.com/fish-shell/fish-shell/is-
	 sues/5912>).

        Redirection  targets  are no longer highlighted as error if they con-
	 tain variables	which will likely be defined by	the  current  command-
	 line (#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	 fall-
	 back) (#7678 <https://github.com/fish-shell/fish-shell/issues/7678>).

        Just  like  fish_indent, the interactive reader will indent continua-
	 tion 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 es-
	 cape by default) right	after fish picked  an  unambiguous  completion
	 will  undo  that (#7433 <https://github.com/fish-shell/fish-shell/is-
	 sues/7433>).

        fish_clipboard_paste (ctrl-v) trims indentation from  multiline  com-
	 mands,	 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/is-
	 sues/6648>,	#6755	 <https://github.com/fish-shell/fish-shell/is-
	 sues/6755>,	#6769	 <https://github.com/fish-shell/fish-shell/is-
	 sues/6769>,	#7442	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7442>,	#7516	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7516>).

        Vi mode bindings support ~ (tilde) to toggle the case of the selected
	 character    (#6908	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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	situa-
	 tions.

        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 sin-
	 gle 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   in-
	 cludes	 suppress-autosuggestion  to reflect whether an	autosuggestion
	 was suppressed	 (#1419	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/7191>,	#2083	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/7471>).

        The   Mercurial   prompt  correctly  shows  untracked	status	(#6906
	 <https://github.com/fish-shell/fish-shell/issues/6906>), and  by  de-
	 fault	only shows the branch for performance reasons.	A new variable
	 $fish_prompt_hg_show_informative_status can be	set to enable more in-
	 formation.

        The fish_vcs_prompt passes its	arguments to the various  VCS  prompts
	 that  it  calls  (#7033 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/6715>,	#7278	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7278>).

        A new helper function fish_is_root_user simplifies checking for supe-
	 ruser privilege (#7031	 <https://github.com/fish-shell/fish-shell/is-
	 sues/7031>,	#7123	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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, re-
	 gardless  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/is-
	 sues/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/is-
	 sues/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 be-
	 ing 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	termi-
	 nals),	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 appear-
	 ing   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/is-
	   sues/7035>)

	  alternatives	 (#7616	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7616>)

	  apk (#7108 <https://github.com/fish-shell/fish-shell/issues/7108>)

	  asciidoctor	 (#7000	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7000>)

	  avifdec  and	 avifenc  (#7674  <https://github.com/fish-shell/fish-
	   shell/issues/7674>)

	  bluetoothctl	 (#7438	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7438>)

	  cjxl	and djxl (#7673	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7673>)

	  cmark      (#7000	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7000>)

	  create_ap   (#7096	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7096>)

	  deno	(#7138 <https://github.com/fish-shell/fish-shell/issues/7138>)

	  dhclient    (#6684	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6684>)

	  Postgres-related commands dropdb, createdb, pg_restore, pg_dump and
	   pg_dumpall	(#6620	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6620>)

	  dotnet     (#7558	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7558>)

	  downgrade   (#6751	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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>)

	  gitk

	  groups     (#6889	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6889>)

	  hashcat     (#7746	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7746>)

	  hikari     (#7083	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7083>)

	  icdiff     (#7503	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	   sues/7468>)

	  k3d (#7202 <https://github.com/fish-shell/fish-shell/issues/7202>)

	  ldapsearch	(#7578	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7578>)

	  lightdm  and	 dm-tool  (#7624  <https://github.com/fish-shell/fish-
	   shell/issues/7624>)

	  losetup     (#7621	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7621>)

	  micro     (#7339	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	   sues/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/is-
	   sues/6845>)

	  prime-run	(#7241	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	   sues/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/is-
	   sues/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/is-
	   sues/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>), net-
	   workctl    (#7668	 <https://github.com/fish-shell/fish-shell/is-
	   sues/7668>)	  and	userdbctl   (#7667   <https://github.com/fish-
	   shell/fish-shell/issues/7667>)

	  tcpdump    (#6690	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6690>)

	  tig

	  traceroute	 and	tracepath   (#6803   <https://github.com/fish-
	   shell/fish-shell/issues/6803>)

	  windscribe	(#6788	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6788>)

	  wireshark, tshark, and dumpcap

	  xbps-*     (#7239	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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 di-
	   rectly 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, fix-
	   ing	   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/is-
	 sues/7153>), especially on macOS Big Sur where	there was  a  signifi-
	 cant  regression (#7365 <https://github.com/fish-shell/fish-shell/is-
	 sues/7365>,	#7511	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/5451>,	#6825	 <https://github.com/fish-shell/fish-shell/is-
	 sues/6825>).

        The  CHANGELOG	 was moved to restructured text, allowing it to	be in-
	 cluded	 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/is-
	 sues/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 stan-
	 dard  error with the ^	character is enabled.  The stderr-nocaret fea-
	 ture 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  fa-
	 vor 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-de-
	 fined __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  implic-
	 itly  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  num-
	 bered 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/is-
	 sues/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/is-
	 sues/6952>,	#6792	 <https://github.com/fish-shell/fish-shell/is-
	 sues/6792>).

        Building on on	macOS earlier than 10.13.6 succeeds, instead of	 fail-
	 ing   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/is-
	 sues/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	 code-
	 signing   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/is-
	 sues/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/is-
	 sues/6597>).

        Glob  ordering	 changes  which	were introduced	in 3.1.0 have been re-
	 verted, 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 cor-
	 rectly	     (#6614	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  suc-
	 cessful.

        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/is-
	 sues/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 be-
	 fore (#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 ses-
	 sions,	  as   they   did   in	 fish	2.7    and    before	(#6649
	 <https://github.com/fish-shell/fish-shell/issues/6649>).  These  han-
	 dlers 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  cur-
	 rent  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 sta-
	 tus, 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/is-
	 sues/6736>).

        help prefers to use xdg-open, avoiding	the use	of open	on Debian sys-
	 tems	 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/is-
	 sues/6624>,	#6806	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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	   So-
	 laris-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 Uni-
	 code 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,  im-
	 proving  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  re-
	 moval	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>).

        fishs debugging arguments have	been significantly improved. The --de-
	 bug-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 cur-
	 rent directory	as a last resort, even if the CDPATH variable does not
	 include it or . (#4484	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  per-
	 forms 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  com-
	 mands	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/is-
	 sues/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	 vari-
	 ables (#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/is-
	 sues/6287>).

        and is	no longer recognised as	a command, so  that  nonsensical  con-
	 structs   like	  and	and   and   produce   a	 syntax	 error	(#6089
	 <https://github.com/fish-shell/fish-shell/issues/6089>).

        maths 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  substi-
	 tutions could leak into enclosing scopes; this	was an inadvertent be-
	 haviour change	and has	been reverted (#6480 <https://github.com/fish-
	 shell/fish-shell/issues/6480>).

   Scripting improvements
        string	  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  di-
	 rectories  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 lim-
	 ited recursion	 (#3474	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/5692>).

        printf	 prints	what it	can when input hasnt 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 comple-
	 tions.	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 op-
	 tions,	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/is-
	 sues/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 argu-
	 ments 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 vari-
	 ables according to the	shells tokenization rules,  considering	 quot-
	 ing,  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/is-
	 sues/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 fol-
	 lowed	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/is-
	 sues/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/is-
	 sues/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 vari-
	 ables 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	abbre-
	 viation.

        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/is-
	 sues/6153>).

        The null command (:) now always exits successfully, rather than pass-
	 ing 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 func-
	 tion,	correctly   including	comments   or	blank	lines	(#5285
	 <https://github.com/fish-shell/fish-shell/issues/5285>),   and	  cor-
	 rectly	includes any --wraps  flags  (#1625  <https://github.com/fish-
	 shell/fish-shell/issues/1625>).

        type  supports	 a new option, --short,	which suppress function	expan-
	 sion (#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 can-
	 celled,   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 configu-
	 ration	     (#6504	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/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	shouldnt   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/is-
	 sues/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	 argu-
	 ment.

        Syntax	highlighting works correctly with variables as commands	(#5658
	 <https://github.com/fish-shell/fish-shell/issues/5658>)  and redirec-
	 tions to  close  file	descriptors  (#6092  <https://github.com/fish-
	 shell/fish-shell/issues/6092>).

        help	works	properly   on	Windows	 Subsystem  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/is-
	 sues/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/is-
	 sues/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  --argu-
	 ment-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 warn-
	 ing 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/is-
	 sues/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/is-
	 sues/4327>).

        Shift-Left  and  Shift-Right now default to moving backwards and for-
	 wards	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  autosugges-
	 tions (#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, in-
	 stead using a bell. They correctly store working directories contain-
	 ing   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  abbrevia-
	 tion  expansion  (#5762 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  se-
	 quence, 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 commands 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/is-
	 sues/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_informa-
	 tive_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 sig-
	 nal names when	appropriate.

   Improved terminal output
        New fish_pager_color_ options have been added to  control  more  ele-
	 ments	 of   the   pagers   colors  (#5524  <https://github.com/fish-
	 shell/fish-shell/issues/5524>).

        Better	detection and support for using	fish from various system  con-
	 soles,	 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  dis-
	 plays	emoji  as wide), eliminating the need to set $fish_emoji_width
	 in most  cases	 (#5722	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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

	  aws

	  bat (#6052 <https://github.com/fish-shell/fish-shell/issues/6052>)

	  bosh	(#5700 <https://github.com/fish-shell/fish-shell/issues/5700>)

	  btrfs

	  camcontrol

	  cf (#5700 <https://github.com/fish-shell/fish-shell/issues/5700>)

	  chronyc     (#6496	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6496>)

	  code	(#6205 <https://github.com/fish-shell/fish-shell/issues/6205>)

	  cryptsetup	(#6488	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6488>)

	  csc	and  csi  (#6016 <https://github.com/fish-shell/fish-shell/is-
	   sues/6016>)

	  cwebp     (#6034	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6034>)

	  cygpath  and	 cygstart  (#6239 <https://github.com/fish-shell/fish-
	   shell/issues/6239>)

	  epkginfo    (#5829	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	   sues/6182>)

	  hledger    (#6043	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6043>)

	  hwinfo     (#6496	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6496>)

	  irb (#6260 <https://github.com/fish-shell/fish-shell/issues/6260>)

	  iw (#6232 <https://github.com/fish-shell/fish-shell/issues/6232>)

	  kak

	  keepassxc-cli (#6505	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6505>)

	  keybase     (#6410	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6410>)

	  loginctl    (#6501	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6501>)

	  lz4,	 lz4c  and  lz4cat (#6364 <https://github.com/fish-shell/fish-
	   shell/issues/6364>)

	  mariner    (#5718	 <https://github.com/fish-shell/fish-shell/is-
	   sues/5718>)

	  nethack     (#6240	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6240>)

	  patool     (#6083	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6083>)

	  phpunit     (#6197	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6197>)

	  plutil     (#6301	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6301>)

	  pzstd      (#6364	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6364>)

	  qubes-gpg-client    (#6067	  <https://github.com/fish-shell/fish-
	   shell/issues/6067>)

	  resolvectl	(#6501	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6501>)

	  rg

	  rustup

	  sfdx	(#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/is-
	   sues/6085>)

	  tsc (#6016 <https://github.com/fish-shell/fish-shell/issues/6016>)

	  unlz4     (#6364	 <https://github.com/fish-shell/fish-shell/is-
	   sues/6364>)

	  unzstd     (#6364	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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 comple-
	 tion pager is	possible  (#5634  <https://github.com/fish-shell/fish-
	 shell/issues/5634>).

        Tab completion	will no	longer add trailing spaces if they already ex-
	 ist (#6107 <https://github.com/fish-shell/fish-shell/issues/6107>).

        Completion  of	subcommands to builtins	like and or not	now works cor-
	 rectly	     (#6249	 <https://github.com/fish-shell/fish-shell/is-
	 sues/6249>).

        Completion  of	arguments to short options works correctly when	multi-
	 ple 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 dou-
	 ble-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  re-
	 minder, the intention behind feature flags is that this will  eventu-
	 ally  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  re-
	 moved,	 leaving only the CMake	build system. All distributors and de-
	 velopers 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 al-
	 ways uses an internal wcwidth function. It has	a number of configura-
	 tion 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  sys-
	 tems	with   mandoc	installed   (#5489   <https://github.com/fish-
	 shell/fish-shell/issues/5489>).

        Some bugs preventing building on Solaris-derived systems such as  Il-
	 lumos were fixed (#5458 <https://github.com/fish-shell/fish-shell/is-
	 sues/5458>,	#5461	 <https://github.com/fish-shell/fish-shell/is-
	 sues/5461>,	#5611	 <https://github.com/fish-shell/fish-shell/is-
	 sues/5611>).

        Completions  for npm, bower and yarn no longer	require	the jq utility
	 for full functionality, but will use Python instead if	it  is	avail-
	 able.

        The  paths for	completions, functions and configuration snippets have
	 been extended.	On systems that	define XDG_DATA_DIRS, each of the  di-
	 rectories  in	this  variable	are  searched  in  the	subdirectories
	 fish/vendor_completions.d,  fish/vendor_functions.d,  and   fish/ven-
	 dor_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 improvements
        exec  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-inter-
	 active	 script	 (#5519	 <https://github.com/fish-shell/fish-shell/is-
	 sues/5519>).

        On macOS, path	entries	with spaces in /etc/paths and /etc/paths.d now
	 correctly  set	 path  entries with spaces.  Likewise, MANPATH is cor-
	 rectly	  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/is-
	 sues/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  con-
	 figuration    (#5490	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/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 al-
	 ways 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  re-
	 sult  in a hanging terminal when started. Cygwin users	are encouraged
	 to continue using 2.7.1 until a release which corrects	this is	avail-
	 able.

       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/is-
	 sues/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 expres-
	 sions;	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); --shells abbrevi-
	 ation	   (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/is-
	 sues/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 unintention-
	 ally  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/is-
	 sues/436>).

        The history builtins --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  alterna-
       tives.	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  ig-
	 nored	 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  fu-
	 ture  (#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
	 users 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, con-
	 trolled     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	$host-
	 name  reserved	 variable. This	removes	the dependency on the hostname
	 executable    (#4422	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 commands
        alias	has a new --save option	to save	the generated function immedi-
	 ately (#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	dynam-
	 ically-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 func-
	 tion  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/is-
	 sues/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-de-
	 limited 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/is-
	 sues/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/is-
	 sues/4680>).

        Typing	normal characters while	the  completion	 pager	is  active  no
	 longer	 shows	the search field. Instead it enters them into the com-
	 mand  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	check-
	 out' 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 rel-
	 ative	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	 {for-
	 ward,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 com-
	 mand, 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	 ansi-
	   ble-vault   (#4697	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4697>)

	  bb-power    (#4800	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4800>)

	  bd (#4472 <https://github.com/fish-shell/fish-shell/issues/4472>)

	  bower

	  clang  and  clang++	 (#4174	  <https://github.com/fish-shell/fish-
	   shell/issues/4174>)

	  conda      (#4837	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4837>)

	  configure (for autoconf-generated files only)

	  curl

	  doas	(#5196 <https://github.com/fish-shell/fish-shell/issues/5196>)

	  ebuild     (#4911	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4911>)

	  emaint     (#4758	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4758>)

	  eopkg     (#4600	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4600>)

	  exercism    (#4495	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4495>)

	  hjson

	  hugo	(#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/is-
	   sues/4814>)

	  jhipster    (#4472	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4472>)

	  kitty

	  kldload

	  kldunload

	  makensis    (#5242	 <https://github.com/fish-shell/fish-shell/is-
	   sues/5242>)

	  meson

	  mkdocs     (#4906	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4906>)

	  ngrok      (#4642	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4642>)

	  OpenBSDs pkg_add, pkg_delete, pkg_info, pfctl, rcctl, signify,  and
	   vmctl      (#4584	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4584>)

	  openocd

	  optipng

	  opkg	(#5168 <https://github.com/fish-shell/fish-shell/issues/5168>)

	  pandoc     (#2937	 <https://github.com/fish-shell/fish-shell/is-
	   sues/2937>)

	  port	(#4737 <https://github.com/fish-shell/fish-shell/issues/4737>)

	  powerpill	(#4800	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4800>)

	  pstack     (#5135	 <https://github.com/fish-shell/fish-shell/is-
	   sues/5135>)

	  serve      (#5026	 <https://github.com/fish-shell/fish-shell/is-
	   sues/5026>)

	  ttx

	  unzip

	  virsh     (#5113	 <https://github.com/fish-shell/fish-shell/is-
	   sues/5113>)

	  xclip      (#5126	 <https://github.com/fish-shell/fish-shell/is-
	   sues/5126>)

	  xsv

	  zfs and zpool (#4608	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	 sues/4200>,	#4341	 <https://github.com/fish-shell/fish-shell/is-
	 sues/4341>),	    executing	    functions,	     globs	(#4579
	 <https://github.com/fish-shell/fish-shell/issues/4579>), string read-
	 ing 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).

        Fishs 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 systems 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  ma-
	 cOS.

        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_vari-
	 ables (#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  en-
	 couraged 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  dis-
       play a warning about paste bracketing being left	on when	starting a new
       fish   session	(#4521	 <https://github.com/fish-shell/fish-shell/is-
       sues/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 upgrad-
       ing 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 ar-
	 guments with the same behavior	as builtin  commands.  This  also  in-
	 cludes	 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/is-
	 sues/1310>).

        string	 supports  new	lower  and upper subcommands, for altering the
	 case of strings (#4080	 <https://github.com/fish-shell/fish-shell/is-
	 sues/4080>).  The  case changing is not locale-aware yet.- string es-
	 cape 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	 vari-
	 able,	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	 vari-
	 ables (#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>).

        completes    --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/is-
	 sues/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/is-
	 sues/4091>).

        A regression in fish 2.6.0 where multiple read	commands in non-inter-
	 active	   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/is-
	 sues/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/is-
	   sues/4115>)

	  ezjail-admin	 (#4324	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4324>)

	  Fabrics  fab	 (#4153	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4153>)

	  grub-file	(#4119	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4119>)

	  grub-install	 (#4119	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4119>)

	  jest	(#4142 <https://github.com/fish-shell/fish-shell/issues/4142>)

	  kdeconnect-cli

	  magneto     (#4043	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4043>,	 #4108	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4108>)

	  mdadm      (#4198	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4198>)

	  passwd     (#4209	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4209>)

	  pip and pipenv (#4448 <https://github.com/fish-shell/fish-shell/is-
	   sues/4448>)

	  s3cmd      (#4332	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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	3s  subl  (#4277  <https://github.com/fish-shell/fish-
	   shell/issues/4277>)

        Lots of improvements to completions.

        Updated Chinese and French translations.

        Improved completions for:

	  apt

	  cd (#4061 <https://github.com/fish-shell/fish-shell/issues/4061>)

	  composer    (#4295	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4295>)

	  eopkg

	  flatpak    (#4456	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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>)

	  gphoto2

	  killall     (#4052	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4052>)

	  ln

	  npm (#4241 <https://github.com/fish-shell/fish-shell/issues/4241>)

	  ssh (#4377 <https://github.com/fish-shell/fish-shell/issues/4377>)

	  tail

	  xdg-mime    (#4333	 <https://github.com/fish-shell/fish-shell/is-
	   sues/4333>)

	  zypper     (#4325	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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  improve-
       ments 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/is-
	 sues/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/is-
	 sues/3772>  &	 #3788	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  re-
	 ductions  in  signal blocking.	Although this has been heavily tested,
	 it may	cause problems in some	circumstances;	set  the  FISH_NO_SIG-
	 NAL_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/is-
	 sues/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 sim-
	 ple  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  cur-
	 rent	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/is-
	 sues/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/is-
	 sues/2106>,	#3914	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 vari-
	 able; 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,	escap-
	 ing  problematic  characters  for  security  and  convenience	(#3871
	 <https://github.com/fish-shell/fish-shell/issues/3871>).  Inside sin-
	 gle quotes ('), single	quotes and backslashes in pasted text are  es-
	 caped	(#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/is-
	 sues/3970>). Python 3 is preferred, but Python	2.6 remains the	 mini-
	 mum 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/is-
	 sues/3744>)

        climate     (#3760	 <https://github.com/fish-shell/fish-shell/is-
	 sues/3760>)

        flatpak

        gradle	(#3859 <https://github.com/fish-shell/fish-shell/issues/3859>)

        gsettings     (#4001	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/3778>)

        mocha (#3828 <https://github.com/fish-shell/fish-shell/issues/3828>)

        mkdosfs      (#4017	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/3960>)

        usermod      (#3775	 <https://github.com/fish-shell/fish-shell/is-
	 sues/3775>)

        xinput

        yarn (#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>), port-
	 master	     (#3950	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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  upgrad-
       ing  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, GCCs g++ 4.8 or later,	or LLVMs 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 pack-
       ages  are no longer published by	the fish-shell developers for the fol-
       lowing 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 re-
       quired 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 compatibility	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 built-in 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-inter-
	 active. The old options continue to be	supported for the  foreseeable
	 future	     (#3526	 <https://github.com/fish-shell/fish-shell/is-
	 sues/3526>), although only one	subcommand or option can be  specified
	 at a time.

        Selection  mode (used with begin-selection) no	longer selects a char-
	 acter 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_de-
	 fault_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 improvements
        alias,	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 copy-
	 ing and pasting (#2673	 <https://github.com/fish-shell/fish-shell/is-
	 sues/2673>).

        help  launches	 the browser specified by the $fish_help_browser vari-
	 able  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/is-
	 sues/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/is-
	 sues/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  de-
	 fault)	 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>), pyg-
	 mentize     (#3378	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/3378>)

        VBoxSDL      (#3378	 <https://github.com/fish-shell/fish-shell/is-
	 sues/3378>)

        base64	(#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

        caffeinate    (#3524	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/3521>   &	  #3522	 <https://github.com/fish-shell/fish-shell/is-
	 sues/3522>)

        feh (#3378 <https://github.com/fish-shell/fish-shell/issues/3378>)

        launchctl    (#3682	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/3524>)

        mdfind	(#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

        mdimport     (#3524	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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/is-
	 sues/3492>)

        nvram (#3524 <https://github.com/fish-shell/fish-shell/issues/3524>)

        objdump      (#3378	 <https://github.com/fish-shell/fish-shell/is-
	 sues/3378>)

        sysbench     (#3491	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 ver-
	 sion identifier.

        Automatic  cursor changes are now only	enabled	on the subset of XTerm
	 versions known	to support them, resolving a problem where older  ver-
	 sions	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 clip-
	 board - 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/is-
	 sues/3061>)

        history  uses	subcommands (history delete) rather than options (his-
	 tory  --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/is-
	 sues/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/is-
	 sues/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  com-
	 patible   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,  par-
	 ticularly     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 charac-
	 ters (#3069 <https://github.com/fish-shell/fish-shell/issues/3069>).

        history --merge now correctly interleaves items in chronological  or-
	 der (#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  re-
	 named	  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/is-
	 sues/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/is-
	 sues/2447>).

        Added completions for:

	  arcanist    (#3256	 <https://github.com/fish-shell/fish-shell/is-
	   sues/3256>)

	  connmanctl	(#3419	 <https://github.com/fish-shell/fish-shell/is-
	   sues/3419>)

	  figlet     (#3378	 <https://github.com/fish-shell/fish-shell/is-
	   sues/3378>)

	  mdbook     (#3378	 <https://github.com/fish-shell/fish-shell/is-
	   sues/3378>)

	  ninja      (#3415	 <https://github.com/fish-shell/fish-shell/is-
	   sues/3415>)

	  p4, the Perforce client (#3314 <https://github.com/fish-shell/fish-
	   shell/issues/3314>)

	  pygmentize	(#3378	 <https://github.com/fish-shell/fish-shell/is-
	   sues/3378>)

	  ranger     (#3378	 <https://github.com/fish-shell/fish-shell/is-
	   sues/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/is-
	 sues/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/is-
	 sues/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>),   An-
	 droid	(#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  con-
       tain all	the changes to fish since the last release, but	fixes a	number
       of issues directly affecting users at present and includes a small num-
       ber 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	 time-
	 stamps	 not being updated (#2859 <https://github.com/fish-shell/fish-
	 shell/issues/2859>).

        The string builtins 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 han-
	 dling (#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 improvements
        abbr 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 in-
	 correct 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  dont	 ship  an  appropriate
	 command      (#2932	 <https://github.com/fish-shell/fish-shell/is-
	 sues/2932>).

        Alt-# toggles the current command line	between	commented  and	uncom-
	 mented	 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/is-
	 sues/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 ex-
	 pressions. 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/is-
	 sues/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/is-
	 sues/2719>)

        and and or will now bind to the closest if or	while,	allowing  com-
	 pound	   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 us-
	 ing   source	(#2643	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 de-
	 fault,	in ~/.local/share), and	existing  history  will	 be  moved  on
	 first	  use	 (#744	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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

	  Archlinuxs asp, makepkg

	  Atoms   apm	 (#2390	 <https://github.com/fish-shell/fish-shell/is-
	   sues/2390>)

	  entr	   -	the    Event	 Notify	    Test     Runner	(#2265
	   <https://github.com/fish-shell/fish-shell/issues/2265>)

	  Fedoras  dnf	 (#2638	 <https://github.com/fish-shell/fish-shell/is-
	   sues/2638>)

	  OSX diskutil	 (#2738	 <https://github.com/fish-shell/fish-shell/is-
	   sues/2738>)

	  pkgng      (#2395	 <https://github.com/fish-shell/fish-shell/is-
	   sues/2395>)

	  pulseaudios pacmd and pactl

	  rusts rustc and cargo  (#2409  <https://github.com/fish-shell/fish-
	   shell/issues/2409>)

	  sysctl     (#2214	 <https://github.com/fish-shell/fish-shell/is-
	   sues/2214>)

	  systemds  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 cus-
	 tomization    (#2245	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 com-
	 ponent	(#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 prob-
	 lems. Notably,	old fish sessions will not be able to communicate uni-
	 versal	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	behav-
	 ing  as expected (#1567 <https://github.com/fish-shell/fish-shell/is-
	 sues/1567>).

        The previously-undocumented CMD_DURATION variable is now set for  all
	 commands  and contains	the execution time of the last command in mil-
	 liseconds    (#1585	 <https://github.com/fish-shell/fish-shell/is-
	 sues/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 work-
	 ing.

        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 pro-
	 ceed  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 par-
	 ticular 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 (recur-
	 sively)  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/is-
	 sues/997>).

        fish_indent can now produce colorized (--ansi)	and HTML (--html) out-
	 put (#1827 <https://github.com/fish-shell/fish-shell/issues/1827>).

        functions --erase now prevents	autoloaded functions  from  being  re-
	 loaded	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/is-
	 sues/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/is-
	 sues/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>), fos-
	 sil,  heroku	(#1790	 <https://github.com/fish-shell/fish-shell/is-
	 sues/1790>), iex (#1167 <https://github.com/fish-shell/fish-shell/is-
	 sues/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>),  sys-
	 temctl	(#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/is-
	 sues/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  dont
       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  re-
       quired.	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/is-
	 sues/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/is-
	 sues/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/is-
	 sues/1440>

   Other fixes
        fishd now ignores SIGPIPE, fixing crashes using tools like GNU	Paral-
	 lel 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 Changes
        Tab	  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/is-
	 sues/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  re-
	 turns	control	 immediately,  because	echo does not read from	stdin.
	 Now it	does not complete until	sleep exits (presumably	after 10  sec-
	 onds).

        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 sub-
	 shells. #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 mes-
	 sages.	#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 evald strings.	#684 <https://github.com/fish-
	 shell/fish-shell/issues/684>

        History search	(up-arrow) now shows the item matching the autosugges-
	 tion,	  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 Changes
        Command 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	effec-
	 tively	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/is-
	 sues/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     rxvts     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/is-
	 sues/624>

        fish_config knows how to find fish even if its	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 fol-
	 lowed	 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 appropri-
	 ate   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 users 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/is-
	 sues/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 intu-
	 itively #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 Fixes
        Implicit 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	 func-
	 tions 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 Features
        A history builtin, and	associated interactive function	 that  enables
	 deleting  history items. Example usage: * Print all history items be-
	 ginning 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 Features
        Autosuggestions.  Think  URL fields in	browsers. When you type	a com-
	 mand, 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; theres a lot of potential
	 for improvement here. The suggestions are computed  on	 a  background
	 pthread, so they never	slow down your typing. The autosuggestion fea-
	 ture 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 spec-
	 ifying	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 sup-
	 ported	via this mechanism (but	in addition to,	not instead  of,  com-
	 mand line mechanisms).

        Man  page  completions.  There	 is a new function fish_update_comple-
	 tions.	This function reads all	the man1 files from your manpath,  re-
	 moves	the  roff formatting, parses them to find the commands and op-
	 tions,	and outputs fish completions into  ~/.config/fish/completions.
	 It wont overwrite existing completion files (except ones that it gen-
	 erated	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. Weve made an  ef-
	 fort 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	dont 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 in-
	 stead of wchar_t *

        fish now spawns pthreads for tasks like syntax	highlighting that  re-
	 quire blocking	I/O.

        History  has  been completely rewritten. History files	now use	an ex-
	 tensible 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 internal-
	 ized into C strings that get compiled in  with	 fish.	This  substan-
	 tially	 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	fishs insanely
       expensive default prompt, which is  unchanged  in  my  version.	If  we
       switch  to  a prompt comparable to bashs	(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.

       Weve got	some work to do	to be as lean as bash, but were	on  the	 right
       track.

   Terminal Compatibility
       fish  writes  various  control sequences	to the terminal.  Some must be
       implemented to enable basic functionality, while	others enable optional
       features	and may	be ignored by the terminal.

       The terminal must be able to parse Control  Sequence  Introducer	 (CSI)
       commands, Operating System Commands (OSC) and optionally	Device Control
       Strings	(DCS).	 These are defined by ECMA-48.	If a valid CSI,	OSC or
       DCS sequence does not represent a command implemented by	the  terminal,
       the terminal must ignore	it.  For historical reasons, OSC sequences may
       be terminated with \x07 instead of \e\\.

       Control	sequences  are denoted in a fish-like syntax.  Special charac-
       ters other than \ are not escaped.  Spaces are only added for readabil-
       ity and are not part of the sequence.  Placeholders are written	as  Ps
       for a number or Pt for an arbitrary printable string.

       NOTE:  fish  does not rely on your system's terminfo database.  In this
       document, terminfo (TI) codes are included for reference	only.

   Required Commands
		     +----------+-------+---------------------+
		     | Sequence	| TI	| Description	      |
		     +----------+-------+---------------------+
		     | \r	| n/a	| Move cursor to  the |
		     |		|	| beginning   of  the |
		     |		|	| line		      |
		     +----------+-------+---------------------+
		     | \n	| cud1	| Move	cursor	 down |
		     |		|	| one line.	      |
		     +----------+-------+---------------------+
		     | \e[ Ps A	| cuu	| Move	cursor	up Ps |
		     |		|	| columns,   or	  one |
		     |		|	| column  if no	para- |
		     |		|	| meter.	      |
		     +----------+-------+---------------------+
		     | \e[ Ps C	| cuf	| Move cursor to  the |
		     |		|	| right	 Ps  columns, |
		     |		|	| or one column	if no |
		     |		|	| parameter.	      |
		     +----------+-------+---------------------+
		     | \x08	| cub1	| Move	 cursor	  one |
		     |		|	| column to the	left. |
		     +----------+-------+---------------------+
		     | \e[ Ps D	| cub	| Move	cursor to the |
		     |		|	| left Ps times.      |
		     +----------+-------+---------------------+
		     | \e[H	| cup	| Set cursor position |
		     |		|	| (no	   parameters |
		     |		|	| means:  move to row |
		     |		|	| 1, column 1).	      |
		     +----------+-------+---------------------+
		     | \e[K	| el	| Clear	 to  end   of |
		     |		|	| line.		      |
		     +----------+-------+---------------------+
		     | \e[J	| ed	| Clear	to the end of |
		     |		|	| screen.	      |
		     +----------+-------+---------------------+
		     | \e[2J	| clear	| Clear	the screen.   |
		     +----------+-------+---------------------+
		     | \e[0c	|	| Request Primary De- |
		     |		|	| vice	   Attribute. |
		     |		|	| The  terminal	 must |
		     |		|	| respond  with	a CSI |
		     |		|	| command that starts |
		     |		|	| with the ?  parame- |
		     |		|	| ter  byte (so	a se- |
		     |		|	| quence     starting |
		     |		|	| with	\e[?) and has |
		     |		|	| c as final byte.    |
		     |		|	|		      |
		     |		|	| Failure  to  imple- |
		     |		|	| ment	  this	 will |
		     |		|	| cause	a brief	pause |
		     |		|	| at startup followed |
		     |		|	| by a warning.	  For |
		     |		|	| the	time   being, |
		     |		|	| both can be  turned |
		     |		|	| off  by turning off |
		     |		|	| the  query-terminal |
		     |		|	| feature flag.	      |
		     +----------+-------+---------------------+
		     | n/a	| am	| Soft	wrap  text at |
		     |		|	| screen width.	      |
		     +----------+-------+---------------------+
		     | n/a	| xenl	| Printing   to	  the |
		     |		|	| last	 column	 does |
		     |		|	| not move the cursor |
		     |		|	| to the  next	line. |
		     |		|	| Verify this by run- |
		     |		|	| ning	       printf |
		     |		|	| %0"$COLUMNS"d	   0; |
		     |		|	| sleep	3	      |
		     +----------+-------+---------------------+

   Optional Commands
       +---------------------+-------------+---------------------------------+
       | Sequence	     | TI	   | Description		     |
       +---------------------+-------------+---------------------------------+
       | \t		     | it	   | Move  the cursor to	     |
       |		     |		   | the next  tab  stop	     |
       |		     |		   | (	    8  columns).	     |
       |		     |		   | This is mainly rel-	     |
       |		     |		   | evant    if    your	     |
       |		     |		   | prompt	includes	     |
       |		     |		   | tabs.			     |
       +---------------------+-------------+---------------------------------+
       | \e[m		     | sgr0	   | Turn	     off	     |
       |		     |		   | bold/dim/italic/un-	     |
       |		     |		   | derline/reverse at-	     |
       |		     |		   | tribute  modes  and	     |
       |		     |		   | select default col-	     |
       |		     |		   | ors.			     |
       +---------------------+-------------+---------------------------------+
       | \e[1m		     | bold	   | Enter bold	mode.		     |
       +---------------------+-------------+---------------------------------+
       | \e[2m		     | dim	   | Enter dim mode.		     |
       +---------------------+-------------+---------------------------------+
       | \e[3m		     | sitm	   | Enter italic mode.		     |
       +---------------------+-------------+---------------------------------+
       | \e[4m		     | smul	   | Enter     underline	     |
       |		     |		   | mode.			     |
       +---------------------+-------------+---------------------------------+
       | \e[4:2m	     | Su	   | Enter double under-	     |
       |		     |		   | line mode.			     |
       +---------------------+-------------+---------------------------------+
       | \e[4:3m	     | Su	   | Enter  curly under-	     |
       |		     |		   | line mode.			     |
       +---------------------+-------------+---------------------------------+
       | \e[4:4m	     | Su	   | Enter dotted under-	     |
       |		     |		   | line mode.			     |
       +---------------------+-------------+---------------------------------+
       | \e[4:5m	     | Su	   | Enter dashed under-	     |
       |		     |		   | line mode.			     |
       +---------------------+-------------+---------------------------------+
       | \e[7m		     | rev	   | Enter reverse video	     |
       |		     |		   | mode  (swap   fore-	     |
       |		     |		   | ground   and  back-	     |
       |		     |		   | ground colors).		     |
       +---------------------+-------------+---------------------------------+
       | \e[23m		     | ritm	   | Exit italic mode.		     |
       +---------------------+-------------+---------------------------------+
       | \e[24m		     | rmul	   | Exit      underline	     |
       |		     |		   | mode.			     |
       +---------------------+-------------+---------------------------------+
       | \e[38;5; Ps m	     | setaf	   | Select   foreground	     |
       |		     |		   | color Ps  from  the	     |
       |		     |		   | 256-color-palette.		     |
       +---------------------+-------------+---------------------------------+
       | \e[48;5; Ps m	     | setab	   | Select   background	     |
       |		     |		   | color Ps  from  the	     |
       |		     |		   | 256-color-palette.		     |
       +---------------------+-------------+---------------------------------+
       | \e[58:5:    Ps	   m | Su	   | Select    underline	     |
       | (note:	 colons	 not |		   | color Ps  from  the	     |
       | semicolons)	     |		   | 256-color-palette.		     |
       +---------------------+-------------+---------------------------------+
       | \e[ Ps	m	     | setaf setab | Select	   fore-	     |
       |		     |		   | ground/background		     |
       |		     |		   | color. This uses  a	     |
       |		     |		   | color in the afore-	     |
       |		     |		   | mentioned			     |
       |		     |		   | 256-color-palette,		     |
       |		     |		   | based  on the range	     |
       |		     |		   | that  contains  the	     |
       |		     |		   | parameter:	   30-37	     |
       |		     |		   | maps to  foreground	     |
       |		     |		   | 0-7,  40-47 maps to	     |
       |		     |		   | background	    0-7,	     |
       |		     |		   | 90-97 maps	to fore-	     |
       |		     |		   | ground   8-15   and	     |
       |		     |		   | 100-107   maps   to	     |
       |		     |		   | background	8-15.		     |
       +---------------------+-------------+---------------------------------+
       | \e[38;2;  Ps ;	Ps ; |		   | Select   foreground	     |
       | Ps m		     |		   | color  from  24-bit	     |
       |		     |		   | RGB colors.		     |
       +---------------------+-------------+---------------------------------+
       | \e[48;2; Ps ; Ps  ; |		   | Select   background	     |
       | Ps m		     |		   | color  from  24-bit	     |
       |		     |		   | RGB colors.		     |
       +---------------------+-------------+---------------------------------+
       | \e[49m		     |		   | Reset    background	     |
       |		     |		   | color to the termi-	     |
       |		     |		   | nal's default.		     |
       +---------------------+-------------+---------------------------------+
       | \e[58:2:: Ps :	Ps : | Su	   | Select    underline	     |
       | Ps m (note:  colons |		   | color  from  24-bit	     |
       | not semicolons)     |		   | RGB colors.		     |
       +---------------------+-------------+---------------------------------+
       | \e[59m		     | Su	   | Reset     underline	     |
       |		     |		   | color  to	the  de-	     |
       |		     |		   | fault  (follow  the	     |
       |		     |		   | foreground	color).		     |
       +---------------------+-------------+---------------------------------+
       | \e[ Ps	S	     | indn	   | Scroll up the  con-	     |
       |		     |		   | tent (not the view-	     |
       |		     |		   | port)    Ps   lines	     |
       |		     |		   | (called SCROLL UP /	     |
       |		     |		   | SU	by  ECMA-48  and	     |
       |		     |		   | "scroll forward" by	     |
       |		     |		   | terminfo).	    When	     |
       |		     |		   | fish  detects  sup-	     |
       |		     |		   | port  for this fea-	     |
       |		     |		   | ture,	  status	     |
       |		     |		   | test-terminal-fea-		     |
       |		     |		   | tures   scroll-con-	     |
       |		     |		   | tent-up will return	     |
       |		     |		   | 0,	 which	 enables	     |
       |		     |		   | the  ctrl-l binding	     |
       |		     |		   | to	    use	     the	     |
       |		     |		   | scrollback-push		     |
       |		     |		   | special input func-	     |
       |		     |		   | tion.			     |
       +---------------------+-------------+---------------------------------+
       | \e[=  Ps u, \e[? Ps | n/a	   | Enable  the   kitty	     |
       | u		     |		   | keyboard protocol.		     |
       +---------------------+-------------+---------------------------------+
       | \e[6n		     | n/a	   | Request  cursor po-	     |
       |		     |		   | sition report.  The	     |
       |		     |		   | response must be of	     |
       |		     |		   | the form \e[  Ps  ;	     |
       |		     |		   | Ps	  R   where  the	     |
       |		     |		   | first parameter  is	     |
       |		     |		   | the  row number and	     |
       |		     |		   | the second	 parame-	     |
       |		     |		   | ter  is  the column	     |
       |		     |		   | number.  Both start	     |
       |		     |		   | at	1.			     |
       |		     |		   |				     |
       |		     |		   | This  is  used  for	     |
       |		     |		   | truncating	  multi-	     |
       |		     |		   | line    autosugges-	     |
       |		     |		   | tions     at    the	     |
       |		     |		   | screen's	  bottom	     |
       |		     |		   | edge,     by    the	     |
       |		     |		   | scrollback-push		     |
       |		     |		   | special input func-	     |
       |		     |		   | tion,  and	  inside	     |
       |		     |		   | terminals	that im-	     |
       |		     |		   | plement the OSC 133	     |
       |		     |		   | click_events   fea-	     |
       |		     |		   | ture.			     |
       +---------------------+-------------+---------------------------------+
       | \e[ \x20 q	     | Se	   | Reset  cursor style	     |
       |		     |		   | to	 the  terminal's	     |
       |		     |		   | default.	This  is	     |
       |		     |		   | not used as of  to-	     |
       |		     |		   | day  but  may be in	     |
       |		     |		   | future.			     |
       +---------------------+-------------+---------------------------------+
       | \e[ Ps	\x20 q	     | Ss	   | Set  cursor   style	     |
       |		     |		   | (DECSCUSR);  Ps  is	     |
       |		     |		   | 2,	 4  or	 6   for	     |
       |		     |		   | block,   underscore	     |
       |		     |		   | or	line shape.		     |
       +---------------------+-------------+---------------------------------+
       | \e[ Ps	q	     | n/a	   | Request	terminal	     |
       |		     |		   | name   and	 version	     |
       |		     |		   | (XTVERSION).   This	     |
       |		     |		   | is	 only  used  for	     |
       |		     |		   | temporary			     |
       |		     |		   | workarounds for in-	     |
       |		     |		   | compatible	  termi-	     |
       |		     |		   | nals.			     |
       +---------------------+-------------+---------------------------------+
       | \e[?25h	     | cvvis	   | Enable cursor visi-	     |
       |		     |		   | bility (DECTCEM).		     |
       +---------------------+-------------+---------------------------------+
       | \e[?1004h	     | n/a	   | Enable   focus  re-	     |
       |		     |		   | porting.			     |
       +---------------------+-------------+---------------------------------+
       | \e[?1004l	     | n/a	   | Disable  focus  re-	     |
       |		     |		   | porting.			     |
       +---------------------+-------------+---------------------------------+
       | \e[?1049h	     | n/a	   | Enable    alternate	     |
       |		     |		   | screen buffer.		     |
       +---------------------+-------------+---------------------------------+
       | \e[?1049l	     | n/a	   | Disable   alternate	     |
       |		     |		   | screen buffer.		     |
       +---------------------+-------------+---------------------------------+
       | \e[?2004h	     |		   | Enable    bracketed	     |
       |		     |		   | paste.			     |
       +---------------------+-------------+---------------------------------+
       | \e[?2004l	     |		   | Disable   bracketed	     |
       |		     |		   | paste.			     |
       +---------------------+-------------+---------------------------------+
       | \e[?2031h	     |		   | Enable  unsolicited	     |
       |		     |		   | color theme report-	     |
       |		     |		   | ing   <https://con-	     |
       |		     |		   | tour-termi-		     |
       |		     |		   | nal.org/vt-exten-		     |
       |		     |		   | sions/color-		     |
       |		     |		   | palette-update-no-		     |
       |		     |		   | tifications/>.		     |
       |		     |		   | When  enabled,  the	     |
       |		     |		   | terminal	  should	     |
       |		     |		   | send  \e[?997;1n or	     |
       |		     |		   | \e[?997;2n	whenever	     |
       |		     |		   | its color theme has	     |
       |		     |		   | changed.	    This	     |
       |		     |		   | prompts   fish   to	     |
       |		     |		   | query	     for	     |
       |		     |		   | background	color.		     |
       +---------------------+-------------+---------------------------------+
       | \e[?2031l	     |		   | Disable unsolicited	     |
       |		     |		   | color theme report-	     |
       |		     |		   | ing.			     |
       +---------------------+-------------+---------------------------------+
       | \e]0; Pt \e\\	     | ts	   | Set terminal window	     |
       |		     |		   | title (OSC	0). Used	     |
       |		     |		   | in	fish_title.		     |
       +---------------------+-------------+---------------------------------+
       | \e]2; Pt \e\\	     | ts	   | Set   terminal  tab	     |
       |		     |		   | title (OSC	1). Used	     |
       |		     |		   | in	fish_tab_title.		     |
       +---------------------+-------------+---------------------------------+
       | \e]7;file://  Pt  / |		   | Report  working di-	     |
       | Pt \e\\	     |		   | rectory  (OSC   7).	     |
       |		     |		   | Since  the	terminal	     |
       |		     |		   | may be running on a	     |
       |		     |		   | different	  system	     |
       |		     |		   | than   a	(remote)	     |
       |		     |		   | shell, the	hostname	     |
       |		     |		   | (first   parameter)	     |
       |		     |		   | will  not be local-	     |
       |		     |		   | host.			     |
       +---------------------+-------------+---------------------------------+
       | \e]8;;	Pt \e\\	     |		   | Create a  hyperlink	     |
       |		     |		   | (OSC	      8)	     |
       |		     |		   | <https://gist.github.com/egmon- |
       |		     |		   | tkob/eb114294ef-		     |
       |		     |		   | bcd5adb1944c9f3cb5feda>.	     |
       |		     |		   | This  is  used   in	     |
       |		     |		   | fish's man	pages.		     |
       +---------------------+-------------+---------------------------------+
       | \e]11;?\e\\	     | n/a	   | Query background color.	     |
       |		     |		   |				     |
       |		     |		   | A	valid  response	 would be of |
       |		     |		   | the form \e]11;rgb: Pt /  Pt  / |
       |		     |		   | Pt	 \e\\ or \e]11;rgba: Pt	/ Pt |
       |		     |		   | / Pt / Pt\e\\ where  the  first |
       |		     |		   | three parameters consist of one |
       |		     |		   | to	four hex digits	each, repre- |
       |		     |		   | senting  red,  blue  and  green |
       |		     |		   | components.		     |
       |		     |		   |				     |
       |		     |		   | This  is	used   to   populate |
       |		     |		   | fish_terminal_color_theme,	     |
       |		     |		   | which is used to select a theme |
       |		     |		   | variant  optimized	for the	ter- |
       |		     |		   | minal's color theme.	     |
       +---------------------+-------------+---------------------------------+
       | \e]52;c; Pt \e\\    |		   | Copy  to  clipboard  (OSC	52). |
       |		     |		   | Used by fish_clipboard_copy.    |
       +---------------------+-------------+---------------------------------+
       | \e]133;A;	     |		   | Mark  prompt  start  (OSC 133), |
       | click_events=1\e\\  |		   | with kitty's  click_events	 ex- |
       |		     |		   | tension.	The click_events ex- |
       |		     |		   | tension enables mouse clicks to |
       |		     |		   | move the cursor or	select pager |
       |		     |		   | items, assuming that cursor po- |
       |		     |		   | sition reporting is available.  |
       +---------------------+-------------+---------------------------------+
       | \e]133;B\e\\	     |		   | Mark prompt end (OSC 133).	     |
       +---------------------+-------------+---------------------------------+
       | \e]133;C;	cmd- |		   | Mark  command  start (OSC 133), |
       | line_url= Pt \e\\   |		   | with kitty's cmdline_url exten- |
       |		     |		   | sion  whose  parameter  is	 the |
       |		     |		   | URL-encoded command line.	     |
       +---------------------+-------------+---------------------------------+
       | \e]133;D; Ps \e\\   |		   | Mark command end (OSC 133);  Ps |
       |		     |		   | is	the exit status.	     |
       +---------------------+-------------+---------------------------------+
       | \eP+q Pt \e\\	     |		   | Request   terminfo	  capability |
       |		     |		   | (XTGETTCAP).  The parameter  is |
       |		     |		   | the   capability's	 hex-encoded |
       |		     |		   | terminfo code.		     |
       |		     |		   |				     |
       |		     |		   | The response  must	 be  of	 the |
       |		     |		   | form \eP1+q Pt \e\\ ("boolean") |
       |		     |		   | or	  \eP1+q   Pt	=   Pt	\e\\ |
       |		     |		   | ("string").  In either variant, |
       |		     |		   | the first parameter must be the |
       |		     |		   | same as the request parameter.  |
       |		     |		   |				     |
       |		     |		   | fish  queries   the   following |
       |		     |		   | string capabilities:	     |
       |		     |		   |				     |
       |		     |		   |	     indn		     |
       |		     |		   |				     |
       |		     |		   |	      The  response's second |
       |		     |		   |	      parameter	is ignored.  |
       |		     |		   |				     |
       |		     |		   |	     query-os-name	(for |
       |		     |		   |	      status terminal-os)    |
       |		     |		   |				     |
       |		     |		   |	      Terminals	 running  on |
       |		     |		   |	      Unix  should   respond |
       |		     |		   |	      with  the	hex encoding |
       |		     |		   |	      of $(uname -s) as	sec- |
       |		     |		   |	      ond parameter.	     |
       +---------------------+-------------+---------------------------------+

   DCS commands	and GNU	screen
       DCS parsing is optional because fish temporarily	switches to the	alter-
       nate screen before printing  any	 DCS  commands.	  However,  since  GNU
       screen  neither	allows	turning	 on the	alternate screen buffer	by de-
       fault, nor treats DCS commands in  a  compatible	 way,  fish's  initial
       prompt  may  be garbled by a DCS	payload	like +q696e646e.  For the time
       being, fish works around	this by	checking for presence of the STY envi-
       ronment variable.  If that doesn't work for some	reason,	 you  can  add
       this to your ~/.screenrc:

	  altscreen on

       Or add this to your config.fish:

	  function GNU-screen-workaround --on-event fish_prompt
	      commandline -f repaint
	      functions	--erase	GNU-screen-workaround
	  end

   Unicode Codepoints
       By default, fish	outputs	the following non-ASCII	characters:

       as  well	 as  control pictures (U+2400 through U+241F), and locale-spe-
       cific ones in translated	strings.

   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.

   Mailing List
       Send	  patches      to      the	public	    mailing	 list:
       mailto:~krobelus/fish-shell@lists.sr.ht.	  Archives  are	 available  at
       https://lists.sr.ht/~krobelus/fish-shell/.

   GitHub
       Fish	    is	       available	 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 (only the msgfmt tool)	- optional, for	translation support

        Sphinx	- optional, to build the documentation

       Of course not everything	is required always - if	you just want to  con-
       tribute	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 sup-
	 ported	Rust version, limit new	dependencies)

        Use automated tools to	help you (build_tools/check.sh)

   Commit History
       We use a	linear,	 recipe-style  <https://www.bitsnbites.eu/git-history-
       work-log-vs-recipe/> history.  Every commit should pass our checks.  We
       do  not	want  "fixup"  commits in our history.	If you notice an issue
       with a commit in	a pull request,	or get	feedback  suggesting  changes,
       you  should rewrite the commit history and fix the relevant commits di-
       rectly, instead of adding new "fixup" commits.  When a pull request  is
       ready,  we  rebase  it on top of	the current master branch, so don't be
       shy about rewriting the history of commits which	are not	on master yet.
       Rebasing	(not merging) your pull	request	on the latest version of  mas-
       ter is also welcome, especially if it resolves conflicts.

       If  you're  using  Git,	consider using jj <https://www.jj-vcs.dev/> to
       make this easier.

       If a commit should close	an issue, add a	Fixes #<issue-number> line  at
       the end of the commit description.

   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  com-
       mand  that  is publicly available.  This	means no private tools or per-
       sonal 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 sys-
	  tems

       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	 back-
	  portable.  If	something has a	real impact on the correctness or per-
	  formance,  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	either:

	  sphinx-build -j auto -b html doc_src/	/tmp/fish-doc/

       which will output HTML docs to /tmp/fish-doc.  You can  open  it	 in  a
       browser and see that it looks okay.

       Alternatively, you can use:

	  cmake	--build	build -t sphinx-docs

       which outputs to	build/user_doc/html/.

       The  builtins and various functions shipped with	fish are documented in
       doc_src/cmds/.

   Code	Style
       For formatting, we use:

        rustfmt for Rust

        fish_indent (shipped with fish) for fish script

        ruff format for Python

       To reformat files, there	is a script

	  build_tools/style.fish --all
	  build_tools/style.fish somefile.rs some.fish

   Fish	Script Style Guide
       1. All fish scripts, such as those in the share/functions and tests di-
	  rectories, 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 in-
       dent-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)))

   Minimum Supported Rust Version (MSRV) Policy
       We support at least the version of rustc	available in Debian Stable.

   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  in-
       troduced.  Even	if  you	 dont run the tests on your machine, they will
       still be	run via	GitHub Actions.

       You are strongly	encouraged to add tests	when changing the  functional-
       ity  of	fish,  especially if you are fixing a bug to help ensure there
       are no regressions in the future	(i.e., we dont reintroduce the bug).

       Unit tests live next to the implementation in Rust source files,	in in-
       line submodules (mod tests {}).

       System tests live in tests/:

        tests/checks are run by  littlecheck  <https://github.com/ridiculous-
	 fish/littlecheck>  and	 test noninteractive (script) behavior,	except
	 for tests/checks/tmux-* which test interactive	scenarios.

        tests/pexpects	  tests	  interactive	 scenarios    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.  If your littlecheck
       test has	a specific dependency, use # REQUIRE:  ...  with  a  POSIX  sh
       script.

       The pexpect tests are written in	Python and can simulate	input and out-
       put  to/from a terminal,	so they	are needed for anything	that needs ac-
       tual interactivity.  The	runner is in tests/pexpect_helper.py, in  case
       you need	to modify something there.

       These  tests  can  be  run  via the tests/test_driver.py	Python script,
       which will set up the environment.  It sets up a	 temporary  $HOME  and
       also  uses  it as the current directory,	so you do not need to create a
       temporary directory in them.

       If you need a command to	do something weird to  test  something,	 maybe
       add it to the fish_test_helper binary (in tests/fish_test_helper.c).

   Local testing
       The tests can be	run on your local system:

	  cargo	build
	  # Run	unit tests
	  cargo	test
	  # Run	system tests
	  tests/test_driver.py target/debug
	  # Run	a specific system test.
	  tests/test_driver.py target/debug tests/checks/abbr.fish

       Here,  the  first argument to test_driver.py refers to a	directory with
       fish, fish_indent and fish_key_reader in	it.  In	this example we're  in
       the  root  of the workspace and have run	cargo build without --release,
       so it's a debug build.

       To run all tests	and linters, use:

	  build_tools/check.sh

   Contributing	Translations
       Fish uses GNU gettext to	translate messages from	English	to other  lan-
       guages.	 We use	custom tools for extracting messages from source files
       and to localize at runtime.  This means that we do not have  a  runtime
       dependency  on  the  gettext library.  It also means that some features
       are not supported, such as message context and plurals.	We also	expect
       all files to be UTF-8-encoded.  In practice,  this  should  not	matter
       much for	contributing translations.

       Translation  sources  are  stored  in the localization/po directory and
       named ll_CC.po, where ll	is the two  (or	 possibly  three)  letter  ISO
       639-1 language code of the target language (e.g.	pt for Portuguese). CC
       is  an ISO 3166 country/territory code, (e.g. BR	for Brazil).  An exam-
       ple for a valid name  is	 pt_BR.po,  indicating	Brazilian  Portuguese.
       These are the files you will interact with when adding translations.

   Adding translations for a new language
       Creating	 new  translations  requires the Gettext tools.	 More specifi-
       cally, you will need msguniq and	msgmerge for creating translations for
       a new language.	To create a new	translation, run:

	  build_tools/update_translations.fish localization/po/ll_CC.po

       This will create	a new PO file containing all  messages	available  for
       translation.  If	the file already exists, it will be updated.

       After  modifying	 a  PO file, you can recompile fish, and it will inte-
       grate the modifications you made.  This requires	that the msgfmt	 util-
       ity  is installed (comes	as part	of gettext).  It is important that the
       localize-messages cargo feature is enabled, which  it  is  by  default.
       You can explicitly enable it using:

	  cargo	build --features=localize-messages

       Use environment variables to tell fish which language to	use, e.g.:

	  LANG=pt_BR.utf8 fish

       or within the running fish shell:

	  set LANG pt_BR.utf8

       For more	options	regarding how to choose	languages, see the correspond-
       ing  gettext  documentation  <https://www.gnu.org/software/gettext/man-
       ual/html_node/Locale-Environment-Variables.html>.  One neat  thing  you
       can  do is set a	list of	languages to check for translations in the or-
       der defined using the LANGUAGE variable,	e.g.:

	  set LANGUAGE pt_BR de_DE

       to try to translate messages to Portuguese, if that fails  try  German,
       and  if	that fails too you will	see the	English	version	defined	in the
       source code.

   Modifying existing translations
       If you want to work on translations for a language which	already	has  a
       corresponding  po  file,	 it  is	sufficient to edit this	file. No other
       changes are necessary.

       After recompiling fish, you should be able to see your translations  in
       action. See the previous	section	for details.

   Editing PO files
       Many  tools are available for editing translation files,	including com-
       mand-line and graphical user interface programs.	For  simple  use,  you
       can use your text editor.

       Open  up	the PO file, for example localization/po/sv.po,	and you'll see
       something like:

	  msgid	"%s: 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	"%s: No	suitable job\n"
	  msgstr "%s: Inget passande jobb\n"

       Any %s or %d are	placeholders that fish will use	for formatting at run-
       time. 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.	 msgid
       strings should never be updated manually, only by running the appropri-
       ate script.

   Modifications to strings in source files
       If a string changes in the sources, the old translations	will no	longer
       work.   They  will  be  preserved  in  the  PO files, but commented-out
       (starting with #~).  If you add/remove/change a translatable strings in
       a source	file, run  build_tools/update_translations.fish	 to  propagate
       this  to	 all  translation  files (localization/po/*.po).  This is only
       relevant	for developers modifying the source  files  of	fish  or  fish
       scripts.

   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 wget-
       text_fmt!  macros:

	  streams.out.append(wgettext_fmt!("%s:	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 fol-
       lowing 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.

   Updating Dependencies
       To  update  dependencies, run build_tools/update-dependencies.sh.  This
       currently requires  updatecli  <https://github.com/updatecli/updatecli>
       and a few other tools.

   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 re-
       cent release number (e.g., 2.6.0).

   License
   License for fish
       fish Copyright  2005-2009 Axel Liljencrantz, 2009- fish-shell contribu-
       tors. 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,  ver-
       sion 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 Pub-
       lic  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 ser-
       vice 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 dis-
       tribute 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 soft-
       ware.  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  pro-
       prietary.  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  modifi-
       cation 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", be-
	 low, refers to	any such program or work, and a	 "work	based  on  the
	 Program"  means either	the Program or any derivative work under copy-
	 right 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 lim-
	 itation  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 Pro-
	  gram 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 conspicu-
	  ously	and appropriately publish on each copy	an  appropriate	 copy-
	  right	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 distrib-
	  ute 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 stat-
	    ing	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. (Excep-
	    tion: 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	 iden-
	  tifiable sections of that work are not derived from the Program, and
	  can be reasonably considered independent and separate	works in them-
	  selves, then this License, and its terms, do not apply to those sec-
	  tions	when you distribute them as separate works.  But when you dis-
	  tribute  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  con-
	  test 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  Pro-
	  gram	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, un-
	  der 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 follow-
	  ing:

	   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	inter-
	    change; 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  ma-
	    chine-readable copy	of the corresponding source code, to  be  dis-
	    tributed  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 al-
	    lowed 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 con-
	  trol compilation and installation of the executable.	However, as  a
	  special exception, the source	code distributed need not include any-
	  thing	that is	normally distributed (in either	source or binary form)
	  with the major components (compiler, kernel, and so on) of the oper-
	  ating	system on which	the executable runs, unless that component it-
	  self accompanies the executable.

	  If distribution of executable	or object code is made by offering ac-
	  cess	to  copy from a	designated place, then offering	equivalent ac-
	  cess to copy the source code from the	same place counts as distribu-
	  tion 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  ex-
	  cept 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.  How-
	  ever,	 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 Pro-
	  gram), 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 re-
	  strictions 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 in-
	  fringement 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	conse-
	  quence 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  Pro-
	  gram.
	  If  any portion of this section is held invalid or unenforceable un-
	  der any particular circumstance, the balance of the section  is  in-
	  tended  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 in-
	  tegrity  of  the  free software distribution system, which is	imple-
	  mented 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 distrib-
	  ute 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  cer-
	  tain	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 incorpo-
	  rates	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  Pro-
	  gram	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 pub-
	  lished 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 pro-
	  grams	 whose distribution conditions are different, write to the au-
	  thor 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  WAR-
	   RANTY  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  LIM-
	   ITED	 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
	   A PARTICULAR	PURPOSE.  THE ENTIRE RISK AS TO	THE QUALITY  AND  PER-
	   FORMANCE  OF	THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DE-
	   FECTIVE, YOU	ASSUME THE COST	OF ALL NECESSARY SERVICING, REPAIR  OR
	   CORRECTION.

       12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRIT-
	   ING	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 CON-
	   SEQUENTIAL  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  deriva-
       tive  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 REPRESENTA-
       TION OR WARRANTY	OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR  PUR-
       POSE  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 DERIVA-
       TIVE 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 re-
       lationship of agency, partnership, or joint venture between PSF and Li-
       censee.	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	"Soft-
       ware"), 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 MER-
       CHANTABILITY, 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 SOFT-
       WARE 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	 soft-
       ware--to	make sure the software is free for all its users.

       This  license, the Library General Public License, applies to some spe-
       cially designated Free Software Foundation software, and	to  any	 other
       libraries  whose	authors	decide to use it.  You can use it for your li-
       braries,	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 ser-
       vice 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 dis-
       tribute 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  com-
       plete  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  permis-
       sion 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  cer-
       tain  designated	 libraries.   This license is quite different from the
       ordinary	one; be	sure to	read it	in full, and don't  assume  that  any-
       thing 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 li-
       brary, 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 ordi-
       nary 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, be-
       cause  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 li-
       braries 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 modifi-
       cation 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 to-
       gether 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 con-
       tains 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 ad-
       dressed as "you".

       A "library" means a collection of software functions and/or  data  pre-
       pared  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,  ei-
       ther 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  mak-
       ing modifications to it.	 For a library,	complete source	code means all
       the source code for all modules it contains, plus any associated	inter-
       face 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  run-
       ning  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  com-
       plete  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 no-
       tices 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 in-
	  voked, then you must make a good faith effort	to ensure that,	in the
	  event	an application does not	supply such function or	table, the fa-
	  cility still operates, and performs whatever part of its purpose re-
	  mains	meaningful.

	  (For example,	a function in a	library	to compute square roots	has  a
	  purpose  that	 is  entirely well-defined independent of the applica-
	  tion.	 Therefore, Subsection 2d requires that	 any  application-sup-
	  plied	 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 identifi-
       able 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 collec-
       tive 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	subse-
       quent copies and	derivative works made from that	copy.

       This option is useful when you wish to copy part	of the code of the Li-
       brary 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 dis-
       tributed	under the terms	of Sections 1 and 2 above on a medium  custom-
       arily 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 cre-
       ates an executable that is a derivative of the Library (because it con-
       tains portions of the Library), rather than a "work that	uses  the  li-
       brary".	 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 de-
       rivative	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	 unre-
       stricted, regardless of whether it is legally a derivative work.	 (Exe-
       cutables	 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 distrib-
       ute the object code for the work	under the terms	of Section 6.  Any ex-
       ecutables 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  con-
       taining	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 Li-
       brary 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 copy-
       right notice for	the Library among them,	as well	as a reference direct-
       ing 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-read-
	  able 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  Li-
	  brary	 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 necessar-
	  ily be able to recompile the application to use the modified defini-
	  tions.)

	  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 materi-
	  als or that you have already sent this user a	copy.

       For an executable, the required form of the "work  that	uses  the  Li-
       brary"  must include any	data and utility programs needed for reproduc-
       ing the executable from it.   However,  as  a  special  exception,  the
       source code distributed need not	include	anything that is normally dis-
       tributed	 (in  either  source or	binary form) with the major components
       (compiler, kernel, and so on) of	the operating system on	which the exe-
       cutable runs, unless that component itself accompanies the executable.

       It may happen that this requirement contradicts	the  license  restric-
       tions 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  Li-
       brary  side-by-side in a	single library together	with other library fa-
       cilities	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 Li-
       brary  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 pro-
       hibited by law if you do	not accept this	License.  Therefore, by	 modi-
       fying  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 orig-
       inal licensor to	copy, distribute, link with or modify the Library sub-
       ject to these terms and conditions.  You	may not	impose any further re-
       strictions 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 distrib-
       ute 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 circum-
       stances.

       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  in-
       tegrity	of  the	free software distribution system which	is implemented
       by public license practices.  Many people have made generous  contribu-
       tions  to the wide range	of software distributed	through	that system in
       reliance	on consistent application of that system; it is	up to the  au-
       thor/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 cer-
       tain  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 limita-
       tion as if written in the body of this License.

       13.  The	 Free  Software	Foundation may publish revised and/or new ver-
       sions 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	condi-
       tions 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 copy-
       righted	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 deriva-
       tives  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  WAR-
       RANTY  FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EX-
       CEPT 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 WRIT-
       ING WILL	ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY	AND/OR
       REDISTRIBUTE THE	LIBRARY	AS PERMITTED ABOVE, BE LIABLE TO YOU FOR  DAM-
       AGES,  INCLUDING	ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAM-
       AGES 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
       fish-shell developers

4.3				 Feb 27, 2026			   FISH-DOC(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=fish-doc&sektion=1&manpath=FreeBSD+Ports+15.0.quarterly>

home | help