github fish-shell/fish-shell 3.2.0
fish 3.2.0 (released March 1, 2021)

latest releases: 3.7.1, 3.7.0, 3.6.4...
3 years ago

Notable improvements and fixes

  • Undo and redo support for the command-line editor and pager search (#1367). By default, undo is bound to Control+Z, and redo to Alt+/.
  • Builtins can now output before all data is read. For example, string replace no longer has to read all of stdin before it can begin to output. This makes it usable also for pipes where the previous command hasn't finished yet, like:
# Show all dmesg lines related to "usb"
dmesg -w | string match '*usb*'
  • Prompts will now be truncated instead of replaced with "> " if they are wider than the terminal (#904). 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).
  • 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, #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, #7028). For example:
fish_add_path /opt/mycoolthing/bin

will add /opt/mycoolthing/bin to the beginning of $fish_user_path without creating duplicates, so it can be called safely from config.fish or interactively, and the path will just be there, once.

  • Better errors with "test" (#6030):
> 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, #7371, #7523), matching the design on fishshell.com.
  • fish --no-execute will no longer complain about unknown commands or non-matching wildcards, as these could be defined differently at runtime (especially for functions). This makes it usable as a static syntax checker (#977).
  • string match --regex now integrates named PCRE2 capture groups as fish variables, allowing variables to be set directly from string match (#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). Because operating systems limit the number of arguments to commands, larger values are unlikely to work anyway, and this helps to avoid hangs.
  • A new "fish for bash users" documentation page gives a quick overview of the scripting differences between bash and fish (#2382), and the completion tutorial has also been moved out into its own document (#6709).

Syntax changes and new commands

  • Range limits in index range expansions like $x[$start..$end] may be omitted: $start and $end default to 1 and -1 (the last item) respectively (#6574):
echo $var[1..]
echo $var[..-1]
echo $var[..]

All print the full list $var.

  • When globbing, a segment which is exactly ** may now match zero directories. For example **/foo may match foo in the current directory (#7222).

Scripting improvements

  • The type, _ (gettext), . (source) and : (no-op) functions
    are now implemented builtins for performance purposes (#7342, #7036, #6854).
  • set and backgrounded jobs no longer overwrite $pipestatus (#6820), improving its use in command substitutions (#6998).
  • Computed ("electric") variables such as status are now only global in scope, so set -Uq status returns false (#7032).
  • The output for set --show has been shortened, only mentioning the scopes in which a variable exists (#6944). In addition, it now shows if a variable is a path variable.
  • A new variable, fish_kill_signal, is set to the signal that terminated the last foreground job, or 0 if the job exited normally (#6824, #6822).
  • A new subcommand, string pad, allows extending strings to a given width (#7340, #7102).
  • string sub has a new --end option to specify the end index of
    a substring (#6765, #5974).
  • string split has a new --fields option to specify fields to
    output, similar to cut -f (#6770).
  • string trim now also trims vertical tabs by default (#6795).
  • string replace no longer prints an error if a capturing group wasn't matched, instead treating it as empty (#7343).
  • string subcommands now quit early when used with --quiet (#7495).
  • string repeat now handles multiple arguments, repeating each one (#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).
  • fish_indent now removes unnecessary quotes in simple cases (#6722)
    and gained a --check option to just check if a file is indented correctly (#7251).
  • fish_indent indents continuation lines that follow a line ending in a backslash, |, && or ||.
  • pushd only adds a directory to the stack if changing to it was successful (#6947).
  • A new fish_job_summary function is called whenever a background job stops or ends, or any job terminates from a signal (#6959, #2727, #4319).
    The default behaviour can now be customized by redefining it.
  • status gained new dirname and basename convenience subcommands to get just the directory to the running script or the name of it, to simplify common tasks such as running (dirname (status filename)) (#7076, #1818).
  • Broken pipelines are now handled more smoothly; in particular, bad redirection mid-pipeline results in the job continuing to run but with the broken file descriptor replaced with a closed file descriptor. This allows better error recovery and is more in line with other shells' behaviour (#7038).
  • jobs --quiet PID no longer prints "no suitable job" if the job for PID does not exist (eg because it has finished) (#6809, #6812).
  • jobs now shows continued child processes correctly (#6818)
  • disown should no longer create zombie processes when job control is off, such as in config.fish (#7183).
  • command, jobs and type builtins support --query as the long form of -q, matching other builtins.
    The long form --quiet is deprecated (#7276).
  • argparse no longer requires a short flag letter for long-only options (#7585)
    and only prints a backtrace with invalid options to argparse itself (#6703).
  • argparse now passes the validation variables (e.g. $_flag_value) as local-exported variables,
    avoiding the need for --no-scope-shadowing in validation functions.
  • complete takes the first argument as the name of the command if the --command/-c option is not used,
    so complete git is treated like complete --command git,
    and it can show the loaded completions for specific commands with complete COMMANDNAME (#7321).
  • set_color -b (without an argument) no longer prints an error message, matching other invalid invocations of this command (#7154).
  • exec no longer produces a syntax error when the command cannot be found (#6098).
  • set --erase and abbr --erase can now erase multiple things in one go, matching functions --erase (#7377).
  • abbr --erase no longer prints errors when used with no arguments or on an unset abbreviation (#7376, #7732).
  • test -t, for testing whether file descriptors are connected to a terminal, works for file descriptors 0, 1, and 2 (#4766).
    It can still return incorrect results in other cases (#1228).
  • Trying to execute scripts with Windows line endings (CRLF) produces a sensible error (#2783).
  • Trying to execute commands with arguments that exceed the operating system limit now produces a specific error (#6800).
  • An alias that delegates to a command with the same name no longer triggers an error about recursive completion (#7389).
  • math now has a --base option to output the result in hexadecimal or octal (#7496) and produces more specific error messages (#7508).
  • math learned bitwise functions bitand, bitor and bitxor, used like math "bitand(0xFE, 5)" (#7281).
  • math learned tau for those who don't like typing "2 * pi".
  • Failed redirections will now set $status (#7540).
  • fish sets exit status in a more consistent manner after errors, including invalid expansions like $foo[.
  • Using read --silent while fish is in private mode was adding these potentially-sensitive entries to the history; this has been fixed (#7230).
  • 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).
  • A new fish_status_to_signal function for transforming exit statuses to signal names has been added (#7597, #7595).
  • The fallback realpath builtin supports the -s/--no-symlinks option, like GNU realpath (#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).
  • fish now finds user configuration even if the HOME environment variable is not set (#7620).
  • fish no longer crashes when started from a Windows-style working directory (eg F:\\path) (#7636).
  • fish -c now reads the remaining arguments into $argv (#2314).
  • The pwd command supports the long options --logical and --physical, matching other implementations (#6787).
  • fish --profile now only starts profiling after fish is ready to execute commands (all configuration is completed). There is a new --profile-startup option that only profiles the startup and configuration process (#7648).
  • Builtins return a maximum exit status of 255, rather than potentially overflowing. In particular, this affects exit, return, functions --query, and set --query (#7698, #7702).
  • It is no longer an error to run builtin with closed stdin. For example count <&- now prints 0, instead of failing.
  • Blocks, functions, and builtins no longer permit redirecting to file descriptors other than 0 (standard input), 1 (standard output) and 2 (standard error). For example, echo hello >&5 is now an error. This prevents corruption of internal state (#3303).

Interactive improvements

  • fish will now always attempt to become process group leader in interactive mode (#7060). This helps avoid hangs in certain circumstances, and allows tmux's current directory introspection to work (#5699).
  • The interactive reader now allows ending a line in a logical operators (&& and ||) instead of complaining about a missing command. (This was already syntactically valid, but interactive sessions didn't know about it yet).
  • The prompt is reprinted after a background job exits (#1018).
  • fish no longer inserts a space after a completion ending in ., , or - is accepted, improving completions for tools that provide dynamic completions (#6928).
  • If a filename is invalid when first pressing Tab, but becomes valid, it will be completed properly on the next attempt (#6863).
  • help string match/replace/<subcommand> will show the help for string subcommands (#6786).
  • fish_key_reader sets the exit status to 0 when used with --help or --version (#6964).
  • fish_key_reader and fish_indent send output from --version to standard output, matching other fish binaries (#6964).
  • A new variable $status_generation is incremented only when the previous command produces an exit status (#6815). This can be used, for example, to check whether a failure status is a holdover due to a background job, or actually produced by the last run command.
  • fish_greeting is now a function that reads a variable of the same name, and defaults to setting it globally. This removes a universal variable by default and helps with updating the greeting. However, to disable the greeting it is now necessary to explicitly specify universal scope (set -U fish_greeting) or to disable it in config.fish (#7265).
  • Events are properly emitted after a job is cancelled (#2356).
  • fish_preexec and fish_postexec events are no longer triggered for empty commands (#4829, #7085).
  • Functions triggered by the fish_exit event are correctly run when the terminal is closed or the shell receives SIGHUP (#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).
  • A new fish_posterror event is emitted when attempting to execute a command with syntax errors (#6880, #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). 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):
fish --debug=-warning-path
  • The enabled debug categories are now printed on shell startup (#7007).
  • The -o short option to fish, for --debug-output, works correctly instead of producing an invalid option error (#7254).
  • fish's debugging can now also be enabled via FISH_DEBUG and FISH_DEBUG_OUTPUT environment variables. This helps with debugging when no commandline options can be passed, like when fish is called in a shebang (#7359).
  • Abbreviations are now expanded after all command terminators (eg ; or |), not just space, as in fish 2.7.1 and before (#6970), and after closing a command substitution (#6658).
  • The history file is now created with user-private permissions, matching other shells (#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, #6714) and no longer depends on locale (#6757).
  • The command-not-found handling has been simplified. When it can't find a command, fish now just executes a function called fish_command_not_found instead of firing an event, making it easier to replace and reason about. Previously-defined __fish_command_not_found_handler functions with an appropriate event listener will still work (#7293).
  • Control-C handling has been reimplemented in C++ and is therefore quicker (#5259), no longer occasionally prints an "unknown command" error (#7145) or overwrites multiline prompts (#3537).
  • Control-C no longer kills background jobs for which job control is
    disabled, matching POSIX semantics (#6828, #6861).
  • Autosuggestions work properly after Control-C cancels the current commmand line (#6937).
  • History search is now case-insensitive unless the search string contains an uppercase character (#7273).
  • fish_update_completions gained a new --keep option, which improves speed by skipping completions that already exist (#6775, #6796).
  • Aliases containing an embedded backslash appear properly in the output of alias (#6910).
  • open no longer hangs indefinitely on certain systems, as a bug in xdg-open has been worked around (#7215).
  • Long command lines no longer add a blank line after execution (#6826) and behave better with Backspace (#6951).
  • functions -t works like the long option --handlers-type, as documented, instead of producing an error (#6985).
  • History search now flashes when it found no more results (#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).
  • set_color --print-colors now also respects the bold, dim, underline, reverse, italic and background modifiers, to better show their effect (#7314).
  • The fish Web configuration tool (fish_config) shows prompts correctly on Termux for Android (#7298) and detects Windows Services for Linux 2 properly (#7027). It no longer shows the history variable as it may be too large (one can use the History tab instead). It also starts the browser in another thread, avoiding hangs in some circumstances, especially with Firefox's Developer Edition (#7158). Finally, a bug in the Source Code Pro font may cause browsers to hang, so this font is no longer chosen by default (#7714).
  • funcsave gained a new --directory option to specify the location of the saved function (#7041).
  • help works properly on MSYS2 (#7113) and only uses cmd.exe if running on WSL (#6797).
  • Resuming a piped job by its number, like fg %1, works correctly (#7406). Resumed jobs show the correct title in the terminal emulator (#7444).
  • Commands run from key bindings now use the same TTY modes as normal commands (#7483).
  • Autosuggestions from history are now case-sensitive (#3978).
  • $status from completion scripts is no longer passed outside the completion, which keeps the status display in the prompt as the last command's status (#7555).
  • Updated localisations for pt_BR (#7480).
  • fish_trace output now starts with -> (like fish --profile), making the depth more visible (#7538).
  • Resizing the terminal window no longer produces a corrupted prompt (#6532, #7404).
  • functions produces an error rather than crashing on certain invalid arguments (#7515).
  • A crash in completions with inline variable assignment (eg A= b) has been fixed (#7344).
  • fish_private_mode may now be changed dynamically using set (#7589), and history is kept in memory in private mode (but not stored permanently) (#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).
  • Importing bash history or reporting errors with recursive globs (\*\*) no longer hangs (#7407, #7497).
  • bind now shows \\x7f for the del key instead of a literal DEL character (#7631)
  • Paths containing variables or tilde expansion are only suggested when they are still valid (#7582).
  • Syntax highlighting can now color a command as invalid even if executed quickly (#5912).
  • Redirection targets are no longer highlighted as error if they contain variables which will likely be defined by the current commandline (#6654).
  • fish is now more resilient against broken terminal modes (#7133, #4873).
  • fish handles being in control of the TTY without owning its own process group better, avoiding some hangs in special configurations (#7388).
  • Keywords can now be colored differently by setting the fish_color_keyword variable (fish_color_command is used as a fallback) (#7678).
  • Just like fish_indent, the interactive reader will indent continuation lines that follow a line ending in a backslash, |, && or || (#7694).
  • Commands with a trailing escaped space are saved in history correctly (#7661).
  • fish_prompt no longer mangles Unicode characters in the private-use range U+F600-U+F700. (#7723).
  • The universal variable file, fish_variables, can be made a symbolic link without it being overwritten (#7466).
  • fish is now more resilient against mktemp failing (#7482).

New or improved bindings

  • As mentioned above, new special input functions undo (Control+_ or Control+Z) and redo (Alt-/) can be used to revert changes to the command line or the pager search field (#6570).
  • Control-Z is now available for binding (#7152).
  • Additionally, using the cancel special input function (bound to Escape by default) right after fish picked an unambiguous completion will undo that (#7433).
  • fish_clipboard_paste (Control+V) trims indentation from multiline commands, because fish already indents (#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, #6755, #6769, #7442, #7516).
  • Vi mode bindings support ~ (tilde) to toggle the case of the selected character (#6908).
  • Functions up-or-search and down-or-search (Up and Down) can cross empty lines, and don't activate search mode if the search fails, which makes them easier to use to move between lines in some situations.
  • If history search fails to find a match, the cursor is no longer moved. This is useful when accidentally starting a history search on a multi-line commandline.
  • The special input function beginning-of-history (Page Up) now moves to the oldest search instead of the youngest - that's end-of-history (Page Down).
  • A new special input function forward-single-char moves one character to the right, and if an autosuggestion is available, only take a single character from it (#7217, #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). This includes suppress-autosuggestion to reflect whether an autosuggestion was suppressed (#1419)
  • A new function __fish_preview_current_file, bound to Alt+O, opens the
    current file at the cursor in a pager (#6838, #6855).
  • edit_command_buffer (Alt-E and Alt-V) passes the cursor position
    to the external editor if the editor is recognized (#6138, #6954).
  • __fish_prepend_sudo (Alt-S) now toggles a sudo prefix (#7012) and avoids shifting the cursor (#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).
  • __fish_toggle_comment_commandline (Alt-#) now uncomments and presents the last comment from history if the commandline is empty (#7137).
  • __fish_whatis_current_token (Alt-W) prints descriptions for functions and builtins (#7191, #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, #7354, #4025, #7328, #7325)
  • fish's clipboard bindings now also support Windows Subsystem for Linux via PowerShell and clip.exe (#7455, #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).

Improved prompts

  • The default and example prompts print the correct exit status for commands prefixed with not (#6566).
  • git prompts include all untracked files in the repository, not just those in the current directory (#6086).
  • The git prompts correctly show stash states (#6876, #7136) and clean states (#7471).
  • The Mercurial prompt correctly shows untracked status (#6906), and by default only shows the branch for performance reasons.
    A new variable $fish_prompt_hg_show_informative_status can be set to enable more information.
  • The fish_vcs_prompt passes its arguments to the various VCS prompts that it calls (#7033).
  • The Subversion prompt was broken in a number of ways in 3.1.0 and has been restored (#6715, #7278).
  • A new helper function fish_is_root_user simplifies checking for superuser privilege (#7031, #7123).
  • New colorschemes - ayu Light, ayu Dark and ayu Mirage (#7596).
  • Bugs related to multiline prompts, including repainting (#5860) or navigating directory history (#3550) leading to graphical glitches have been fixed.
  • The nim prompt now handles vi mode better (#6802)

Improved terminal support

  • A new variable, fish_vi_force_cursor, can be set to force fish_vi_cursor to attempt changing the cursor
    shape in vi mode, regardless of terminal (#6968). The fish_vi_cursor option --force-iterm has been deprecated.
  • diff will now colourize output, if supported (#7308).
  • Autosuggestions appear when the cursor passes the right prompt (#6948) or wraps to the next line (#7213).
  • The cursor shape in Vi mode changes properly in Windows Terminal (#6999, #6478).
  • The spurious warning about terminal size in small terminals has been removed (#6980).
  • Dynamic titles are now enabled in Alacritty (#7073) and emacs' vterm (#7122).
  • Current working directory updates are enabled in foot (#7099) and WezTerm (#7649).
  • The width computation for certain emoji agrees better with terminals (especially flags). (#7237).
  • Long command lines are wrapped in all cases, instead of sometimes being put on a new line (#5118).
  • The pager is properly rendered with long command lines selected (#2557).
  • Sessions with right prompts can be resized correctly in terminals that handle reflow, like GNOME Terminal (and other VTE-based terminals), upcoming Konsole releases and Alacritty. This detection can be overridden with the new fish_handle_reflow variable (#7491).
  • fish now sets terminal modes sooner, which stops output from appearing before the greeting and prompt are ready (#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).

Completions

  • Added completions for
    • 7z, 7za and 7zr (#7220)
    • alias (#7035)
    • alternatives (#7616)
    • apk (#7108)
    • asciidoctor (#7000)
    • avifdec and avifenc (#7674)
    • bluetoothctl (#7438)
    • cjxl and djxl (#7673)
    • cmark (#7000)
    • create_ap (#7096)
    • deno (#7138)
    • dhclient (#6684)
    • Postgres-related commands dropdb, createdb, pg_restore, pg_dump and pg_dumpall (#6620)
    • dotnet (#7558)
    • downgrade (#6751)
    • gapplication, gdbus, gio and gresource (#7300)
    • gh (#7112)
    • gitk
    • groups (#6889)
    • hashcat (#7746)
    • hikari (#7083)
    • icdiff (#7503)
    • imv (#6675)
    • john (#7746)
    • julia (#7468)
    • k3d (#7202)
    • ldapsearch (#7578)
    • lightdm and dm-tool (#7624)
    • losetup (#7621)
    • micro (#7339)
    • mpc (#7169)
    • Metasploit's msfconsole, msfdb and msfvenom (#6930)
    • mtr (#7638)
    • mysql (#6819)
    • ncat, nc.openbsd, nc.traditional and nmap (#6873)
    • openssl (#6845)
    • prime-run (#7241)
    • ps2pdf{12,13,14,wr} (#6673)
    • pyenv (#6551)
    • rst2html, rst2html4, rst2html5, rst2latex, rst2man, rst2odt, rst2pseudoxml, rst2s5, rst2xetex, rst2xml and rstpep2html (#7019)
    • spago (#7381)
    • sphinx-apidoc, sphinx-autogen, sphinx-build and sphinx-quickstart (#7000)
    • strace (#6656)
    • systemd's bootctl, coredumpctl, hostnamectl (#7428), homectl (#7435), networkctl (#7668) and userdbctl (#7667)
    • tcpdump (#6690)
    • tig
    • traceroute and tracepath (#6803)
    • windscribe (#6788)
    • wireshark, tshark, and dumpcap
    • xbps-\* (#7239)
    • xxhsum, xxh32sum, xxh64sum and xxh128sum (#7103)
    • yadm (#7100)
    • zopfli and zopflipng (#6872)
  • Lots of improvements to completions, including:
    • git completions can complete the right and left parts of a commit range like from..to or left...right.
    • Completion scripts for custom Git subcommands like git-xyz are now loaded with Git completions. The completions can now be defined directly on the subcommand (using complete git-xyz), and completion for git xyz will work. (#7075, #7652, #4358)
    • make completions no longer second-guess make's file detection, fixing target completion in some cases (#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, #6879, #7187).
  • Significant performance improvements to completion of the available commands (#7153), especially on macOS Big Sur where there was a significant regression (#7365, #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, #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, #6825).
  • The CHANGELOG was moved to restructured text, allowing it to be included in the documentation (#7057).
  • fish handles ncurses installed in a non-standard prefix better (#6600, #7219), and uses variadic tparm on NetBSD curses (#6626).
  • The Web-based configuration tool no longer uses an obsolete Angular version (#7147).
  • The fish project has adopted the Contributor Covenant code of conduct (#7151).

Deprecations and removed features

  • The fish_color_match variable is no longer used. (Previously this controlled the color of matching quotes and parens when using read).
  • fish 3.2.0 will be the last release in which the redirection to standard error with the ^ character is enabled. The stderr-nocaret feature flag will be changed to "on" in future releases.
  • string is now a reserved word and cannot be used for function names (see above).
  • fish_vi_cursor's option --force-iterm has been deprecated (see above).
  • command, jobs and type long-form option --quiet is deprecated in favor of --query (see above).
  • The fish_command_not_found event is no longer emitted, instead there is a function of that name. By default it will call a previously-defined __fish_command_not_found_handler. To emit the event manually use emit fish_command_not_found.
  • The fish_prompt event no longer fires when read is used. If you need a function to run any time read is invoked by a script, use the new fish_read event instead (#7039).
  • To disable the greeting message permanently it is no longer enough to just run set fish_greeting interactively as it is no longer implicitly a universal variable. Use set -U fish_greeting or disable it in config.fish with set -g fish_greeting.
  • The long-deprecated and non-functional -m/--read-mode options to read were removed in 3.1b1. Using the short form, or a never-implemented -B option, no longer crashes fish (#7659).
  • With the addition of new categories for debug options, the old numbered debugging levels have been removed.

For distributors and developers

  • fish source tarballs are now distributed using the XZ compression
    method (#5460).
  • 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, #6792).
  • Building on on macOS earlier than 10.13.6 succeeds, instead of failing on code-signing (#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).
  • A new CMake variable FISH_USE_SYSTEM_PCRE2 controls whether fish builds with the system-installed PCRE2, or the version it bundles. By default it prefers the system library if available, unless Mac codesigning is enabled (#6952).
  • Running the full interactive test suite now requires Python 3.5+ and the pexpect package (#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).
  • The Web-based configuration tool is compatible with Python 3.10 (#7600) and no longer requires Python's distutils package (#7514).
  • fish 3.2 is the last release to support Red Hat Enterprise Linux & CentOS version 6.

--

Download links: To download the source code for fish, we suggest the file named "fish-3.2.0.tar.xz". The file downloaded from "Source code (tar.gz)" will not build correctly. The SHA-256 sum of this file is 4f0293ed9f6a6b77e47d41efabe62f3319e86efc8bf83cc58733044fbc6f9211. A GPG signature from David Adam (key ID 0x7A67D962D88A709A) is available as "fish-3.2.0.tar.xz.asc".

Don't miss a new fish-shell release

NewReleases is sending notifications on new releases.