FISH-RELEASENOTES(1)
🐟💖 FISH-RELEASENOTES(1) 💖🐟
okay so bestie, this is the release-notes page for fish-shell — that's the manual name, FISH-RELEASENOTES(1), and it's literally the entire receipts file of every fish drop, newest first. Every fix, every flag, every "we broke it in 4.3.2 and we're so sorry" is in here. no cap, it's a lot, so hydrate first 🥤
🎀 FISH 4.9.3 (RELEASED SEPTEMBER 08, 2026)
another macOS moment, bestie 😭 this one fixes a thing where dead keys were acting up — like, for example, the two-key sequence ",space on the US International keyboard layout would incorrectly insert space (#12979 <https://github.com/fish-shell/fish-shell/issues/12979>).
🦋 FISH 4.9.2 (RELEASED SEPTEMBER 05, 2026)
this one just corrects the fix for macOS terminals from 4.9.1 (#12973 <https://github.com/fish-shell/fish-shell/issues/12973>)
🌸 FISH 4.9.1 (RELEASED SEPTEMBER 04, 2026)
so fish 4.9.0 had some problems and this release fixes the following ones, periodt:
- On non-default keyboard layouts, fish executed bindings for physical keys instead of only bindings for the layout's key. like, for example, on the Dvorak layout, typing
swould insert;because there is a default binding for;(#12968 <https://github.com/fish-shell/fish-shell/issues/12968>). embarrassing but we fixed it 💅 - When typing space to accept a character entered via certain IMEs, fish would insert a space instead of the desired character, which has been fixed (#12974 <https://github.com/fish-shell/fish-shell/issues/12974>).
- On macOS terminals, keys like
option-lwould execute bindings foralt-linstead of the historical behavior of inserting a character (like@on a German layout) (#12973 <https://github.com/fish-shell/fish-shell/issues/12973>).
✨ FISH 4.9.0 (RELEASED SEPTEMBER 03, 2026) ✨
🔥 Interactive improvements 🔥
- To mitigate issues in Konsole version
v26.07.80's implementation of the kitty keyboard protocol, fish no longer requests that protocol on Konsole. theomit-term-workaroundsfeature flag <#featureflags> can be turned on to enable the kitty keyboard protocol on Konsole again (#12948 <https://github.com/fish-shell/fish-shell/issues/12948>). - On some terminals like kitty, keys like
shift-spaceandspacecan now be mapped independently (#12898 <https://github.com/fish-shell/fish-shell/issues/12898>). finally 🙌 - Fixed slow tab completion in directories that contain slow-to-resolve symlinks (e.g. links to network-mounted files) (<#12895> no wait — #12905 <https://github.com/fish-shell/fish-shell/issues/12905>).
- Abbreviations can now be given a description, which will be displayed in the completion pager (#11291 <https://github.com/fish-shell/fish-shell/issues/11291>). obsessed.
- Vi mode commands like
cFandcTnow work correctly (#12947 <https://github.com/fish-shell/fish-shell/issues/12947>).
🧚 Scripting improvements 🧚
- List indexing can now be nested in more cases; for example
$foo[$bar[1] 2]is now allowed (#12903 <https://github.com/fish-shell/fish-shell/issues/12903>). - Escaped square brackets (e.g.
\133for[) are no longer considered a slicing operator (#7969 <https://github.com/fish-shell/fish-shell/issues/7969>). - Variables containing a closing square brackets and used to index into another variable will no longer close the slice early (#12819 <https://github.com/fish-shell/fish-shell/issues/12819>).
- Builtin help pages now respect an override of the
manfunction (#12886 <https://github.com/fish-shell/fish-shell/issues/12886>). - Commands like
status=123 echo $statusnow throw an error instead of silently ignore the variable override (#7790 <https://github.com/fish-shell/fish-shell/issues/7790>). no more sneaky silence, we love accountability 💜
💀 Regression fixes: 💀
- (From 4.6.0) Chinese and Japanese translation of error messages owned by the C library were broken (#12895 <https://github.com/fish-shell/fish-shell/issues/12895>).
- (From 4.3.2) Erasing read-only variables with
set --erasewas accidentally allowed. - (From 4.0.0) Builtin
fgwas not working on NetBSD (#12929 <https://github.com/fish-shell/fish-shell/issues/12929>).
🌈 FISH 4.8.1 (RELEASED JULY 14, 2026) 🌈
🔥 Interactive improvements 🔥
- On non-macOS platforms,
alt-backspace,alt-delete,alt-leftandalt-rightoperate on words again instead of tokens (#12122 <https://github.com/fish-shell/fish-shell/issues/12122>) — eliminating cross-platform differences in input handling. consistency is the vibe ✨ - Builtin and function commands can now be colored separately via new variables
fish_color_builtin<#envvar-fish_color_builtin> andfish_color_function<#envvar-fish_color_function> (#12837 <https://github.com/fish-shell/fish-shell/issues/12837>). custom colors? we ate. - Add
fish_darcs_prompt<> for Darcs <https://darcs.net/> repository status. - Fixed a crash in
commandline --current-processwhen the cursor is inside a&|pipe (#12868 <https://github.com/fish-shell/fish-shell/issues/12868>). - Since prompt marking (via OSC 133 <#term-compat-osc-133>) causes an issue in Konsole's <https://apps.kde.org/konsole/> default configuration, prompt marking had been disabled for Konsole in 4.8.0. Now the
omit-term-workaroundsfeature flag <#featureflags> can be enabled to enable prompt marking on Konsole again (#12859 <https://github.com/fish-shell/fish-shell/issues/12859>).
💀 Regression fixes: 💀
- (From 4.8.0)
abbr --position=anywherecompletions are no longer offered in argument position, to avoid cluttering the completion pager (#12838 <https://github.com/fish-shell/fish-shell/issues/12838>). - (From 4.8.0)
pacman -Qshort option completions (#12857 <https://github.com/fish-shell/fish-shell/issues/12857>).
👑 FISH 4.8.0 (RELEASED JUNE 24, 2026) 👑
⭐ Notable improvements and fixes ⭐
- Translatable messages defined in Rust source code can and should now be translated using Fluent <https://projectfluent.org/> instead of GNU gettext. for now, GNU gettext continues to be used for translating messages defined in fish scripts. to make Fluent easy to work with, we have added tooling based on the new fluent-ftl-tools <https://codeberg.org/danielrainer/fluent-ftl-tools> library. see Contributing Translations <#localization> (#11928 <https://github.com/fish-shell/fish-shell/issues/11928>). iykyk 🫶
🚫 Deprecations and removed features 🚫
- Builtin
complete's <>--commandand--pathoptions no longer unescape their argument.
🔥 Interactive improvements 🔥
- History search would sometimes forget about commands after those were re-run in concurrent sessions. this has been fixed (#10300 <https://github.com/fish-shell/fish-shell/issues/10300>).
fish_hg_prompt,fish_git_promptandfish_fossil_promptnow strip control characters from VCS state read off disk, matchingprompt_pwd.- Abbreviations with
--position=anywherecan now be completed in argument position, not just in command position (#12630 <https://github.com/fish-shell/fish-shell/issues/12630>). - Path component movement (
ctrl-w) skips escaped characters. - Completion of short option groups will now handle
--conditioncorrectly (#12821 <https://github.com/fish-shell/fish-shell/issues/12821>). - Fixed an issue where
ctrl-cmight fail to cancel certain functions (#12802 <https://github.com/fish-shell/fish-shell/issues/12802>). the panic button has to WORK, bestie 😤 - On the first run after upgrading from an older version, fish will try harder to check if the current theme matches a historical default. if it does match, fish won't create
~/.config/fish/conf.d/fish_frozen_theme.fishwhen upgrading from fish < 4.3. in particular, on systems where fish version 3.x was installed originally, fish will now avoid creating that file on upgrade (#12725 <https://github.com/fish-shell/fish-shell/issues/12725>).
🧚 Scripting improvements 🧚
cdsupports the-Land-Poptions, like other shells, to allow specifying whether symbolic links (symlinks) are resolved when changing directories (#7206 <https://github.com/fish-shell/fish-shell/issues/7206>).cdwith a relative path will now retry using the real current directory, if$PWDhas been moved (#12700 <https://github.com/fish-shell/fish-shell/issues/12700>).- Nested brace expansions now strip unquoted leading and trailing spaces from entries consistently (#12794 <https://github.com/fish-shell/fish-shell/issues/12794>).
bind<> shows the files where bindings were defined (#12504 <https://github.com/fish-shell/fish-shell/issues/12504>).
🍓 Other improvements 🍓
- fish no longer creates the
__fish_initializeduniversal variable on startup. if you don't expect to need to downgrade to earlier versions, you can remove it withset --erase __fish_initialized. this means that fish now only creates universal variables if instructed by the user. main character energy: no unsolicited variables 💅
🧑💻 For distributors and developers 🧑💻
- With the exception of the
$CMAKE_INSTALL_PREFIX/share/fish/mandirectory, fish no longer installs files to$CMAKE_INSTALL_PREFIX/share/fish. in particular, this means that both$CMAKE_INSTALL_PREFIX/share/fish/completionsand$CMAKE_INSTALL_PREFIX/share/fish/functionsshould no longer exist. these directories have been ignored since fish 4.2. if another package installs fish scripts there, they should be corrected to install toextra_completionsdir(typically$CMAKE_INSTALL_PREFIX/share/fish/vendor_completions.d),extra_functionsdir(typically$CMAKE_INSTALL_PREFIX/share/fish/vendor_functions.d) orextra_confdir(typically$CMAKE_INSTALL_PREFIX/share/fish/vendor_functions.d) instead. see also the output of:
for var in completions functions conf; pkgconf fish --variable="$var"dir; end.
💀 Regression fixes: 💀
- (from 4.4.0) Vi mode
c,Wkey binding wrongly deleted trailing spaces (#12790 <https://github.com/fish-shell/fish-shell/issues/12790>). - (from 4.4.0) Vi mode
xin builtinread<> (#12724 <https://github.com/fish-shell/fish-shell/issues/12724>). - (from 4.3.3) Repeated tab would sometimes insert smartcase completions redundantly.
- (from 4.3.0) Pressing escape during command execution could insert garbage text into the command line (#12379 <https://github.com/fish-shell/fish-shell/issues/12379>).
🫶 FISH 4.7.1 (RELEASED MAY 08, 2026) 🫶
this release fixes a regression in 4.7.0 that caused the web config (fish_config) to fail to start (#12717 <https://github.com/fish-shell/fish-shell/issues/12717>). the vibes are restored 💖
🦋 FISH 4.7.0 (RELEASED MAY 05, 2026)
💅 Deprecations and removed features
- The default theme — like, all the
fish_color_*variables — is no longer set in non-interactive shells. Bestie. It's gone. Non-interactive only, okay? Don't panic if your prompt still slays.
✨ Interactive improvements
prompt_pwdnow strips control characters. Clean. Fresh. Iconic.- Repaint events (the ones triggered by changes to color variables, or by event handlers running
commandline -f repaint) no longer reset the completion pager and other transient UI states (#12683). The pager finally keeps its main character energy. 👑 fish_color_valid_pathnow respects background and underline colors (#12622). Yes queen, layer those styles.funcedwill no longer lose your work if there are parse errors multiple times without new changes to the file. Your six-paragraph function is safe, bestie 😭- Fixed a case where directory completions were sorted in a genuinely surprising order (
#12695). Weird order = fixed. Slay. - When you're at the command token, the alt-o binding will now open read-only files too (
#12671). Read-only files, your time has come. - Private mode in-memory history (
set fish_history) is no longer shared with the builtinread(#12662). Secrets stay secret, periodt. 🙈
🫶 Other improvements
- History is no longer corrupted with NUL bytes when fish receives
SIGTERMorSIGHUP(#10300). Bye bye weird little ghost bytes 💀 fish_update_completionsnow handles groff\X'...'device control escapes, which fixes completion generation for man pages produced byhelp2man1.50 and later (such ascoreutils9.10). Niche? Yes. Gorgeous? Also yes.- Removing history entries via the web-based config is more intuitive now. Genuinely less of a scavenger hunt.
- If
XDG_DATA_DIRSis empty, the default value is assumed — which means fish will now also use configuration from paths like$PREFIX/share/fish/vendor_completions.d(#11349). Free completions, no cap. - Some internal file descriptors were moved to number 10 or higher, so there's less risk of them clashing with the ones you use in your own scripts. Personal space: respected ✨
- The wording of error messages has been made consistent, especially for builtin subcommands (
#12556). One voice, one vibe.
🧚 For distributors and developers
- When the default global config directory (
$PREFIX/etc/fish) exists but has been overridden via-DCMAKE_INSTALL_SYSCONFDIR, fish will now respect that override (#10748). Respect the override, always. build_tools/update_translations.fishhas been replaced bycargo xtask gettext {check,new,update}(#12676). Out with the old script, in with the cargo.- New:
cargo xtask shellcheckto lint shell-scripts. Lint your scripts, bestie, your future self will thank you.
😭 Regression fixes:
- (from 4.6) Vi mode
dl(#12461). - (from 4.6) Backspace after newline (
#12583). - (from 4.3.3) Long options were spuriously completed after typing short options (
85e76ba3561). - (from 3.2)
nosuchcommand || echo helloexecutes the right hand side again (#12654). The right hand side said "not me being skipped" and honestly, fair.
🌈 FISH 4.6.0 (RELEASED MARCH 28, 2026)
👑 Notable improvements and fixes
- New Spanish translations (
#12489). ¡Vamos! 🎉 - New Japanese translations (
#12499). やった!🎉
💅 Deprecations and removed features
- The default width for emoji is switched from 1 to 2, which improves life for people connecting to old systems from modern desktops. If you're on an old desktop and notice lines containing emoji are misaligned, you can set
$fish_emoji_widthback to1(#12562). The emoji got wider. That's the whole thing. 💖
✨ Interactive improvements
- The tab completion pager now left-justifies the description of each column (
#12546). Alignment? Immaculate. - fish now supports the
SHELL_PROMPT_PREFIX,SHELL_PROMPT_SUFFIX, andSHELL_WELCOMEenvironment variables. The prefix and suffix are automatically prepended and appended to the left prompt, and the welcome message is displayed on startup after the greeting. These variables are set by systemd'srun0for example (#10924). Systemd said "let me customize your prompt" and fish said "bet".
🔥 Improved terminal support
set_coloris able to turn off italics, reverse mode, strikethrough and underline individually (e.g.--italics=off). Granular control, we love to see it.set_colorlearned the foreground (--foregroundor-f) and reset (--reset) options. New options just dropped.- An error caused by slow terminal responses at macOS startup has been addressed (
#12571). macOS startup said "sorry for the delay" and fish said "not anymore".
🫶 Other improvements
- Signals like
SIGWINCH(as sent on terminal resize) no longer interrupt builtin output (#12496). Resize your window in peace. - For compatibility with Bash, fish now accepts
|&as an alternate spelling of&|, for piping both standard output and standard error (#11516). Two spellings, same slay. fish_indentnow preserves comments and newlines immediately preceding a brace block ({ }) (#12505). Your comments survived. Victory.- A crash when suspending certain pipelines with Ctrl+Z has been fixed (
#12301).
🧚 For distributors and developers
cargo xtasksubcommands no longer panic on test failures. They're handling their emotions now.
😭 Regression fixes:
- (from 4.5.0) Intermediate
⏎artifact when redrawing prompt (#12476). - (from 4.4.0)
historyhonors explicitly specified--color=again (#12512). - (from 4.4.0) Vi mode
dlanddh(#12461). - (from 4.3.0) Error completing of commands starting with
-(#12522).
🌸 FISH 4.5.0 (RELEASED FEBRUARY 17, 2026)
This is mostly a patch release for Vi mode regressions in 4.4.0, but other minor behavior changes are included as well. Lowkey a glow-up patch. 💅
✨ Interactive improvements
- Ctrl+L no longer cancels history search (
#12436). Clear the screen, keep the search. - History search cursor positioning now works correctly with characters of arbitrary width. Wide characters deserved better and now they have it.
💅 Deprecations and removed features
- fish no longer reads the terminfo database to alter behaviour based on the
TERMenvironment variable, and does not depend on ncurses or terminfo. Theignore-terminfofeature flag, introduced and enabled by default in fish 4.1, is now permanently enabled. fish may no longer work correctly on Data General Dasher D220 and Wyse WY-350 terminals, but should continue to work on all known terminal emulators released in the 21st century. If your terminal predates the 21st century, bestie, I'm so sorry 🫶 terminfo is gone-gone.
😭 Regression fixes:
- (from 4.4.0) Vi mode
d,fkey binding did not work (#12417). - (from 4.4.0) Vi mode
c,wkey binding wrongly deleted trailing spaces (#12443). - (from 4.4.0) Vi mode crash on
c,i,wafter accepting autosuggestion (#12430). - (from 4.4.0)
fish_vi_key_bindingscalled with a mode argument produced an error (#12413). - (from 4.0.0) Build on Illumos (
#12410).
🦋 FISH 4.4.0 (RELEASED FEBRUARY 03, 2026)
💅 Deprecations and removed features
- The default
fossilprompt has been disabled (#12342). It's not you, fossil prompt, it's the vibes.
✨ Interactive improvements
- The
bindbuiltin lists mappings from all modes if--modeis not provided (#12214). No more "where are my other bindings" moments. - Line-wise autosuggestions that don't start a command are no longer shown (
739b82c34db,58e7a50de8a). If it's not a command, it's not invited. - Builtin
historynow assumes thatPAGERsupports ANSI color sequences. Color is the default assumption now, periodt. - fish now clears the terminal's
FLUSHOflag when acquiring control of the terminal, which fixes an issue caused by pressing Ctrl+O on macOS (#12304). macOS found a bug, fish handled it 💅
👑 New or improved bindings
- Vi mode word movements (
w,W,e, andE) are now largely in line with Vim. The only exception is that underscores are treated as word separators (#12269). Mostly Vim, slightly fish. Iykyk. - New special input functions to support these movements:
forward-word-vi,kill-word-vi,forward-bigword-vi,kill-bigword-vi,forward-word-end,backward-word-end,forward-bigword-end,backward-bigword-end,kill-a-word,kill-inner-word,kill-a-bigword, andkill-inner-bigword. That's twelve functions and every one of them ate. 🔥 - Vi mode key bindings now support counts for movement and deletion commands (e.g.
d3wor3l), via a new operator mode (#2192). Counts! In my Vi mode! Finally. - New
catppuccin-*color themes. The themes are here and they are gorgeous 🎀
🔥 Improved terminal support
set_colorlearned the strikethrough (--strikethroughor-s) modifier. Strike through your text with style.
🧚 For distributors and developers
- The CMake option
WITH_GETTEXThas been renamed toWITH_MESSAGE_LOCALIZATION, to reflect that it toggles localization independently of the backend used in the implementation. New name, same job, clearer energy. - New
cargo xtaskcommands can replace some CMake workflows.
😭 Regression fixes:
- (from 4.1.0) Crash when autosuggesting Unicode characters with nontrivial lowercase mapping (
#12326,78f4541116e). - (from 4.3.0) Glitch on
read --prompt-str ""(#12296). An empty prompt should just be empty, bestie. Empty. Not glitchy.
💅 FISH 4.3.3 (RELEASED JANUARY 07, 2026) 💅
Okay so this one is a little cleanup arc bestie — it patches up the following problems that were identified in fish 4.3.0:
- So rude: selecting a completion could insert only part of the token (
#12249). Fixed ✨ - A glitch moment with soft-wrapped autosuggestions and
fish_right_prompt(#12255) — fixed. - Spurious echo in
tmuxwhen you're typing a command really fast (#12261) — fixed, you can be fast again. - The
tomorrowtheme was always using the light variant (#12266) — fixed 🌞 fish_config theme choosesometimes wasn't shadowing themes set by e.g. webconfig (#12278) — fixed.- The sample prompts and themes are correctly installed now (
#12241) 🎀 - Last line of command output could be hidden when missing a newline (
#12246) — fixed, no more sneaky disappearing lines.
Other improvements include:
- The
abbr,bind,complete,functions,historyandtypecommands now support a--coloroption to control syntax highlighting in their output. Valid values areauto(default),always, ornever. Slay, options for days. - Existing file paths in redirection targets such as
> file.txtare now highlighted usingfish_color_valid_path, which is basically fish tapping you on the shoulder like "bestie that file is gonna get clobbered" (#12260). Iconic behavior honestly.
🌸 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 fileerror (#12224). Rough. Fixed. extra_functionsdir(usuallyvendor_functions.d) and friends were not being used (#12226) — now they are, as intended.- The sample config file
~/.config/fish/config.fish/and config directories~/.config/fish/conf.d/,~/.config/fish/completions/and~/.config/fish/functions/were being recreated on every startup instead of only the first time fish runs on a system (#12230). Fixed — one and done now. - Spurious echo of
^[[Iin some scenarios (#12232) — fixed, thank goodness. - Infinite prompt redraw loop on some prompts (
#12233) — fixed, the loop has been cancelled 🔁💀 - So the removal of pre-built HTML docs from tarballs revealed that cross compilation is broken, because we use
${CMAKE_BINARY_DIR}/fish_indentfor building HTML docs. As a workaround, the new CMake build optionFISH_INDENT_FOR_BUILDING_DOCScan be set to the path of a runnablefish_indentbinary. Very "it's giving workaround" of us but it works.
🦋 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). Yikes! Fixed, no cap.
👑 FISH 4.3.0 (RELEASED DECEMBER 28, 2025) 👑
🎀 Deprecations and removed features 🎀
- fish no longer sets user-facing universal variables by default, which makes the configuration easier to understand. Specifically, the
fish_color_*,fish_pager_color_*andfish_key_bindingsvariables 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.fishand~/.config/fish/conf.d/fish_frozen_key_bindings.fishfiles. We suggest that you delete those files and set your theme in~/.config/fish/config.fish. The way that's the cleaner setup… obsessed.- You can still configure fish to propagate theme changes instantly; there's an example in the docs (see syntax-highlighting-instant-update).
- You can still opt into storing color variables in the universal scope via
fish_config theme save— though unlikefish_config theme choose, it does not support dynamic theme switching based on the terminal's color theme (more on that below).
- In addition to setting the variables which are explicitly defined in the given theme,
fish_config theme choosenow clears only color variables that were set by earlier invocations of afish_config theme choosecommand (which is how fish's default theme is set).
⭐ Scripting improvements ⭐
- New
status languagecommand lets you show and modify language settings for fish messages without having to modify environment variables. iykyk, that's so much nicer. - When using a noninteractive fish instance to compute completions,
commandline --cursorworks as expected instead of throwing an error (#11993) 🫶 fish_tracecan now be set toallto also trace execution of key bindings, event handlers as well as prompt and title functions.
🌈 Interactive improvements 🌈
- When typing immediately after starting fish, the first prompt is now rendered correctly. No more "why is my prompt weird for 0.2 seconds" era.
- Completion accuracy was improved for file paths containing
=or:(#5363) 🔥 - Prefix-matching completions are now shown even if they don't match the case typed by the user (
#7944). - On Cygwin/MSYS, command name completion will favor the non-
exename (foo) unless the user started typing the extension. - When using the
exename (foo.exe), fish will use the description and completions forfooif there are none forfoo.exe. - Autosuggestions now also show soft-wrapped portions (
#12045) — no more mysterious missing ghost text 💀
💜 New or improved bindings 💜
- Ctrl+W (
backward-kill-path-component) also deletes escaped spaces now (#2016). - New special input functions
backward-path-component,forward-path-componentandkill-path-component(#12127). Path navigation is having a moment.
🧚 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 terminal's background color switches between light and dark colors (#11580). It's giving adaptive 💅 - 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). - OSC 133 prompt markers now also mark the prompt end, which improves shell integration with terminals like iTerm2 (
#11837). - Operating-system-specific key bindings are now decided based on the terminal's host OS (
status terminal-os). - New feature flag
omit-term-workaroundscan 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 accidentally losing docs, the
BUILD_DOCSandINSTALL_DOCSconfiguration options have been replaced with a newWITH_DOCSoption. fish_key_readerandfish_indentare now installed as hardlinks tofish, to save some space. Frugal queen behavior 💖
🙈 Regression fixes: 🙈
- (from 4.1.0) Crash on incorrectly-set color variables (
#12078). - (from 4.1.0) Crash when autosuggesting Unicode characters with nontrivial 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). - (from 4.2.0) Completions for Git remote names on some non-glibc systems.
- (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=OFFor whensphinx-buildis not found), builtin man pages and help files were missing, which has been fixed (#12052). Your docs are safe 🫶 fish_config's theme selector (the "colors" tab) was broken, which has been fixed (#12053). The colors tab is back and it's thriving 🌈
🌸 FISH 4.2.0 (RELEASED NOVEMBER 10, 2025) 🌸
✨ Notable improvements and fixes ✨
- History-based autosuggestions now include multi-line commands. Bestie, your messy three-line pipelines are finally getting remembered properly 💖
- A transient prompt containing more lines than the final prompt will now be cleared properly (
#11875). No more ghost lines haunting your scrollback ✨ - Taiwanese Chinese translations have been added 🎀
- French translations have been supplemented (
#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. So like, file paths using legacy encodings can still be used, but may be rendered differently on the command line. Not broken, just dressed different 💅
- On systems where no multi-byte locale is available, fish will no longer fall back to using ASCII replacements for Unicode characters such as "…". It's giving "no more fake
...pretending to be…" 🙈
🦋 Interactive improvements 🦋
- The title of the terminal tab can now be set separately from the window title by defining the
fish_tab_titlefunction (#2692). Two titles, two vibes, zero conflict 👑 - 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 after repainting with a partially visible prompt (
#11911). Main character prompt energy, no doppelgängers 🌈 fish_config prompt'schooseandsavesubcommands have been taught to resetfish_mode_promptin addition to the other prompt functions (#11937). It learned a new trick, we're obsessed ✨- fish no longer force-disables mouse capture (DECSET/DECRST 1000), so you can use those commands to let mouse clicks move the cursor or select completion items (
#4918). Mouse girlies, this one's for you 🫶 - The
alt-pbinding no longer adds a redundant space to the command line. Tiny fix, huge relief 😭 - When run as a login shell on macOS, fish now sets
MANPATHcorrectly when that variable was already present in the environment (#10684) 🍓 - A Windows-specific case of the web-based config failing to launch has been fixed (
#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) 🧚
🔥 For distributors and developers 🔥
- Release tags and source code tarballs are GPG-signed again (
#11996). Signatures are back, we love a security glow-up 💅 - Documentation in release tarballs is now built with the latest version of Sphinx, which means that pre-built man pages include OSC 8 hyperlinks ✨ (clickable links in your terminal, iykyk)
- The Sphinx dependency is now specified in
pyproject.toml, which allows you to use 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/fishwill not be used anymore, except for HTML docs. As a result, future upgrades will no longer break running shells if one of fish's internal helper functions 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). To reverse this change (which should not be necessary), patch out theembed-datafeature fromcmake/Rust.cmake. This option will be removed in future.
Ok so, that reversal thing? "should not be necessary" is doing a lot of heavy lifting there. Consider it a last resort, bestie 🙈
- 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). - (from 4.1.0) Correct wrong terminal modes set by
fish -c 'read; cat(#12024). - (from 4.1.0) On VTE-based terminals, stop redrawing the prompt on resize again, to avoid glitches.
- (from 4.1.0) On MSYS2, fix saving/loading of universal variables (
#11948). - (from 4.1.0) Fix error using
manfor the commands!.:[{(#11955). - (from 4.1.0) Fix build issues on illumos systems (
#11982). - (from 4.1.0) Fix crash on invalid
functioncommand (#11912). - (from 4.0.0) Fix build on SPARC and MIPS Linux by disabling
SIGSTKFLT. - (from 4.0.0) Fix crash when passing negative PIDs to builtin
wait(#11929). - (from 4.0.0) On Linux, fix
status fish-pathoutput 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). - Fixed the
alt-lbinding not formattinglsoutput correctly (one entry per line, no colors) (#11888). - Fixed an issue where focus events (currently only enabled in tmux) would cause multiline prompts to be redrawn in the wrong line (
#11870). - Stopped printing output that would cause a glitch on old versions of Midnight Commander (
#11869). - Added a fix for some configurations of Zellij where escape key processing was delayed (
#11868). - Fixed a case where the web-based configuration tool would generate invalid configuration (
#11861). - Fixed a case where pasting into
fish -c readwould fail with a noisy error (#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.
Just restart fish, bestie. It's the "have you tried turning it off and on again" of shells 💀
🦋 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 helpful; they have been fixed or removed (
#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 English messages inside fish. This will not affect fish's child processes unless LC_MESSAGES was already exported.
- Some
fish_configsubcommands for showing prompts and themes had been broken in standalone Linux builds (those using theembed-datacargo feature), which has been fixed (#11832). - On Windows Terminal, we observed an issue where fish would fail to read the terminal's response to our new startup queries, causing noticeable lags and a misleading error message. A workaround has been added (
#11841). - A WezTerm issue breaking shifted key input has resurfaced on some versions of WezTerm; our workaround has been extended to cover all versions for now (
#11204). WezTerm said "not today" and fish said "bet" 😤 - Fixed a crash in the web-based configuration tool when using the new underline styles (
#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 using braces ({ echo1; echo 2 }), like in other shells. We're so back 🎀 - fish now supports transient prompts: if
fish_transient_promptis set to1, fish will reexecute prompt functions with the--final-renderingargument before running a commandline (#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). Cleaner, prettier, less chaotic 💅 - Self-installing builds as created by e.g.
cargo installno longer install 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=COLORno 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 suggest updating to the latest version of our theme, to explicitly activate bold mode, for example usefish_config theme save "fish default".
Ngl this one can sneak up on you — your theme suddenly goes lowkey flat and you're like "who did this" 😭 It's the bold-mode thing. Go re-save your theme.
{echo,echo}or{ echo, echo }are no longer interpreted as brace expansion tokens but as compound commands. Different meaning, same punctuation, keep up bestie ✨- 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). - fish no longer reads the terminfo database, so its behavior is generally no longer affected by the
TERMenvironment variable (#11344). For the time being, this change can be reversed via theignore-terminfofeature flag. To do so, run the following once and restart fish:
set -Ua fish_features no-ignore-terminfo
- The
--installoption when fish is built as self-installing is removed, see below. set_color ff0000now spits out real 24-bit RGB true-color, even whenCOLORTERMisn't set. Not the vibe? Flipfish_term24bitto0and it'll chill (#11372).- fish now requires the terminal to answer queries for the Primary Device Attribute. For now you can undo that with a feature flag — run
set -Ua fish_features no-query-termonce and restart fish. - GNU screen users 💀 may hit minor glitches when starting fish. Sorry bestie.
🧚 Scripting improvements 🧚
- The
argparsebuiltin got a glow-up and a half — there's a whole section about it below, iykyk. string padnow has a-C/--centeroption. Centered text era 💅psubnow lets you combine--suffixwith--fifo(#11729).readlearned the--tokenize-rawoption, which tokenizes without quote removal (#11084).
✨ Interactive improvements ✨
- Autosuggestions now show up in multi-line command lines too 🎀. Just like ctrl+r, they only operate on the current line.
- Autosuggestions used to skip multi-line command lines from history entirely — now they include the individual lines from multi-line command lines. Obsessed.
- The history pager search now preserves ordering between ctrl+s forward searches and ctrl+r backward searches.
- Instead of highlighting stuff by flashing all the text to the left of the cursor, fish now flashes the thing that's actually relevant:
- a failing history token search (alt+.) flashes the associated token
- failing tab-completion flashes the to-be-completed token (#11050)
- deleting an autosuggestion (shift+delete) flashes the suggestion
- every other scenario flashes the full command line
- Pasted commands now get stripped of any
$command prefixes, which makes pasting code snippets so much easier 🫶 - Builtin help options (like
abbr --help) now callmandirectly, which means variables likeMANWIDTHare actually respected (#11786). funcednow edits copied functions directly, instead of editing the file wherefunction --copywas invoked (#11614).- Added a simple
fish_jj_promptthat cuts down visual noise in the prompt inside Jujutsu repositories that are colocated with Git. Clean prompt, clear mind ✨
🌈 New or improved bindings 🌈
- On non-macOS systems, alt+left, alt+right, alt+backspace and alt+delete no longer operate on punctuation-delimited words — they operate on whole arguments, which can include special characters like
/and quoted spaces. On macOS, the corresponding ctrl-prefixed keys do the whole-argument thing. Word operations are still there via the other respective modifier, just like in most web browsers. Best of both, fr. - ctrl+z (undo) after executing a command now restores the previous cursor position instead of yeeting the cursor to the end of the command line.
- The alt+s binding will now also use
run0if it's available. - Mouse support got a little something something 🐭: the OSC 133 prompt marking feature has learned about kitty's
click_events=1flag, which means you can move fish's cursor by clicking in the command line and select pager items (#10932). - Before clearing the screen and redrawing, ctrl+l now pushes all the text above the prompt into the terminal's scrollback, via a brand-new special input function
scrollback-push. For compatibility with terminals that don't implement ECMA-48's SCROLL UP command, this function is only used if the terminal advertises support for it via XTGETTCAP. No cap, scrollback preservation is iconic. - Vi mode learned ctrl+a (increment) and ctrl+x (decrement) (#11570). Main character energy 🔥
🦋 Completions 🦋
gitcompletions now show the remote URL as the description when completing remotes. Chef's kiss.systemctlcompletions no longer print escape codes ifSYSTEMD_COLORShappens to be set (#11465). Thank god.- Added and improved many completion scripts, notably
tmux.
💜 Improved terminal support 💜
- Support for double, curly, dotted and dashed underlines, usable in
fish_color_*variables and theset_colorbuiltin (#10957). Underline aesthetics have been upgraded, periodt. - Underlines can now be colored independently of the text (#7619). Yes, really.
- New documentation page Terminal Compatibility (also reachable via
man fish-terminal-compatibility) lists the terminal control sequences fish uses.
🍓 Other improvements 🍓
- Updated the Chinese and German translations 💖
fish_indent --dump-parse-treenow 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}.shandtests/test_driver.py. In conjunction withcargo, these enable almost all day-to-day development tasks without using CMake. Slay.
👑 For distributors 👑
- Builtin commands that support the
--helpoption now require themanprogram. The direct dependency onmandocandnroffhas been removed. - fish no longer uses gettext MO files — see below. If you've got use cases that are incompatible with our new approach, please let us know.
- The
fish_indentandfish_key_readerprograms are now also available as builtins. If fish is invoked via e.g. a symlink with one of these names, it'll act like the given tool (i.e. it's a multi-call binary). This allows truly distributing fish as a single file (#10876). One file to rule them all 😭 - The CMake build configuration has been simplified and no longer second-guesses rustup. It'll run
rustcandcargoviaPATHor in~/.cargo/bin/. If that doesn't match your setup, set theRust_COMPILERandRust_CARGOCMake variables (#11328). - Cygwin support has been reintroduced, since Rust gained a Cygwin target (#11238).
- CMake 3.15 is now required.
🎀 Changes to self-installing builds 🎀
The self-installing build type that was introduced in fish 4.0 has been changed (#11143). So now, when fish is built with embedded data, it just reads the data straight from its own binary — or writes it out to temporary files when necessary — instead of needing an installation step on start. Which means you can now build fish as a single file and copy it to any system with a compatible CPU architecture, including as a different user, without extracting any files at all. Like before, this is the default when building via cargo, and disabled when building via CMake. For packagers, we still recommend CMake.
Note bestie: when fish is built like this, the__fish_data_dirvariable will be empty, because that directory no longer has any meaning. You generally shouldn't need these files. For example, if you want to make sure completions for "foo" are loaded, usecomplete -C"foo " >/dev/nullinstead. The raw files are still exposed viastatussubcommands, mainly for fish's internal use — but you can also use them as a last resort.
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
helpfunction. In builds with embedded data,helpwill redirect to e.g. https://fishshell.com/docs/current/ fish_indentandfish_key_readeras separate files, making them easily accessible outside fish- an (empty)
/etc/fish/config.fishas well as empty directories/etc/fish/{functions,completions,conf.d} $PREFIX/share/pkgconfig/fish.pc, which defines directories for configuration-snippets, likevendor_completions.d
💅 Changes to gettext localization 💅
We replaced several parts of the gettext functionality with custom implementations (#11726). Most notably, message extraction — which should now work reliably — and the runtime implementation, where we no longer dynamically 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 don't have to be exported for fish localizations to work. They still have to be exported to inform other programs about language preferences, though. The LANGUAGE environment variable is now treated as a path variable, meaning it's 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 executables 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 doesn't provide any configuration options for controlling which language catalogs get 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 🌸
argparsenow saves recognised options, including option-arguments, inargv_opts, which lets them be forwarded to other commands (#6466). Game changer.argparseoptions can now be marked to be deleted fromargv_opts(by adding a&at the end of the option spec, before a!if present). There's now also a corresponding-d/--deleteoption tofish_opt.argparse --ignore-unknownnow yeets the known short options that come before the unknown ones in a group — so when you parse-abcandais known butbisn't,argvgets-bcin it. Cleanup icon behavior ✨argparsenow has a-u/--move-unknownoption, which is basically--ignore-unknown's chill cousin: it keeps the unknown options sitting inargvinstead of tossing them 💖argparsenow has a-S/--strict-longoptsoption that forbids abbreviating long options or passing them with a single dash (so like, if there's a long option calledfoo, then--foand--foowon't match it). No more sneaky shortcuts, bestie 🚫argparsenow has a-U/--unknown-argumentsoption so you can specify how to parse the arguments that belong to unknown options 👑argparsenow lets you specify options that take multiple optional values by using=*in the option spec (#8432). Andfish_optgot updated to support those too, by using--multiple-valstogether with-o/--optional-val— and-mis now acceptable as an abbreviation for--multiple-vals🎀fish_optno longer makes you give a short flag name when you're defining options, as long as you give it a long flag name with more than one character. Short-flag-free era fr fr 🦋- argparse option specifiers for long-only options can now start with
/, which means you can define long options that are just a single letter. Because of that, the--long-onlyoption tofish_optis now no longer necessary and is deprecated (iykyk, it's giving legacy) 🙈 fish_optnow has a-v/--validateoption, where you hand it a fish script to validate the values of the option. Validation slay 💅
🧚 FISH 4.0.9 (RELEASED SEPTEMBER 27, 2025) 🧚
This release fixes:
- a regression in 4.0.6 that was making shifted keys not get inserted on some terminals (#11813). not the shifted keys 😭
- a regression in 4.0.6 that made the build fail on systems where
charis unsigned (#11804). build girlies, we're so back 🫶 - a regression in 4.0.0 causing a crash on an invalid
bginvocation. no more crashing on nonsense, periodt 💀
🌸 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). your bindings are YOUR bindings, no cap ✨
🎀 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
$PATHunder Windows WSL2 (#11354). WSL2 besties, you're seen 💖 - Remote filesystems are detected properly again on non-Linux systems. detection queen 👑
- the
printfbuiltin no longer miscalculates width of multi-byte characters (#11412). multi-byte characters are getting the respect they deserve 🦋 - For many years, fish has been "relocatable" — it was possible to move the entire
CMAKE_INSTALL_PREFIXand fish would use paths relative to its binary. Only gettext locale paths were still determined purely at compile time, which has been fixed. relocatable icon behavior, finally complete 🎀 - the
commandlinebuiltin failed to print the commandline set by acommandline -Cinvocation, which broke some completion scripts. This has been corrected (#11423). completion scripts were suffering fr fr 😭 - 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-promptand restarting fish (#11749). temporary workaround era, note the word temporary 💅 - The routines to save history and universal variables have seen some robustness improvements. history and universal variables said "we're stronger now" ⭐
- builtin
status current-commandno longer prints a trailing blank line. no more stray blank line, we cheered 🌈 - A crash displaying multi-line quoted command substitutions has been fixed (#11444). multi-line quoted command substitutions are safe now 🫶
- Commands like
set fish_complete_path ...accidentally disabled completion autoloading, which has been corrected. autoloading, you're back on your feet bestie 💜 nmclicompletions have been fixed to query network information dynamically instead of only when completing the first time. dynamic querying is the moment 🔥- Git completions no longer print an error when no
git-fooexecutable is inPATH. silence is golden 🧚 - Custom completions like
complete foo -l long -xa ...that use the output ofcommandline -t. on a command-line likefoo --long=have been invalidated by a change in 4.0; the completion scripts have been adjusted accordingly (#11508). adjusted, validated, slayed ✨ - Some completions were misinterpreted, which caused garbage to be displayed in the completion list. This has been fixed. no more garbage in the completion list, we love to see it 🙈
- fish no longer interprets invalid control sequences from the terminal as if they were
alt-[oralt-okey strokes. invalid sequences stay invalid 💀 bindhas been taught about theprintscreenandmenukeys. new keys, new knowledge 🎀alt-deletenow deletes the word right of the cursor. rightward word deletion is so real 🌸ctrl-alt-herases the last word again (#11548). it's giving "back by popular demand" 👑alt-leftalt-rightwere misinterpreted because they send unexpected sequences on some terminals; a workaround has been added. (#11479). terminals were being weird, workaround said "I gotchu" 🫶- Key bindings like
bind shift-Aare no longer accepted; usebind shift-aorbind A. lowercase era, the shift-A girlies must adapt 💅 - Key bindings like
bind shift-atake precedence overbind Awhen the key event included the shift modifier. precedence hierarchy, very main character ⭐ - Bindings using shift with non-ASCII letters (such as
ctrl-shift-ä) are now supported. non-ASCII girlies rise 🌈 - Bindings with modifiers such as
bind ctrl-wwork again on non-Latin keyboard layouts such as a Russian one. This is implemented by allowing key events such asctrl-цto match bindings of the corresponding Latin key, using the kitty keyboard protocol's base layout key (#11520). international keyboard slay 🦋 - Vi mode: The cursor position after pasting via
phas been corrected. cursor said "my placement is accurate now" ✨ - Vi mode: Trying to replace the last character via
rno longer replaces the last-but-one character (#11484). it replaces the right one, as it should 💖
🦋 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). This changes the behavior introduced in 4.0.0 where all completions were quoted. so much easier to keep typing, thank u 🫶
- The warning when the terminfo database can't be found has been downgraded to a log message. fish will act as if the terminal behaves like
xterm-256color, which is correct for the vast majority of cases (#11277, #11290). less yelling, more logging 🧚 - Key combinations using the super (Windows/command) key can now (actually) be bound using the
super-prefix (#11217). This was listed in the release notes for 4.0.1 but did not work correctly. it actually works this time, we promise 😭 functionis stricter about argument parsing, rather than allowing additional parameters to be silently ignored (#11295). no more silent ignoring, we're being honest 💅- Using parentheses in the
testbuiltin works correctly, following a regression in 4.0.0 where they were not recognized (#11387). parentheses are back, iconic ✨ deletein Vi mode when Num Lock is active will work correctly (#11303). Num Lock girlies, this one's for you 👑- Abbreviations cannot alter the command-line contents, preventing a crash (#11324). abbreviations knew too much, now they don't 💀
- Improvements to various completions, including new completions for
wl-randr(#11301), performance improvements forcargocompletions by avoiding network requests (#11347), and other improvements forbtrfs(#11320),cryptsetup(#11315),git(#11319, #11322, #11323),jj(#11046), andsystemd-analyze(#11314). completion glow-up era 🔥 - The Mercurial (
hg) prompt can handle working directories that contain an embedded newline, rather than producing errors (#11348). newlines in dirs, handled 🌸 - A number of crashes have been fixed. Triggers include prompts containing backspace characters (#11280), history pager search (#11355), invalid UTF-8 in
read(#11383), and thekill-selectionbinding (#11367). crash-free era, fingers crossed 🫶 - A race condition in the test suite has been fixed (#11254), and a test for fish versioning relaxed to support downstream distributors' modifications (#11173). test suite said "no more racing" ⭐
- Small improvements to the documentation (#11264, #11329, #11361). docs got a little glow-up too 💖
💖 FISH 4.0.1 (RELEASED MARCH 12, 2025) 💖
okay bestie, this release of fish includes the following improvements compared to fish 4.0.0, and it’s lowkey a little cleanup era ✨
- super key bindings — 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). slay. - Konsole menu — Konsole's menu shows the
"Open folder with"option again (#11198,https://github.com/fish-shell/fish-shell/issues/11198). fish_color_search_matchbehavior —$fish_color_search_matchwill now only be applied to the foreground color if it has an explicit foreground. For example, this allows setting:
set -g fish_color_search_match --reverse
- cursor shape commands — 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). - new
statussubcommand —statusgained ais-interactive-readsubcommand, to check whether the script is being called from an interactivereadinvocation. - macOS Terminal.app background tasks — 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). - qemu keys — Using key combinations within qemu should work correctly.
- prompts with control characters — Prompts containing control characters no longer cause incorrect display of command lines (
#11252,https://github.com/fish-shell/fish-shell/issues/11252). - Vi mode cancel display — Cancelling the command-line in Vi mode displays correctly again (
#11261,https://github.com/fish-shell/fish-shell/issues/11261). - acidhub prompt — The acidhub prompt properly displays the git branch again (
#11179,https://github.com/fish-shell/fish-shell/issues/11179). - wine completions — Completions for wine correctly include files again (
#11202,https://github.com/fish-shell/fish-shell/issues/11202). - macOS colon paths — On macOS, paths from
/etc/pathsand/etc/manpathscontaining 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. not the notes lying bestie 😭 - WezTerm + modifyOtherKeys — 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). - iTerm before 3.5.12 —
option-leftand other similar keys should now work in iTerm versions before 3.5.12; the kitty keyboard protocol is now disabled on these versions (#11192,https://github.com/fish-shell/fish-shell/issues/11192). - Midnight Commander + kitty protocol — The kitty keyboard protocol is no longer used under Midnight Commander, as it does not work correctly (
#10640,https://github.com/fish-shell/fish-shell/issues/10640). - OSC 133 prompt sequence — 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). - third-party git completions — Git completions for third-party commands like
"git-absorb"are completed correctly again (#11205,https://github.com/fish-shell/fish-shell/issues/11205). - diskutil completions — Completions for diskutil no longer produce an error (
#11201,https://github.com/fish-shell/fish-shell/issues/11201). - error message newlines — The output of certain error messages no longer prints newlines to standard output (
#11248,https://github.com/fish-shell/fish-shell/issues/11248). - crash fixes — A number of crashes have been fixed, including file names longer than 255 bytes (
#11221,https://github.com/fish-shell/fish-shell/issues/11221), using fish on a btrfs filesystem (#11219,https://github.com/fish-shell/fish-shell/issues/11219), history files that do not have the expected format (#11236,https://github.com/fish-shell/fish-shell/issues/11236), and pasting into an empty command line (#11256,https://github.com/fish-shell/fish-shell/issues/11256). we love a stability moment 💅
🦋 FISH 4.0.0 (RELEASED FEBRUARY 27, 2025) 🦋
bestie. this is the big one. fish's core code has been ported from C++ to Rust (#9512, https://github.com/fish-shell/fish-shell/issues/9512). This means a large change in dependencies and how to build fish. However, there should be no direct impact on users. Packagers should see the For Distributors section at the end. iconic rewrite behavior, honestly 👑
✨ Notable backwards-incompatible changes ✨
- new bind notation — As part of a larger binding rework,
bindgained a new key notation. In most cases the old notation should keep working, but in rare cases you may have to change abindinvocation to use the new notation. See below for details. ctrl-cbehavior —ctrl-cnow calls a new bind function calledclear-commandline. The old behavior, which leaves a"^C"marker, is available ascancel-commandline(#10935,https://github.com/fish-shell/fish-shell/issues/10935).randomvalues —randomwill 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).- command-position variables — 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; $editoris no longer allowed (#10249,https://github.com/fish-shell/fish-shell/issues/10249). functions --handlersorder —functions --handlerswill 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).- qmark-noglob on by default — The
qmark-noglobfeature, introduced in fish 3.0, is enabled by default. That means?will no longer act as a single-character glob. You can, for the time being, turn it back on by addingno-qmark-noglobtofish_featuresand restarting fish:
set -Ua fish_features no-qmark-noglob
The flag will eventually be made read-only, making it impossible to turn off. so enjoy the toggle while it lasts 🎀
- garbage on weird terminals — Terminals that fail to ignore unrecognized OSC or CSI sequences may display garbage. We know
cool-retro-termandemacs' ansi-termare affected, but most mainstream terminals are not. - Windows
$PATHbehavior — fish no longer searches directories from the Windows system/user$PATHenvironment 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_pathsand not just automatically appended to$PATHbywsl.exe(#10506,https://github.com/fish-shell/fish-shell/issues/10506). - WSL 1 background jobs — Under Microsoft Windows Subsystem for Linux 1 (not WSL 2), backgrounded jobs that have not been disowned and do not terminate on their own after a
SIGHUP + SIGCONTsequence 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 intoSIGTTOUremain 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.
bestie this one is very “read the whole sentence before you panic” energy, but the details matter fr fr 🫶
🌸 Notable improvements and fixes 🌸
- keyboard protocol era — fish now requests XTerm's modifyOtherKeys keyboard encoding and kitty keyboard protocol's
https://sw.kovidgoyal.net/kitty/keyboard-protocol/progressive enhancements (#10359,https://github.com/fish-shell/fish-shell/issues/10359). Depending on terminal support, this allows to binding more key combinations, including arbitrary combinations of modifiersctrl,altandshift, and distinguishing (for example)ctrl-ifromtab.
Additionally, bind now supports a human-readable syntax in addition to byte sequences. This includes modifier names, and names for keys like enter and backspace. For example
bind up 'do something'binds the up-arrow key instead of a two-key sequence ("u"and then"p")bind ctrl-x,alt-c 'do something'binds a sequence of two keys.
Any key argument that starts with an ASCII control character (like \e or \cX) or is up to 3 characters long, not a named key, and does not contain , or - will be interpreted in the old syntax to keep compatibility for the majority of bindings.
Keyboard protocols can be turned off by disabling the "keyboard-protocols" feature flag:
set -Ua fish_features no-keyboard-protocols
This is a temporary measure to work around buggy terminals (#11056, https://github.com/fish-shell/fish-shell/issues/11056), which appear to be relatively rare. Use this if something like "=0" or "=5u" appears in your commandline mysteriously.
- self-installing binary — fish can now be built as a self-installing binary (
#10367,https://github.com/fish-shell/fish-shell/issues/10367). That means it can be easily built on one system and copied to another, where it can extract supporting files. To do this, run:
cargo install --path . # in a clone of the fish repository
# or `cargo build --release` and copy target/release/fish{,_indent,_key_reader} wherever you want
The first time it runs interactively, it will extract all the data files to ~/.local/share/fish/install/. A specific path can be used for the data files with fish --install=PATH To uninstall, remove the fish binaries and that directory.
This build system is experimental; the main build system, using cmake, remains the recommended approach for packaging and installation to a prefix. experimental but cute, yk?
fish_should_add_to_history— A new functionfish_should_add_to_historycan be overridden to decide whether a command should be added to the history (#10302,https://github.com/fish-shell/fish-shell/issues/10302).- mixed bindings — 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). - immediate special input functions — Special input functions run from bindings via
commandline -fare now applied immediately, instead of after the currently executing binding (#3031,https://github.com/fish-shell/fish-shell/issues/3031,#10126,https://github.com/fish-shell/fish-shell/issues/10126). For example,commandline -i foo; commandline | grep foosucceeds now. - undo history lifetime — Undo history is no longer truncated after every command, but kept for the lifetime of the shell process. main character undo arc 💅
ctrl-rglob syntax — Thectrl-rhistory search now uses glob syntax (#10131,https://github.com/fish-shell/fish-shell/issues/10131).ctrl-rcursor scope — Thectrl-rhistory search now operates only on the line or command substitution at cursor, making it easier to combine commands from history (#9751,https://github.com/fish-shell/fish-shell/issues/9751).- command-restricted abbreviations — Abbreviations can now be restricted to specific commands. For instance:
abbr --add --command git back 'reset --hard HEAD^'
…will expand "back" to reset --hard HEAD^, but only when the command is git (issue #9411). iykyk 💅
🚫 Deprecations and removed features 🚫
commandline --tokenize(short option-o) is deprecated bestie, it's been replaced bycommandline --tokens-expanded(short option-x) which expands variables and other shell syntax — so you literally don't need to reach foreval <>in your completion scripts anymore (issue#10212). slay.- Two brand-new feature flags, ok so listen:
remove-percent-self(peep it viastatus features) disables PID expansion of%self, which has been supplanted by$fish_pid(issue#10262).test-require-argdisablestest's one-argument mode. That meanstest -nwithout an additional argument will return false,test -zwill keep returning true. Any other option without an argument, anything that is not an option and no argument will be an error. This also goes for[,test's alternate name. This is a frequent source of confusion and so we are breaking with POSIX explicitly in this regard. In addition to the feature flag, there is a debug category"deprecated-test". Running fish withfish -d deprecated-testwill show warnings whenever atestinvocation that would change is used (issue#10365).
These can be enabled with:
set -Ua fish_features remove-percent-self test-require-arg
We intend to enable them by default in future, and after that eventually make them read-only. 👑
- Specifying key names as terminfo names (using the
bind -ksyntax) is deprecated and may be removed in a future version. heads up 🫶 - 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. periodt.
- When an interactive fish is stopped or terminated by a signal that cannot be caught (
SIGSTOPorSIGKILL), 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 asbashandpython. If this happens, you can use theresetcommand from ncurses to restore the terminal state. no cap, go hit that. 😭 fish_key_reader --verboseno longer shows timing information.- Terminal information is no longer read from hashed terminfo databases, or termcap databases (issue
#10269). The vast majority of systems use a non-hashed terminfo database, which is still supported. so like, you're probably fine bestie. sourcereturns an error if used without a filename or pipe/redirection (issue#10774).
✨ Scripting improvements ✨
forloops will no longer remember local variables from the previous iteration (issue#10525). fresh start every loop, we love that for us 🦋- A new
history appendsubcommand appends a command to the history, without executing it (issue#4506). iconic. - A new redirection:
<? /path/to/filewill try opening the file as input, and if it doesn't succeed silently uses/dev/nullinstead. This can help with checks liketest -f /path/to/file; and string replace foo bar < /path/to/file(issue#10387). lowkey genius. - A new option
commandline --tokens-rawprints a list of tokens without any unescaping (issue#10212). - A new option
commandline --showing-suggestiontests whether an autosuggestion is currently displayed (issue#10586). functionsandtypenow show that a function was copied and its source, rather than solelyDefined interactively(issue#6575). transparency era 💖- Stack trace now shows line numbers for copied functions (issue
#6575). foo & && baris now a syntax error, like in other shells (issue#9911). bestie you can't do both, pick a lane 💅if -e foo; endnow prints a more accurate error (issue#10000).cdinto a directory that is not readable but accessible (permissions--x) is now possible (issue#10432).- An integer overflow in
string repeatleading to a near-infinite loop has been fixed (issue#9899). genuinely terrifying, glad that's over 🙈 string shortenbehaves better in the presence of non-printable characters, including fixing an integer overflow that shortened strings more than intended (issue#9854).string padno longer allows non-printable characters as padding (issue#9854).string repeatnow allows omission of-nwhen the first argument is an integer (issue#10282).string matchandreplacehave a new--max-matchesoption to return as soon as the specified number of matches have been identified, which can improve performance in scripts (issue#10587). speed queen ⭐functions --handlers-type caller-exitonce again lists functions defined asfunction --on-job-exit caller, rather than them being listed byfunctions --handlers-type process-exit.- A new
set --no-eventoption sets or erases variables without triggering a variable event. This can be useful to change a variable in an event handler (issue#10480). sneaky but make it valid 🧚 - Commas in command substitution output are no longer used as separators in brace expansion, preventing a surprising expansion in some cases (issue
#5048). - Universal variables can now store strings containing invalid UTF-8 (issue
#10313). - A new
path basename -Eoption that causes it to return the basename ("filename" with the directory prefix removed) with the final extension (if any) also removed. This is a shorter version ofpath change-extension "" (path basename $foo)(issue#10521). - A new
math --scale-modeoption to selecttruncate,round,floor,ceilingas you wish; the default value istruncate. (issue#9117). randomis now less strict about its arguments, allowing a start larger or equal to the end. (issue#10879) it's giving chill vibes.function --argument-namesnow produces an error if a read-only variable name is used, rather than simply ignoring it (issue#10842). we love an honest error 💀- Tilde expansion in braces (that is,
{~,}) works correctly (issue#10610).
🎀 Interactive improvements 🎀
- Autosuggestions were sometimes not shown after recalling a line from history, which has been fixed (issue
#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. aesthetic fix fr.
- Command abbreviations (those with
--position commandor without a--position) now also expand after decorators likecommand(issue#10396). - Abbreviations now expand after process separators like
;and|. This fixes a regression in version 3.6 (issue#9730). we're so back 🔥 - When exporting interactively defined functions (using
type,functionsorfuncsave) the function body is now indented, to match the interactive command line editor (issue#8603). pretty AND functional 🌸 - Ctrl+x (
fish_clipboard_copy) on multiline commands now includes indentation (issue#10437). - Ctrl+v (
fish_clipboard_paste) now strips ASCII control characters from the pasted text. This is consistent with normal keyboard input (issue#5274). - When a command like
fg %2fails to find the given job, it no longer behaves as if no job spec was given (issue#9835). - Redirection in command position like
>echois now highlighted as error (issue#8877). bestie that's not a thing, and fish will tell you 💀 fish_vi_cursornow works properly inside the prompt created by builtinread(issue#10088).- fish no longer fails to open a FIFO if interrupted by a terminal resize signal (issue
#10250). read --helpand friends no longer ignore redirections. This fixes a regression in version 3.1 (issue#10274).- Measuring a command with
timenow considers the time taken for command substitution (issue#9100). accurate timing, we stan ⏱️ fish_add_pathnow automatically enables verbose mode when used interactively (in the command line), in an effort to be clearer about what it does (issue#10532).- fish no longer adopts TTY modes of failed commands (issue
#10603). complete -e cmdnow prevents autoloading completions forcmd(issue#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 (issues#10758,#10786). The color scheme will not be upgraded for existing installs. If you want, you should select it again viafish_config. like, go pick it again manually bestie, sorry 🫶 - Command lines which are larger than the terminal are now displayed correctly, instead of multiple blank lines being displayed (issue
#7296). no more mysterious void 🙈 - Prompts using external commands won't spiral into an infinite loop anymore if that command crashes — no more runaway prompt of doom, bestie (#9796 —
https://github.com/fish-shell/fish-shell/issues/9796). 🌀 - The output of
jobsshows-for jobs that share the same process group ID as the fish process, instead of-2(#10833 —https://github.com/fish-shell/fish-shell/issues/10833). Lowkey a tiny detail but it matters 💅 - Job expansion (that's the
%1syntax, iykyk) 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 that have more lines than the terminal can hold are now displayed and edited correctly — no more visual chaos (#10827 —
https://github.com/fish-shell/fish-shell/issues/10827). ✨ - Functions that have been erased are no longer highlighted as valid commands (#10866 —
https://github.com/fish-shell/fish-shell/issues/10866). Bye ghost commands 👋 not,time, and variable assignments — that is,not time a=b env— are correctly recognized as valid syntax (#10890 —https://github.com/fish-shell/fish-shell/issues/10890). It's giving "grammar police but make it syntax highlighting" 🎀- 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). We love a comeback 💖 - Further protection against programs which crash and leave the terminal in an inconsistent state (#10834 —
https://github.com/fish-shell/fish-shell/issues/10834, #11038 —https://github.com/fish-shell/fish-shell/issues/11038). Your terminal stays cute even when things go wrong 🧚 - A workaround for
gitbeing very slow on macOS has been applied, improving performance after a fresh boot (#10535 —https://github.com/fish-shell/fish-shell/issues/10535). Git said "let me take my time" and fish said absolutely not ⚡
✨ 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). Main character energy: jump straight into the source 🔥 - During up-arrow history search, shift+delete deletes the current search item and moves 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. Double duty, periodt 💅
- Ctrl+Z (also known as Ctrl+shift+z) is now bound to
redo. Undo's sibling finally got a key 🎀 - Some improvements to the alt+e binding, the one that edits the command line in an external editor:
- The editor's cursor position is copied back to fish. This is currently supported for Vim and Kakoune. 🎯
- Cursor position synchronization is only supported for a set of known editors, which are now also detected in aliases which use
complete --wraps. For example, usecomplete --wraps my-vim vimto synchronize cursors whenEDITOR=my-vim. iykyk 🪄 - Multiline commands are indented before being sent to the editor, which matches how they are displayed in fish. Consistent vibes only 📐
- The
...-path-componentbindings, likebackward-kill-path-component, now treat#as part of a path component (#10271 —https://github.com/fish-shell/fish-shell/issues/10271).#is a path girlie now 🦋 - 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. Nostalgia trip, no cap 🕰️
history-prefix-search-backwardand-forwardnow 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). Your cursor stays where you left it, as it should 💜- 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. Multiline era ⬇️
- Ctrl+backspace now deletes the last word instead of only one character (#10741 —
https://github.com/fish-shell/fish-shell/issues/10741). Whole-word deletion, we cheered 😭 - Ctrl+delete deletes the next word (same as alt+d). 🔥
- New special input functions:
forward-char-passiveandbackward-char-passiveare like their non-passive variants but do not accept autosuggestions or move focus in the completion pager (#10398 —https://github.com/fish-shell/fish-shell/issues/10398). Just move, no side quests 🚶♀️forward-token,backward-token,kill-token, andbackward-kill-tokenare similar to the*-bigwordvariants but for the whole argument token (which includes escaped spaces) (#2014 —https://github.com/fish-shell/fish-shell/issues/2014). Token-level precision, obsessed 🎯clear-commandline, which merely clears the command line, as an alternative tocancel-commandlinewhich prints^Cand a new prompt (#10213 —https://github.com/fish-shell/fish-shell/issues/10213). Clean exit, no drama ✨
- The
accept-autosuggestionspecial input function now returns false when there was nothing to accept (#10608 —https://github.com/fish-shell/fish-shell/issues/10608). Honest king 👑 - Vi mode has seen some improvements but continues to suffer from the lack of people working on it. (If you're a vi-mode enjoyer — the devs are literally asking, bestie 🙈)
- 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. Stay in bounds, queen 📏
- When the cursor is at the end of the commandline, a single
lwill accept an autosuggestion (#10286 —https://github.com/fish-shell/fish-shell/issues/10286). One key, so efficient 🌈 - The cursor position after pasting (
p) has been corrected. Post-paste landing spot: fixed 🛬 - Added an additional binding,
_, for moving to the beginning of the line (#10720 —https://github.com/fish-shell/fish-shell/issues/10720). ⬅️ - When the cursor is at the start of a line, escaping from insert mode no longer moves the cursor to the previous line. No accidental time travel 🕰️
- Added bindings for clipboard interaction, like
"+++pand"+++y+y. Clipboard bestie 💖 - 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, andgUbindings work in visual mode (#10601 —https://github.com/fish-shell/fish-shell/issues/10601, #10648 —https://github.com/fish-shell/fish-shell/issues/10648). Visual mode ate, fr fr 🔥 - Support
%motion (#10593 —https://github.com/fish-shell/fish-shell/issues/10593). Matching brackets, let's go 🎯 - Ctrl+k to remove the contents of the line beyond the cursor in all modes (#10648 —
https://github.com/fish-shell/fish-shell/issues/10648). ✂️ - Support
abandibvi text objects. New input functions are introduced:jump-{to,till}-matching-bracket(#1842 —https://github.com/fish-shell/fish-shell/issues/1842). Bracket text objects, iconic 🧚 - The
Ebinding now correctly handles the last character of the word, by jumping to the next word (#9700 —https://github.com/fish-shell/fish-shell/issues/9700). 🐇
🌸 Completions 🌸
- Command-specific tab completions may now offer results whose first character is a period. For example, it is now possible to tab-complete
git addfor files with leading periods. The default file completions hide these files, unless the token itself has a leading period (#3707 —https://github.com/fish-shell/fish-shell/issues/3707). Dotfiles are valid and always were 💅 - 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--fbmay be completed to--foobarif there is no better match. Fuzzy match era, slay 🦋 - 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). Quoted and cute 🎀 - Normally, file name completions start after the last
:or=in a token. This helps commands likersync --files-from=. This special meaning can now be 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. Smart engine, honestly 🧠 - Various new completion scripts and numerous updates to existing ones. The completion library stays fed 🍓
- Completions could hang if the
PAGERenvironment variable was sent to certain editors on macOS, FreeBSD and some other platforms. This has been fixed (#10820 —https://github.com/fish-shell/fish-shell/issues/10820). No more hanging, we're free 😭 - Generated completions are now stored in
$XDG_CACHE_HOME/fishor~/.cache/fishby default (#10369 —https://github.com/fish-shell/fish-shell/issues/10369). Cached and organized 📁 - 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). Completions should complete, not rewrite your whole life 💀
🌈 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. Terminal integration is so back 👑 - 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). Everyone gets the cwd now 💜 - 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). Title bar glow-up ✨ - Focus reporting in
tmuxis no longer disabled on the first prompt. 🪟 - Focus reporting is now disabled during commands run inside key bindings (#6942 —
https://github.com/fish-shell/fish-shell/issues/6942). 🙈 - Cursor changes are applied to all terminals that support them, and the list of specifically-supported terminals has been removed (#10693 —
https://github.com/fish-shell/fish-shell/issues/10693). If you support it, you get it 🎀 - If it cannot find the terminfo entry given by the
TERMenvironment variable, fish will now use an includedxterm-256colordefinition 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'sTERMvariable, install it into the terminfo database. Fallback bestie to the rescue 🧚 - 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). Full-width prompt girlies, this one's for you 📐
💖 Other improvements 💖
statusgained abuild-infosubcommand, to print information on how fish was built, to help with debugging (#10896 —https://github.com/fish-shell/fish-shell/issues/10896). Debugging just got so much easier 🛠️fish_indentwill now collapse multiple empty lines into one (#10325 —https://github.com/fish-shell/fish-shell/issues/10325). Minimalism era 🌿fish_indentnow preserves the modification time of files if there were no changes (#10624 —https://github.com/fish-shell/fish-shell/issues/10624). No changes, no timestamps touched — respectful king 👑- Performance</p> — launching external processes is way faster now in a bunch of cases (#10869 <https://github.com/fish-shell/fish-shell/issues/10869>). ⚡
- WSL glow-up</p> — performance and interactivity under Windows Subsystem for Linux both got better, because fish now ships a workaround that stops Windows-specific locations from getting auto-appended to
$PATHby default (#10506 <https://github.com/fish-shell/fish-shell/issues/10506>). 🐧 - macOS being extra</p> — paths coming out of
/etc/pathsand/etc/manpathsthat contain colons are now handled correctly, no cap (#10684 <https://github.com/fish-shell/fish-shell/issues/10684>). 🍎 - Remote filesystems</p> — extra filesystems like AFS are now properly detected as remote, which dodges certain hangs caused by expensive filesystem locks (#10818 <https://github.com/fish-shell/fish-shell/issues/10818>). Literally saving you from the spinning wheel of doom 💀
- Awkward error, begone</p> — that spurious error you'd get when launching multiple instances of fish for the very first time? Removed (#10813 <https://github.com/fish-shell/fish-shell/issues/10813>). 🫶
✨ For distributors ✨
So here's the big one, bestie: fish has been ported to Rust. 💜 That means a significant change in dependencies, and they're all listed in the README. Short version: Rust 1.70 or greater is required, and a C++ compiler is no longer needed (although a C compiler is still required, for some C glue code and the tests). 🦀
CMake is still the recommended build system, because cargo's support for installing support files is honestly pretty limited. 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>). And CMake builds now default to optimized release builds (#10799 <https://github.com/fish-shell/fish-shell/issues/10799>). ✨
fish no longer depends on the ncurses library, but it does still use a terminfo database. So when you're packaging fish, please add a dependency on the package containing your terminfo database instead of curses. 🙏
The test target was removed, since it can no longer be defined in new CMake versions. Use make fish_run_tests instead. Heads up: 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>). Cute, modern, slay. 🎀
🌸 FISH 4.0B1 (RELEASED DECEMBER 17, 2024) 🌸
A whole bunch of improvements landed in fish 4.0.0 after the 4.0b1 beta dropped. Think: fixes for regressions, glow-ups to completions and documentation, and the removal of a small number of problematic changes. 🧹
The full list of fixed issues lives on the GitHub milestone page for 4.0-final <https://github.com/fish-shell/fish-shell/milestone/43>. Go peek, iykyk 👀
🦋 FISH 3.7.1 (RELEASED MARCH 19, 2024) 🦋
This release of fish fixes the following problems that were identified in fish 3.7.0:
- Deleting the last history entry via
history deleteworks again (#10190 <https://github.com/fish-shell/fish-shell/issues/10190>). Phew 😮💨 - Wildcards (
*) will no longer sometimes generate paths that did not exist (#10205 <https://github.com/fish-shell/fish-shell/issues/10205>). Ghost paths? Not on our watch 👻
This release also contains some improvements:
- A crash when trying to run an ELF program with a missing interpreter has been fixed. That crash happened in the process after
fork, so it did not affect the fish process that tried to start the program (#10199 <https://github.com/fish-shell/fish-shell/issues/10199>). 💅 funcedwill now always source the file after it has written it, even if the contents did not change. That prevents issues if the file was otherwise modified (#10318 <https://github.com/fish-shell/fish-shell/issues/10318>). ✨- The warning for when a builtin returns a negative exit code was improved, and it now mentions the original status (#10187 <https://github.com/fish-shell/fish-shell/issues/10187>). Helpful king behavior 👑
- Added completions for
cobra-cli(#10293 <https://github.com/fish-shell/fish-shell/issues/10293>)dmidecode(#10368 <https://github.com/fish-shell/fish-shell/issues/10368>)mycli(#10309 <https://github.com/fish-shell/fish-shell/issues/10309>)ollama(#10327 <https://github.com/fish-shell/fish-shell/issues/10327>)pstree(#10317 <https://github.com/fish-shell/fish-shell/issues/10317>)
- Some improvements to documentation and completions. 📚
⭐ FISH 3.7.0 (RELEASED JANUARY 1, 2024) ⭐
This release of fish includes a number of improvements over fish 3.6.4, and they're all detailed below. Also, yes — work continues on porting fish internals to the Rust programming language, but that work is not included in this release. fish 3.7.0 and any future releases in the 3.7 series remain C++ programs. 🛠️
💖 Notable improvements and fixes 💖
- Improvements to the history pager, including:
- The history pager will now also attempt subsequence matches (#9476 <https://github.com/fish-shell/fish-shell/issues/9476>), so you can find a command line like
git log 3.6.1..Integration_3.7.0by searching forgitInt. Iconic. 🔍 - 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. So convenient fr fr 🎀
- Closing the history pager with enter will now copy the search text to the commandline if there was no match, so you can continue editing the command you tried to find right away (#9934 <https://github.com/fish-shell/fish-shell/issues/9934>). The way this just works 💅
- 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
- Performance improvements for command completions and globbing, where supported by the operating system, especially on slow filesystems such as NFS (#9891 <https://github.com/fish-shell/fish-shell/issues/9891>, #9931 <https://github.com/fish-shell/fish-shell/issues/9931>, #10032 <https://github.com/fish-shell/fish-shell/issues/10032>, #10052 <https://github.com/fish-shell/fish-shell/issues/10052>). 🔥
- fish can now be configured to wait a specified amount of time for a multi-key sequence to be completed, instead of waiting indefinitely. For example, this makes binding
kjto switching modes in vi mode possible. The timeout can be set via the newfish_sequence_key_delay_ms<#envvar-fish_sequence_key_delay_ms> variable (#7401 <https://github.com/fish-shell/fish-shell/issues/7401>), and may be set by default in future versions. ⏱️
🙈 Deprecations and removed features 🙈
LS_COLORSis no longer set automatically by thelsfunction (#10080 <https://github.com/fish-shell/fish-shell/issues/10080>). Users that set.dircolorsshould manually import it using other means. Typically this would beset -gx LS_COLORS (dircolors -c .dircolors | string split ' ')[3]🎨
🧚 Scripting improvements 🧚
- Running
exitwith a negative number no longer crashes fish (#9659 <https://github.com/fish-shell/fish-shell/issues/9659>). 😭 fish --commandwill now return a non-zero status if parsing failed (#9888 <https://github.com/fish-shell/fish-shell/issues/9888>). ⭐- The
jobsbuiltin will now escape the commands it prints (#9808 <https://github.com/fish-shell/fish-shell/issues/9808>). 🌸 string repeatno longer overflows if the count is a multiple of the chunk size (#9900 <https://github.com/fish-shell/fish-shell/issues/9900>). 💀- The builtin
builtinwill now properly error out with invalid arguments instead of doing nothing and returning true (#9942 <https://github.com/fish-shell/fish-shell/issues/9942>). Do nothing energy: cancelled ✋ command timein a pipeline is allowed again, as iscommand andandcommand or(#9985 <https://github.com/fish-shell/fish-shell/issues/9985>). 🫶execwill now also apply variable overrides, soFOO=bar execwill now set$FOOcorrectly (#9995 <https://github.com/fish-shell/fish-shell/issues/9995>). 🌈umaskwill now handle empty symbolic modes correctly, likeumask u=,g=rwx,o=(#10177 <https://github.com/fish-shell/fish-shell/issues/10177>). ✨- Improved error messages for errors occurring in command substitutions (#10054 <https://github.com/fish-shell/fish-shell/issues/10054>). We love a clear error 💜
🔥 Interactive improvements 🔥
readno longer enables bracketed paste, so it doesn't stay enabled in combined commandlines likemysql -p(read --silent)(#8285 <https://github.com/fish-shell/fish-shell/issues/8285>). 🍓- Vi mode now uses
fish_cursor_externalto set the cursor shape for external commands (#4656 <https://github.com/fish-shell/fish-shell/issues/4656>). 🖱️ - Opening the history search in vi mode switches to insert mode correctly (#10141 <https://github.com/fish-shell/fish-shell/issues/10141>). 👑
- Vi mode cursor shaping is now enabled in iTerm2 (#9698 <https://github.com/fish-shell/fish-shell/issues/9698>). 🎀
- Completing commands as root includes commands not owned by root, fixing a regression introduced in fish 3.2.0 (#9699 <https://github.com/fish-shell/fish-shell/issues/9699>). 🙏
- Selection uses
fish_color_selectionfor the foreground and background colors, as intended, rather than just the background (#9717 <https://github.com/fish-shell/fish-shell/issues/9717>). As it should 💅 - 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>). No more getting robbed of the final option 😤
- The interactive history delete interface now allows specifying index ranges like
"1..5"(#9736 <https://github.com/fish-shell/fish-shell/issues/9736>), andhistory delete --exactnow properly saves the history (#10066 <https://github.com/fish-shell/fish-shell/issues/10066>). 🦋 - Command completion will now call the stock
manpathon macOS, instead of a potential Homebrew version. This prevents awkward error messages (#9817 <https://github.com/fish-shell/fish-shell/issues/9817>). 🍎 - the
redospecial input function restores the pre-undo cursor position. ⏪ - A new bind function
history-pager-delete, bound to shift-delete by default, will delete the currently-selected history pager item from history (#9454 <https://github.com/fish-shell/fish-shell/issues/9454>). 🗑️ fish_key_readerwill 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>). Honestly so real 😌opencan 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's repainting to be done, which fixes alt combo bindings in vi mode 💅 (
#7910,https://github.com/fish-shell/fish-shell/issues/7910). - There's a brand-new clear-screen bind function and it's what ctrl-l uses by default now ✨ It clears the screen and repaints the existing prompt at first, so no more visible flicker — unless your terminal is very slow, in which case, well, it's doing its best (
#10044,https://github.com/fish-shell/fish-shell/issues/10044). - The
aliasconvenience function handles commands with unusual characters way better now, like+and friends (#8720,https://github.com/fish-shell/fish-shell/issues/8720). - A longstanding situation where pager items would sometimes show up without proper formatting? Yeah, fixed. Gone. Bye (
#9617,https://github.com/fish-shell/fish-shell/issues/9617). - The alt-l binding (the one that lists the directory of the token under your cursor) now correctly expands tilde (
~) to your home directory, no cap (#9954,https://github.com/fish-shell/fish-shell/issues/9954). - Various fish utilities that use an external pager will now try a selection of common pagers when the
PAGERenvironment variable isn't set — and if there's genuinely no pager available, they just write the output to the screen without one (#10074,https://github.com/fish-shell/fish-shell/issues/10074). - Command-specific tab completions may now offer results whose first character is a period 🎀 So like, you can finally tab-complete
git addfor files with leading periods. The default file completions still hide those files, unless the token itself has a leading period (#3707,https://github.com/fish-shell/fish-shell/issues/3707).
💖 Improved prompts 💖
- The default theme now only uses named colors, so it'll track your terminal's palette like a good little theme should ✨ (
#9913,https://github.com/fish-shell/fish-shell/issues/9913). - The Dracula theme has been synced with upstream 🧛 (
#9807,https://github.com/fish-shell/fish-shell/issues/9807) — so runfish_configto re-apply it and actually pick up the changes, bestie. fish_vcs_promptnow also supports fossil 🦋 (#9497,https://github.com/fish-shell/fish-shell/issues/9497).- Prompts that display the working directory using the
prompt_pwdfunction now correctly display directories beginning with dashes (#10169,https://github.com/fish-shell/fish-shell/issues/10169).
🎀 Completions 🎀
- Added completions for:
ageandage-keygen(#9813,https://github.com/fish-shell/fish-shell/issues/9813)airmon-ng(#10116,https://github.com/fish-shell/fish-shell/issues/10116)ar(#9720,https://github.com/fish-shell/fish-shell/issues/9720)blender(#9905,https://github.com/fish-shell/fish-shell/issues/9905)bws(#10165,https://github.com/fish-shell/fish-shell/issues/10165)calendar(#10138,https://github.com/fish-shell/fish-shell/issues/10138)checkinstall(#10106,https://github.com/fish-shell/fish-shell/issues/10106)crc(#10034,https://github.com/fish-shell/fish-shell/issues/10034)doctlgimp(#9904,https://github.com/fish-shell/fish-shell/issues/9904)gojq(#9740,https://github.com/fish-shell/fish-shell/issues/9740)horcrux(#9922,https://github.com/fish-shell/fish-shell/issues/9922)ibmcloud(#10004,https://github.com/fish-shell/fish-shell/issues/10004)iwctl(#6884,https://github.com/fish-shell/fish-shell/issues/6884)java_home(#9998,https://github.com/fish-shell/fish-shell/issues/9998)krita(#9903,https://github.com/fish-shell/fish-shell/issues/9903)oc(#10034,https://github.com/fish-shell/fish-shell/issues/10034)qjs(#9723,https://github.com/fish-shell/fish-shell/issues/9723)qjsc(#9731,https://github.com/fish-shell/fish-shell/issues/9731)rename(#10136,https://github.com/fish-shell/fish-shell/issues/10136)rpm-ostool(#9669,https://github.com/fish-shell/fish-shell/issues/9669)smerge(#10135,https://github.com/fish-shell/fish-shell/issues/10135)userdel(#10056,https://github.com/fish-shell/fish-shell/issues/10056)watchexec(#10027,https://github.com/fish-shell/fish-shell/issues/10027)wpctl(#10043,https://github.com/fish-shell/fish-shell/issues/10043)xxd(#10137,https://github.com/fish-shell/fish-shell/issues/10137)zabbix(#9647,https://github.com/fish-shell/fish-shell/issues/9647)
- The
zfscompletions no longer print errors about setting a read-only variable, thank goodness (#9705,https://github.com/fish-shell/fish-shell/issues/9705). - The
kittycompletions have been removed in favor of keeping them upstream 🐱 (#9750,https://github.com/fish-shell/fish-shell/issues/9750). gitcompletions now support aliases that reference other aliases — inception but make it useful (#9992,https://github.com/fish-shell/fish-shell/issues/9992).- The
gwandgradlewcompletions are loaded properly now (#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, like 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 😭 Like, the license info was present in the source distribution, but it wasn't present in the documentation. That's been corrected now (
#10162,https://github.com/fish-shell/fish-shell/issues/10162). - The CMake configure step will now also look for
libterminfoas an alternative name forlibtinfo, 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 🫶 Like, it's fully handled now.
🌸 FISH 3.6.3 (RELEASED DECEMBER 4, 2023) 🌸
This release contains a fix for a test suite failure in fish 3.6.2.
💀 FISH 3.6.2 (RELEASED DECEMBER 4, 2023) 💀
This release of fish contains a security fix for CVE-2023-49284, a minor security problem identified in fish 3.6.1 and previous versions (thought to affect all released versions of fish). Yeah. Listen up 🙈
fish uses certain Unicode non-characters internally for marking wildcards and expansions. It incorrectly allowed these markers to be read on command substitution output, rather than transforming them into a safe internal representation.
For example, echo \UFDD2HOME has the same output as echo $HOME.
While this may cause unexpected behavior with direct input, this may become a minor security problem if the output is being fed from an external program into a command substitution where this output may not be expected. So like, take it seriously, bestie 💅
🌸 FISH 3.6.1 (RELEASED MARCH 25, 2023) 🌸
okay bestie, so this release of fish contains a number of fixes for problems identified in fish 3.6.1, as well as some enhancements. (yes, the manpage literally says that — we're just vibing with it 💅)
✨ Notable improvements and fixes ✨
abbr --erasenow also erases the universal variables used by the oldabbrfunction. 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>). no cap, this is the spring cleaning your config deserved 🧹
abbr --add --universalnow warns about--universalbeing non-functional, to make it easier to detect old-styleabbrcalls (#9475 <https://github.com/fish-shell/fish-shell/issues/9475>). it's giving "hey girl, that flag isn't doing anything" and honestly? thank you for the heads up 🫶
💀 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>). it wasn't working, so it's gone. respect the closure. ✌️
🎀 Scripting improvements 🎀
abbr --listno longer escapes the abbr name, which is necessary to be able to pass it toabbr --erase(#9470 <https://github.com/fish-shell/fish-shell/issues/9470>). the pipeline glows up, the pipeline slays ✨readwill now print an error if told to set a read-only variable, instead of silently doing nothing (#9346 <https://github.com/fish-shell/fish-shell/issues/9346>). silence was NOT golden here, we needed feedback 😭set_color -vno longer crashes fish (#9640 <https://github.com/fish-shell/fish-shell/issues/9640>). bestie the shell stays alive 💅
🦋 Interactive improvements 🦋
- Using
fish_vi_key_bindingsin combination with fish's--no-configmode works without locking up the shell (#9443 <https://github.com/fish-shell/fish-shell/issues/9443>). no more frozen-forever aesthetic 🧊 - The history pager now uses more screen space, usually half the screen (#9458 <https://github.com/fish-shell/fish-shell/issues/9458>). bigger pager, bigger vibes 🌈
- Variables that were set while the locale was
C(the default ASCII-only locale) will now properly be encoded if the locale is switched (#2613 <https://github.com/fish-shell/fish-shell/issues/2613>, #9473 <https://github.com/fish-shell/fish-shell/issues/9473>). your variables get their glow-up when the locale catches up 💖 - Escape during history search restores the original command line again (fixing a regression in 3.6.0). the undo button for your search era, iconic 👑
- Using
--helpon builtins now respects the$MANPAGERvariable, in preference to$PAGER(#9488 <https://github.com/fish-shell/fish-shell/issues/9488>). yes,$MANPAGERgets priority, it's main character energy 🎀 - ctrl+g closes the history pager, like other shells (#9484 <https://github.com/fish-shell/fish-shell/issues/9484>). a little cross-shell solidarity moment 🫶
- The documentation for the
:,[and.builtin commands can now be looked up withman(#9552 <https://github.com/fish-shell/fish-shell/issues/9552>). the tiny punctuation gworls finally get their own pages 🙈 - fish no longer crashes when searching history for non-ASCII codepoints case-insensitively (#9628 <https://github.com/fish-shell/fish-shell/issues/9628>). unicode girlies, we are so back 🌸
- The alt+s binding will now also use
pleaseif available (#9635 <https://github.com/fish-shell/fish-shell/issues/9635>). polite little sudo, love that for us 💅 - Themes that don't specify every color option can be installed correctly in the Web-based configuration (#9590 <https://github.com/fish-shell/fish-shell/issues/9590>). partial palettes are valid, no gatekeeping 🌈
- Compatibility with Midnight Commander's prompt integration has been improved (#9540 <https://github.com/fish-shell/fish-shell/issues/9540>). the classic apps deserve love too 💜
- 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>). she's quiet now, we love a calm queen 🤫
- Using
readinfish_greetingor similar functions will not trigger an infinite loop (#9564 <https://github.com/fish-shell/fish-shell/issues/9564>). we do NOT do infinity loops here, that's a different genre of bug 💀 - 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>). glow-ups for the ancients 🏺
🔥 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>). stash counting stays on its own track, minding its business ✨
🌟 Completions 🌟
- Added completions for:
apkanalyzer(#9558 <https://github.com/fish-shell/fish-shell/issues/9558>)neovim(#9543 <https://github.com/fish-shell/fish-shell/issues/9543>)otoolpre-commit(#9521 <https://github.com/fish-shell/fish-shell/issues/9521>)proxychains(#9486 <https://github.com/fish-shell/fish-shell/issues/9486>)scrypt(#9583 <https://github.com/fish-shell/fish-shell/issues/9583>)stow(#9571 <https://github.com/fish-shell/fish-shell/issues/9571>)trashand helper utilitiestrash-empty,trash-list,trash-put,trash-restore(#9560 <https://github.com/fish-shell/fish-shell/issues/9560>)ssh-copy-id(#9675 <https://github.com/fish-shell/fish-shell/issues/9675>)
- Improvements to many completions, including the speed of completing directories in WSL 2 (#9574 <https://github.com/fish-shell/fish-shell/issues/9574>). faster dir completion, we're obsessed ⚡
- Completions using
__fish_complete_suffixare now offered in the correct order, fixing a regression in 3.6.0 (#8924 <https://github.com/fish-shell/fish-shell/issues/8924>). order matters, bestie 🎀 - git completions for
git-foo-style commands was restored, fixing a regression in 3.6.0 (#9457 <https://github.com/fish-shell/fish-shell/issues/9457>). she's back from her little break 💅 - File completion now offers
../and./again, fixing a regression in 3.6.0 (#9477 <https://github.com/fish-shell/fish-shell/issues/9477>). we missed you, dots 🌸 - The behaviour of completions using
__fish_complete_pathmatches standard path completions (#9285 <https://github.com/fish-shell/fish-shell/issues/9285>). consistency is so attractive, ngl
💜 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>). cygwin girlies, this one's for you 🫶
👑 FISH 3.6.0 (RELEASED JANUARY 7, 2023) 👑
✨ Notable improvements and fixes ✨
- By default, ctrl+r now opens the command history in the pager (#602 <https://github.com/fish-shell/fish-shell/issues/602>). This is fully searchable and syntax-highlighted, as an alternative to the incremental search seen in other shells. The new special input function
history-pagerhas been added for custom bindings. honestly? the pager is a whole aesthetic and it ATE 💅 - 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.
pathgained a newmtimesubcommand 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
stringgained a newshortensubcommand to shorten strings to a given visible width (#9156 <https://github.com/fish-shell/fish-shell/issues/9156>):
> string shorten --max 10 "Hello this is a long string"
Hello thi…
she said "you're doing great but we gotta trim you" 😭✂️
test(aka[) gained-ot(older than) and-nt(newer than) operators to compare file modification times, and-efto compare whether the arguments are the same file (#3589 <https://github.com/fish-shell/fish-shell/issues/3589>). file age comparisons, we love a timestamp queen 💖- 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
^~^
the squiggle is highkey the prettiest way to be told you're wrong 🌀
- 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>). a "what did you customize" receipts page, we stan 📋 set --erasecan now be used with multiple scopes at once, likeset -efglU foo(#7711 <https://github.com/fish-shell/fish-shell/issues/7711>, #9280 <https://github.com/fish-shell/fish-shell/issues/9280>). one erase, many scopes, maximum efficiency ✨statusgained 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>). peek at your own command line while it's running, nosy but make it useful 👀
💀 Deprecations and removed features 💀
- The
\xand\Xescape syntax is now equivalent.\xABpreviously behaved the same as\XAB, except that it would error if the value "AB" was larger than "7f" (127 in decimal, the highest ASCII value) (#9247 <https://github.com/fish-shell/fish-shell/issues/9247>, #9245 <https://github.com/fish-shell/fish-shell/issues/9245>, #1352 <https://github.com/fish-shell/fish-shell/issues/1352>). they're twins now, no more weird errors 💅 - The
fish_git_promptwill now only turn on features if the appropriate variable has been set to a true value (of "1", "yes" or "true") instead of just checking if it is defined. This allows specifically turning features off without having to erase variables, such as via universal variables. If you have defined a variable to a different value and expect it to count as true, you need to change it (#9274 <https://github.com/fish-shell/fish-shell/issues/9274>). For example,set -g __fish_git_prompt_show_informative_status 0previously would have enabled informative status (because any value would have done so), but now it turns it off.
⚠️ real talk: "defined" no longer means "on". if you've been setting these to some random non-true value and expecting it to work, you gotta go fix that, bestie. no cap.
- Abbreviations are no longer stored in universal variables. Existing universal abbreviations are still imported, but new abbreviations should be added to
config.fish. the old ones get grandfathered in, the new ones live in your config file 🏡 - The short option
-rfor abbreviations has changed fromrenametoregex, for consistency withstring. same letter, new meaning, so double-check your muscle memory 🙈
✨ SCRIPTING IMPROVEMENTS ✨
argparsecan now be used without any option specifications!! — this is so you can use--min-args/--max-args, or write commands that take no options rn but might in the future 👀 (#9006).
function my_copy
argparse --min-args 2 -- $argv
or return
cp $argv
end
set --shownow tells you when a variable was inherited from fish's parent process — debugging queen behavior, honestly (#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 gets restored to the default when
fish_read_limitis unset — like, back to factory settings bestie (#9129). mathnow errors out on division-by-zero, and some errors get augmented with their extent too (#9190). This does change behavior in a few limited situations, for example:
math min 1 / 0, 5
Which used to print 5 (because in floating point division 1 / 0 gives you infinity, and 5 is smaller than infinity 🌈) — but now it just returns an error. no cap.
fish_clipboard_copyandfish_clipboard_pastecan be used in pipes now (#9271) — pipes!! iconic:
git rev-list 3.5.1 | fish_clipboard_copy
fish_clipboard_paste | string join + | math
status fish-pathreturns a fully-normalised path — which is especially noticeable on NetBSD (#9085).
✨ INTERACTIVE IMPROVEMENTS ✨
- If fish can't find the terminal definition for
TERM, it now tries"xterm-256color"and"xterm"before"ansi"and"dumb". Since most terminal emulators people actually use are more or less xterm-compatible (and often straight up claim thexterm-256colorentry), this should usually get you a fully or almost fully usable terminal 🫶 (#9026). - New variable alert:
fish_cursor_selection_mode— it configures whether the command line selection includes the character under the cursor (inclusive) or not (exclusive). The new default is exclusive; runset fish_cursor_selection_mode inclusiveto get the old behavior back (#7762). - fish's completion pager now fills half the terminal on the first tab press instead of only 4 rows — so results are visible way more often and you save key presses, all without constantly snapping fish to the top of the terminal 💅 (
#9105,#2698). - The
complete-and-searchbinding (shift-tab by default) now selects the first item in the results immediately (#9080). slay. bindoutput is now syntax-highlighted when you use it interactively ✨.- alt-h (the default
__fish_man_pagebinding) does a better job of showing the manual page of whatever command is under the cursor (#9020). - If
fish_color_valid_pathcontains an actual color instead of just modifiers, that color gets used for valid paths even when the underlying color isn't "normal" (#9159). - The key combo for the QUIT terminal sequence — often
ctrl-\(\x1c) — can now be used as a binding (#9234). - fish's vi mode uses normal xterm-style sequences to signal cursor change instead of iTerm's proprietary escape sequences. This gets you a blinking cursor and makes it work in complicated scenarios with nested terminals 🌀 (
#3741,#9172). - When you're running fish on a remote system (like inside SSH or a container),
ctrl-xnow copies to the local client system's clipboard if the terminal supports OSC 52. obsessed. commandlinegained two new options,--selection-startand--selection-end, to set the start/end of the current selection (#9197,#9215).- fish's builtins now handle keyboard interrupts (
ctrl-c) correctly (#9266) 🫡.
✨ COMPLETIONS ✨
- Added completions for:
arkasciinema(#9257)clojure(#9272)cshdirenv(#9268)dive(#9082)dolphindua(#9277)efivar(#9318)eges(#9388)firefox-developer-editionandfirefox(#9090)fortune(#9177)kbkind(#9110)konsolekshloadkeys(#9312)okularop(#9300)ouch(#9405)pixreadelf(#8746,#9386)qshellrcsad(#9145)tcshtoottox(#9078)wishxedxonsh(#9389)xplayerxreaderxvieweryash(#9391)zig(#9083)
- Tons of completion improvements, including making
cdcompletion much faster 🏎️ (#9220). - Tilde (
~) completion works properly now even when the file name contains an escaped character (#9073). - fish no longer loads completions if the command is used via a relative path and isn't in
PATH(#9133). - fish no longer completes inside of comments — respectful of your privacy fr (
#9320).
✨ IMPROVED TERMINAL SUPPORT ✨
- Opening help on WSL now uses PowerShell to open the browser if it's available, which removes some awkward UNC path errors (
#9119) 🪟.
✨ OTHER IMPROVEMENTS ✨
- The web-based configuration tool now works on systems with IPv6 disabled (
#3857). - Aliases can ignore arguments by ending them with
#(#9199). stringis now faster when reading large strings from stdin (#9139).string repeatuses less memory and is faster (#9124) 💨.- Builtins are much faster when writing to a pipe or file (
#9229). - Performance improvements to highlighting (
#9180) should make using fish more pleasant on slow systems 🌸. - On 32-bit systems, globs like
*will no longer fail to return some files, since large file support has been enabled. we love that for them.
✨ FIXED BUGS ✨
- The history search text for a token search is now highlighted correctly if the line contains multiple instances of that text (
#9066). process-exitandjob-exitevents are now generated for all background jobs, including those launched from event handlers (#9096).- Fixed a crash when completing a token that contained both a potential glob and a quoted variable expansion 💀 (
#9137). prompt_pwdno longer accidentally overwrites a global or universal$fish_prompt_pwd_full_dirswhen called with the-d/--full-length-dirsoption (#9123).- Fixed a bug that caused fish to freeze or exit after running a command that doesn't preserve the foreground process group (
#9181) 😭. - The "Disco" sample prompt no longer prints an error in some working directories (
#9164). If you saved this prompt, you should runfish_config prompt save discoagain 🕺. - fish launches external commands via the given path again, rather than always using an absolute path. This behavior was inadvertently changed in 3.5.0 and is visible, for example, when launching a bash script that checks
$0(#9143). printfno longer tries to interpret the first argument as an option (#9132).- Interactive
readin scripts will now have the correct keybindings again (#9227). - 💅 A possible stack overflow when recursively evaluating substitutions has been fixed (
#9302) — no more yeeting yourself into the void recursively, bestie. - 🩹 A crash with a relative
$CDPATHhas been fixed (#9407). - 🔢
printfnow properly fills extra%dspecifiers with0even on macOS and BSD (#9321). Zeroes where zeroes belong, no cap. - 🚪
fish_key_readernow correctly exits when receiving aSIGHUP(like after closing the terminal) (#9309). It used to just... linger. Not anymore, she leaves the party when the lights come on. - 🎨
fish_config theme savenow works as documented instead of erroring out (#9088,#9273). - 🍎 fish no longer triggers prompts to install command line tools when first run on macOS (
#9343). The popup era is over. - 🐢
fish_git_promptnow quietly fails on macOS if thexcruncache is not yet populated (#6625), working around a potential hang. Lowkey a lifesaver, that hang was giving infinite loading screen.
For distributors
- 📦 The vendored PCRE2 sources have been removed. It is recommended to declare PCRE2 as a dependency when packaging fish. If the CMake variable
FISH_USE_SYSTEM_PCRE2is false, fish will now download and build PCRE2 from the official repo (#8355,#8363). Note this variable defaults to true if PCRE2 is found installed on the system. So like... check your build config, king. 💖
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). Fancy cursor, ftw. - 🧮
printfreturns a better error when used with arguments interpreted as octal numbers (#9035). Better error = better vibes. - 🔒
history mergewhen in private mode is now an error, rather than wiping out other sessions' history (#9050). Not the history erasure arc, we're NOT doing that. - 🏗️ The error message when launching a command that is built for the wrong architecture on macOS is more helpful (
#9052). - ✨ Added completions for:
choose(#9065)expect(#9060)navi(#9064)qdbus(#9031)reflector(#9027)
- 🧚 Improvements to some completions. (Vague but iconic.)
This release also fixes a number of problems identified in fish 3.5.0.
- 🌿 Completing
git blameorgit -Cworks correctly (#9053). - ⌨️ On terminals that emit a CSI u sequence for shift-space, fish inserts a space instead of printing an error (
#9054). Bestie said " " and meant it. - 🗑️
status fish-pathon Linux-based platforms could print the path with a " (deleted)" suffix (such as/usr/bin/fish (deleted)), which is now removed (#9019). She is not deleted, thank you very much. - 🛑 Cancelling an initial command (from fish's
--init-commandoption) with Ctrl+C no longer prevents configuration scripts from running (#9024). - 📄 The job summary contained extra blank lines if the prompt used multiple lines, which is now fixed (
#9044). Tightened up. 🎀 - 💀 Using special input functions in bindings, in combination with
and/orconditionals, no longer crashes (#9051).
FISH 3.5.0 (RELEASED JUNE 16, 2022)
Notable improvements and fixes
- 🛤️ A new
pathbuiltin command to filter and transform paths (#7659,#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
Like, this is genuinely so clean?? Obsessed.
- 🌟 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,#8593). It finally gets what you meant. - 📡 Scripts can now catch and handle the
SIGINTandSIGTERMsignals, either viafunction --on-signalor withtrap(#6649). Signals said "handle me" and fish said "periodt".
Deprecations and removed features
- ⚠️ The
stderr-nocaretfeature 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,#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
Glow-up fr fr. 💅
- 🚩 The following feature flags have been enabled by default:
regex-easyesc, which makesstring replace -rnot 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 usestring replace -ra '([ab])' '\\\\$1' foobarinstead of needing 8 backslashes.
This only affects the replacement expression, not the match expression (the '([ab])' part in the example). A survey of plugins on GitHub did not turn up any affected code, so we do not expect this to affect many users.
This flag was introduced in fish 3.1.
ampersand-nobg-in-token, which means that&will not create a background job if it occurs in the middle of a word. For example,echo foo&barwill print "foo&bar" instead of runningecho fooin the background and then startingbaras a second job.
Reformatting with fish_indent would already introduce spaces, turning echo foo&bar into echo foo & bar.
This flag was introduced in fish 3.4.
To turn off these flags, add no-regex-easyesc or no-ampersand-nobg-in-token to fish_features and restart fish:
set -Ua fish_features no-regex-easyesc
Like stderr-nocaret, they will eventually be made read-only.
- 📝 Most
stringsubcommands no longer append a newline to their input if the input didn't have one (#8473,#3847). Respecting your input's boundaries, love that for her. - ⚡ fish's escape sequence removal (like for
string length --visibleor 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, allowingstring length --visibleto be much faster with unknown escape sequences. We don't expect anyone to have ever used fish with such a terminal (#8769). 1984 called, she's not coming back. 💀 - 🔄 Code to upgrade universal variables from fish before 3.0 has been removed. Users who upgrade directly from fish versions 2.7.1 or before will have to set their universal variables & abbreviations again (
#8781). Heads up: that's a manual re-entry situation, sorry bestie. - 🎨 The meaning of an empty color variable has changed (
#8793). Previously, when a variable was set but empty, it would be interpreted as the "normal" color. Now, empty color variables cause the same effect as unset variables — the general highlighting variable for that type is used instead. For example:
set -g fish_color_command blue
set -g fish_color_keyword
would previously make keywords "normal" (usually white in a dark terminal). Now it'll make them blue. To achieve the previous behavior, use the normal color explicitly: set -g fish_color_keyword normal.
This makes it easier to make self-contained color schemes that don't accidentally use color that was set before. fish_config has been adjusted to set known color variables that a theme doesn't explicitly set to empty. Themes staying in their own lane, as they should. 🌈
- 🔑
evalis now a reserved keyword, so it can't be used as a function name. This followssetandread, and is necessary because it can't be cleanly shadowed by a function — at the very leasteval set -l argv foobreaks. fish will ignore autoload files for it, so left overeval.fishfrom 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_showuntrackedfilesor 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). Speed slay. - 🔧 The
__terlar_git_promptfunction, used by the "Terlar" sample prompt, has been rebuilt as a configuration of the normalfish_git_promptto 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,#7918,#8979).
Scripting improvements
- 🧠 Quoted command substitution that directly follow a variable expansion (like
echo "$var$(echo x)") no longer affect the variable expansion (#8849). They stay in their own lane now. 🦋 - fish now correctly expands command substitutions that are preceded by an escaped dollar (like
echo \$(echo)). This regressed in version 3.4.0. 😤 mathcan 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'sminandmaxfunctions 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
readis now faster as the last process in a pipeline (#8552 <https://github.com/fish-shell/fish-shell/issues/8552>). ⚡string joingained a new--no-emptyflag to skip empty arguments (#8774 <https://github.com/fish-shell/fish-shell/issues/8774>, #8351 <https://github.com/fish-shell/fish-shell/issues/8351>).readnow only triggers thefish_readevent, not thefish_promptevent (#8797 <https://github.com/fish-shell/fish-shell/issues/8797>). It was supposed to work this way in fish 3.2.0 and later, but both events were emitted. 🙈- The TTY modes are no longer restored when non-interactive shells exit. This fixes wrong tty modes in pipelines with interactive commands. (#8705 <https://github.com/fish-shell/fish-shell/issues/8705>).
- Some functions shipped with fish printed error messages to standard output, but they now they rightly go to standard error (#8855 <https://github.com/fish-shell/fish-shell/issues/8855>).
jobsnow 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<#envvar-PATH> (#8804 <https://github.com/fish-shell/fish-shell/issues/8804>). bestie it's literally telling u "this exists but u can't run it" 💀 lessand other interactive commands would occasionally be stopped when run in a pipeline with fish functions; this has been fixed (#8699 <https://github.com/fish-shell/fish-shell/issues/8699>).- Case-changing autosuggestions generated mid-token now correctly append only the suffix, instead of duplicating the token (#8820 <https://github.com/fish-shell/fish-shell/issues/8820>). no more "CdCdCd" nonsense ✨
ulimitlearned a number of new options for the resource limits available on Linux, FreeBSD and 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
varedcommand can now successfully edit variables named "tmp" or "prompt" (#8836 <https://github.com/fish-shell/fish-shell/issues/8836>, #8837 <https://github.com/fish-shell/fish-shell/issues/8837>). ngl those names were lowkey cursed before 🫠 timenow emits an error if used after the first command in a pipeline (#8841 <https://github.com/fish-shell/fish-shell/issues/8841>).fish_add_pathnow prints a message for skipped non-existent paths when using the-vflag (#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>). the way that haunted me 😭
- 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-configwill now use the default keybindings (#8493 <https://github.com/fish-shell/fish-shell/issues/8493>) - When fish inherits a
USER<#envvar-USER> environment variable value that doesn't correspond to the current effective user ID, it will now correct it in all cases (#8879 <https://github.com/fish-shell/fish-shell/issues/8879>, #8583 <https://github.com/fish-shell/fish-shell/issues/8583>). she fact-checks u fr fr 🔍 - fish sets a new
EUID<#envvar-EUID> variable containing the current effective user id (#8866 <https://github.com/fish-shell/fish-shell/issues/8866>). new variable just dropped 👑 - 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
doasinstead ofsudoif necessary (#8942 <https://github.com/fish-shell/fish-shell/issues/8942>). - The
kill-whole-linespecial input function now kills the newline preceding the last line. This makesddin vi-mode clear the last line properly. - The new
kill-inner-linespecial input function kills the line without any newlines, allowingccin vi-mode to clear the line while preserving newlines (#8983 <https://github.com/fish-shell/fish-shell/issues/8983>). - On terminals that emit special sequences for these combinations, Shift+Space is bound like Space, and Ctrl+Enter is bound like Return (#8874 <https://github.com/fish-shell/fish-shell/issues/8874>).
🌸 Improved prompts 🌸
- A new Astronaut prompt (#8775 <https://github.com/fish-shell/fish-shell/issues/8775>), a multi-line prompt using plain text reminiscent of the Starship.rs prompt. it's giving minimal but make it cute 🚀
🦋 Completions 🦋
- Added completions for:
archlinux-java(#8911 <https://github.com/fish-shell/fish-shell/issues/8911>)apk(#8951 <https://github.com/fish-shell/fish-shell/issues/8951>)brightnessctl(#8758 <https://github.com/fish-shell/fish-shell/issues/8758>)efibootmgr(#9010 <https://github.com/fish-shell/fish-shell/issues/9010>)fastboot(#8904 <https://github.com/fish-shell/fish-shell/issues/8904>)optimus-manager(#8913 <https://github.com/fish-shell/fish-shell/issues/8913>)rclone(#8819 <https://github.com/fish-shell/fish-shell/issues/8819>)sops(#8821 <https://github.com/fish-shell/fish-shell/issues/8821>)tuned-adm(#8760 <https://github.com/fish-shell/fish-shell/issues/8760>)wg-quick(#8687 <https://github.com/fish-shell/fish-shell/issues/8687>)
completecan now be given multiple--conditionoptions. 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'scompletesystem 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>). efficiency slay ✨
🌈 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 🧚
libatomicis 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
libintlon macOS. This has been corrected (#5244 <https://github.com/fish-shell/fish-shell/issues/5244>). - The paths for completions, functions, and configuration snippets now include subdirectories
fish/vendor_completions.d,fish/vendor_functions.d, andfish/vendor_conf.d(respectively) withinXDG_DATA_HOME(or~/.local/shareif 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_titlefunction, has been fixed (#8778 <https://github.com/fish-shell/fish-shell/issues/8778>) - fish builds correctly on NetBSD (#8788 <https://github.com/fish-shell/fish-shell/issues/8788>) and OpenIndiana (#8780 <https://github.com/fish-shell/fish-shell/issues/8780>).
nextd-or-forward-word, bound to Alt+Right by default, was inadvertently changed to move likeforward-bigword. This has been corrected (#8790 <https://github.com/fish-shell/fish-shell/issues/8790>).funcsave -qandfuncsave --quietnow work correctly (#8830 <https://github.com/fish-shell/fish-shell/issues/8830>).- Issues with the
csharpandnmclicompletions 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
promptcommand in 3.3.0,fish_configgained athemesubcommand to show and pick from the sample themes (meaning color schemes) directly in the terminal, instead of having to open a Web browser. For examplefish_config theme choose Nordloads the Nord theme in the current session (#8132 <https://github.com/fish-shell/fish-shell/issues/8132>). The current theme can be saved withfish_config theme dump, and custom themes can be added by saving them in~/.config/fish/themes/. the way u can theme ur shell without opening a browser is so iconic 🎨 setandreadlearned a brand new--functionoption — it sets a variable in the function's top scope, which lowkey is the scoping everyone already expects. It also dodges the weirdness of--local, which is honestly block-scoped, not function-scoped (#565,https://github.com/fish-shell/fish-shell/issues/565, #8145,https://github.com/fish-shell/fish-shell/issues/8145):
function demonstration
if true
set --function foo bar
set --local baz banana
end
echo $foo # prints "bar" because $foo is still valid
echo $baz # prints nothing because $baz went out of scope
end
string padnow skips escape sequences — like the colors fish knows about — and there's a shiny new--visibleflag forstring lengththat makes it measure that same visible width. So if you need to know how many terminal cells an already-colored string eats up (prompts, looking at you 👀), this is it (#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
- Globbing got faster — especially on systems using glibc. In some cases (big directories stuffed with files whose names have lots of numbers in them) it almost halves the time it takes to expand a glob. We love to see it ✨
- Autosuggestions can be turned off now by setting
$fish_autosuggestion_enabledto0, and basically all highlighting can be turned off by picking the new"None"theme. The exception? Necessary colors — like the ones that distinguish autosuggestions from the actual command line, because those are doing important work (#8376,https://github.com/fish-shell/fish-shell/issues/8376). fish_git_promptgot a security glow-up — the function (it ships in the default prompts) now overridesgitso it won't run commands set by per-repository configuration. That avoids a potential security issue in some circumstances, and it's been assigned CVE-2022-20001 (#8589,https://github.com/fish-shell/fish-shell/issues/8589).
💅 Deprecations and removed features 💅
- New feature flag:
ampersand-nobg-in-token— it makes&only act as a background operator when it's followed by a separator. Paired withqmark-noglob, this means you can type most URLs at the command line without quoting or escaping, which is genuinely a lifestyle upgrade (#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
Friendly reminder that feature flags can be set on startup with fish --features ampersand-nobg-in-token,qmark-noglob, or via a universal variable called fish_features:
> set -Ua fish_features ampersand-nobg-in-token
$statusis now forbidden as a command — this stops that extremely common new-user oopsie of runningif $status(#8171,https://github.com/fish-shell/fish-shell/issues/8171). Important: this applies only to$status— other variables are still allowed to be commands. 🫶set --querynow exits with status255if you give it no variable names. Which meansif set -q $foowill not enter the if-block when$foois empty or unset. Wanna restore the old behavior? Useif not set -q foo; or set -q $foo— though ngl that's unlikely to be what you actually want (#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).- Three special input functions now exist as built-ins:
delete-or-exit,nextd-or-forward-wordandprevd-or-backward-wordreplace 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 collectsupports a new--allow-emptyoption — it outputs one empty argument in a command substitution that has no output (#8054,https://github.com/fish-shell/fish-shell/issues/8054). That makes stuff liketest -n (echo -n | string collect --allow-empty)work more reliably. Hot tip: this can also be written astest -n "$(echo -n)"(see above, bestie).string matchgained--groups-only— it only outputs capturing groups, skipping the full match. Sostring matchcan do simple transformations now (#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_pathsis automatically deduplicated now — it fixes that classic user error of appending to it inconfig.fishwhen it's universal (#8117,https://github.com/fish-shell/fish-shell/issues/8117).fish_add_pathremains the recommended way to add to$PATH. 👑returncan now be used outside functions — in scripts it does the exact same thing asexit, and in interactive mode it sets$statuswithout exiting (#8148,https://github.com/fish-shell/fish-shell/issues/8148).- An oversight was preventing all syntax checks from running on commands given to
fish -c(#8171,https://github.com/fish-shell/fish-shell/issues/8171). That includes checks likeexecnot being allowed in a pipeline, and$$not being a valid variable. Usually another error got generated anyway, but still. fish_indentnow correctly reformats tokens that end with a backslash followed by a newline (#8197,https://github.com/fish-shell/fish-shell/issues/8197).commandlinegained--is-valid— it checks whether the command line is syntactically valid and complete, enabling a basic implementation of transient prompts (#8142,https://github.com/fish-shell/fish-shell/issues/8142).commandlinealso gained--paging-full-mode— it checks whether the pager is showing all the possible lines (like, no "7 more rows" message) (#8485,https://github.com/fish-shell/fish-shell/issues/8485).- List expansion now correctly reports an error when used with all zero indexes (#8213,
https://github.com/fish-shell/fish-shell/issues/8213). - Running fish with a directory instead of a script as an argument (e.g.
fish .) no longer leads to an infinite loop — it errors out immediately instead (#8258,https://github.com/fish-shell/fish-shell/issues/8258). The way that's giving "we fixed an oopsie that could've eaten your whole afternoon" 💀 - Some post-fork error messages got bespoke rewrites — stuff like "text file busy" has been replaced with fish-specific messages (like "File is currently open for writing"). This also restores error messages on 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
realpathbuiltin now also squashes leading slashes when you use the--no-symlinksoption (#8281,https://github.com/fish-shell/fish-shell/issues/8281). cd-ing to a dangling (broken) symbolic link now prints an error noting the target is a broken link (#8264,https://github.com/fish-shell/fish-shell/issues/8264).- On MacOS terminals without permission to access a folder,
cdused to print a spurious "rotten symlink" error — corrected to "permission denied" (#8264,https://github.com/fish-shell/fish-shell/issues/8264). - Since fish 3.0,
forloops would trigger a variable handler function before the loop was entered — but the variable hadn't actually changed or been set, so it was a spurious event. Removed (#8384,https://github.com/fish-shell/fish-shell/issues/8384). mathnow correctly prints negative values and values larger than 231** when in hex or octal bases (#8417,https://github.com/fish-shell/fish-shell/issues/8417).dirsalways exits with status 0 now — instead of sometimes returning 1 (#8211,https://github.com/fish-shell/fish-shell/issues/8211).cd ""no longer crashes fish (#8147,https://github.com/fish-shell/fish-shell/issues/8147). Bestie. It used to crash. Over an empty string. 😭set --querycan now query whether a variable is a path variable via--pathor--unpath(#8494,https://github.com/fish-shell/fish-shell/issues/8494).- Tilde characters (
~) produced by custom completions are no longer escaped when applied to the command line, which makes it way easier to use the output of a recursivecomplete -Cin completion scripts (#4570,https://github.com/fish-shell/fish-shell/issues/4570). set --showreports when a variable is read-only (#8179,https://github.com/fish-shell/fish-shell/issues/8179).- Erasing
$fish_emoji_widthresets fish to the default guessed emoji width (#8274,https://github.com/fish-shell/fish-shell/issues/8274). 🦋 - The
lafunction no longer lists entries for.and..— matching other systems' defaults (#8519,https://github.com/fish-shell/fish-shell/issues/8519). abbr -qreturns the correct exit status when you hand it multiple abbreviation names as arguments (#8431,https://github.com/fish-shell/fish-shell/issues/8431).command -vexits with status127instead of1if no command was found (#8547,https://github.com/fish-shell/fish-shell/issues/8547).argparsewith--ignore-unknownno longer breaks when there are multiple unknown options in a short option group (#8637,https://github.com/fish-shell/fish-shell/issues/8637).- Comments inside command substitutions or brackets now correctly ignore parentheses, quotes, and brackets (#7866,
https://github.com/fish-shell/fish-shell/issues/7866, #8022,https://github.com/fish-shell/fish-shell/issues/8022, #8695,https://github.com/fish-shell/fish-shell/issues/8695). complete -Csupports a new--escapeoption — it turns on escaping in the returned completion strings (#3469,https://github.com/fish-shell/fish-shell/issues/3469).- Invalid byte or unicode escapes like
\Utestor\xNotHexare now a tokenizer error instead of quietly 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). funcedwill try to edit the whole file containing a function definition, if there is one (#391,https://github.com/fish-shell/fish-shell/issues/391).- Running a command line that’s literally just spaces now deletes an ephemeral history item again — yep, the kind that starts with a space (
#8232—https://github.com/fish-shell/fish-shell/issues/8232). 💅 - Command substitutions no longer respect job control; they run inside fish’s own process group instead (
#8172—https://github.com/fish-shell/fish-shell/issues/8172). This matches other shells way more closely and makes Ctrl+C reliability inside a command substitution actually good. ✨ historyand__fish_print_helpnow properly supportlessbefore version530, including the version that ships with macOS (#8157—https://github.com/fish-shell/fish-shell/issues/8157). 🍓helpnow knows which section is in which document again (#8245—https://github.com/fish-shell/fish-shell/issues/8245). She remembered the assignment, periodt. 📚- fish’s highlighter will now color options — the ones 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 existing setups literally don’t change (#8292—https://github.com/fish-shell/fish-shell/issues/8292). 🎀 - When executing a command, abbreviations are no longer expanded when the cursor is separated from the command by spaces, which makes it easier to suppress abbreviation expansion of commands without arguments (
#8423—https://github.com/fish-shell/fish-shell/issues/8423). The vibes are controlled now. 🦋 fish_key_reader’s output got simplified. By default it now only prints abindstatement. The previous per-character timing information can be seen with a new--verboseswitch (#8467—https://github.com/fish-shell/fish-shell/issues/8467). Iconic cleanup behavior. ✨- Custom completions are now also loaded for commands that contain tildes or variables like
~/bin/fishor$PWD/fish(#8442—https://github.com/fish-shell/fish-shell/issues/8442). Your weird little paths are seen and loved. 💖 - 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). No more pager eating your multi-line masterpiece. 😭 - When redrawing a multiline prompt, the old prompt is now properly cleared (
#8163—https://github.com/fish-shell/fish-shell/issues/8163). Ghost prompt? Gone. 👻 - 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). The last word stays main character. 👑 - Propagation of universal variables from a fish process that is closing is faster (
#8209—https://github.com/fish-shell/fish-shell/issues/8209). Speedy exit slay. 🔥 - The command line is drawn in the correct place if the prompt ends with a newline (
#8298—https://github.com/fish-shell/fish-shell/issues/8298). Prompt newline respect era. 🌸 historylearned a new subcommand,clear-session, to erase all history from the current session (#5791—https://github.com/fish-shell/fish-shell/issues/5791). Clean slate, bestie. 🧚- Pressing Ctrl+C in
fish_key_readerwill no longer print the incorrect"Press [ctrl-C] again to exit"message (#8510—https://github.com/fish-shell/fish-shell/issues/8510). No more lying to us. 💀 - 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). Convenient? Obsessed. 🫶 - When looking for locale information, the Debian configuration is now used when available (
#8557—https://github.com/fish-shell/fish-shell/issues/8557). Locale detective behavior. 🔍 - Pasting text containing quotes from the clipboard trims spaces more appropriately (
#8550—https://github.com/fish-shell/fish-shell/issues/8550). Clipboard paste said “I know what I’m doing.” 💅 - The clipboard bindings ignore X-based clipboard programs if the
DISPLAYenvironment variable is not set, which helps prefer the Windows clipboard when it is available (such as on WSL). That’s a smart little platform glow-up. 🌈 funcsavewill remove a saved copy of a function that has been erased withfunctions --erase. So yes, the saved copy gets the memo too. 🎀- The Web-based configuration tool gained a number of improvements, including the ability to set pager colors. Customizing the pager? We love to see it. ✨
- The default
fish_titleprints a shorter title with shortened$PWDand no more redundant"fish"(#8641—https://github.com/fish-shell/fish-shell/issues/8641). Shorter title, cleaner life. 💖 - Holding down an arrow key won’t freeze the terminal with long periods of flashing (
#8610—https://github.com/fish-shell/fish-shell/issues/8610). The terminal stays chill. 🦋 - Multi-char bindings are no longer interrupted if a signal handler enqueues an event (
#8628—https://github.com/fish-shell/fish-shell/issues/8628). Bindings stay unbothered. 👑
✨ New or improved bindings ✨
escapecan now be bound without breaking arrow key bindings (#8428—https://github.com/fish-shell/fish-shell/issues/8428). Bindescapeand keep your arrows? We love compatible behavior. 💅- The
alt-hbinding (to open a command’s manual page) now also ignorescommand(#8447—https://github.com/fish-shell/fish-shell/issues/8447). Socommand whateverstill gets its manual-page moment. 📖
🎀 Improved prompts 🎀
- The
fish_status_to_signalhelper function returns the correct signal names for the current platform, rather than Linux (#8530—https://github.com/fish-shell/fish-shell/issues/8530). Platform-correct signal names, as she should. 🌸 - The
prompt_pwdhelper function learned a--full-length-dirs Noption to keep the lastNdirectory components unshortened. In addition, the number of characters to shorten each component to can now be given as-d Nor--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/issues/8434)asd(#8759—https://github.com/fish-shell/fish-shell/issues/8759)az(#8141—https://github.com/fish-shell/fish-shell/issues/8141)black(#8123—https://github.com/fish-shell/fish-shell/issues/8123)clasp(#8373—https://github.com/fish-shell/fish-shell/issues/8373)cpupower(#8302—https://github.com/fish-shell/fish-shell/issues/8302)dart(#8315—https://github.com/fish-shell/fish-shell/issues/8315)dscacheutilelvish(#8416—https://github.com/fish-shell/fish-shell/issues/8416)ethtool(#8283—https://github.com/fish-shell/fish-shell/issues/8283)exif(#8246—https://github.com/fish-shell/fish-shell/issues/8246)findstr(#8481—https://github.com/fish-shell/fish-shell/issues/8481)git-sizer(#8156—https://github.com/fish-shell/fish-shell/issues/8156)gnome-extensions(#8732—https://github.com/fish-shell/fish-shell/issues/8732)gping(#8181—https://github.com/fish-shell/fish-shell/issues/8181)isatty(#8609—https://github.com/fish-shell/fish-shell/issues/8609)istioctl(#8343—https://github.com/fish-shell/fish-shell/issues/8343)kmutilkubectl(#8734—https://github.com/fish-shell/fish-shell/issues/8734)matlab(#8505—https://github.com/fish-shell/fish-shell/issues/8505)mono(#8415—https://github.com/fish-shell/fish-shell/issues/8415) and related toolscsharp,gacutil,gendarme,ikdasm,ilasm,mkbundle,monodis,monop,sqlsharpandxsp(#8452—https://github.com/fish-shell/fish-shell/issues/8452)- Angular’s
ng(#8111—https://github.com/fish-shell/fish-shell/issues/8111) nodeenv(#8533—https://github.com/fish-shell/fish-shell/issues/8533)octave(#8505—https://github.com/fish-shell/fish-shell/issues/8505)pabcnet_clear(#8421—https://github.com/fish-shell/fish-shell/issues/8421)qmk(#8180—https://github.com/fish-shell/fish-shell/issues/8180)rakudo(#8113—https://github.com/fish-shell/fish-shell/issues/8113)rc-status(#8757—https://github.com/fish-shell/fish-shell/issues/8757)roswell(#8330—https://github.com/fish-shell/fish-shell/issues/8330)sbcl(#8330—https://github.com/fish-shell/fish-shell/issues/8330)starship(#8520—https://github.com/fish-shell/fish-shell/issues/8520)topgrade(#8651—https://github.com/fish-shell/fish-shell/issues/8651)wine,winebootandwinemaker(#8411—https://github.com/fish-shell/fish-shell/issues/8411)- Windows Subsystem for Linux (WSL)’s
wslpath(#8364—https://github.com/fish-shell/fish-shell/issues/8364) - Windows’
color(#8483—https://github.com/fish-shell/fish-shell/issues/8483),attrib,attributes,choice,clean,cleanmgr,cmd,cmdkey,comp,forfiles,powershell,reg,schtasks,setx(#8486—https://github.com/fish-shell/fish-shell/issues/8486) zef(#8114—https://github.com/fish-shell/fish-shell/issues/8114)
- Apple’s
- Improvements to many completions, especially for git aliases (
#8129—https://github.com/fish-shell/fish-shell/issues/8129), subcommands (#8134—https://github.com/fish-shell/fish-shell/issues/8134) and submodules (#8716—https://github.com/fish-shell/fish-shell/issues/8716). Git completion ate. 💅 - Many adjustments to complete correct options for system utilities on BSD and macOS. Correct options only, bestie. 🎀
- When evaluating custom completions, the command line state no longer includes variable overrides (
var=val). This unbreaks completions that readcommandline -op. That one’s for the completion girlies. 🫶
🌈 Improved terminal support 🌈
- Dynamic terminal titles are enabled on WezTerm (
#8121—https://github.com/fish-shell/fish-shell/issues/8121). Title updates? Slay. ✨ - Directory history navigation works out of the box with Apple Terminal’s default key settings (
#2330—https://github.com/fish-shell/fish-shell/issues/2330). No extra setup arc required. 🍓 - fish now assumes Unicode 9+ widths for emoji under iTerm 2 (
#8200—https://github.com/fish-shell/fish-shell/issues/8200). Emoji width behavior, understood. 😭 - Skin-tone emoji modifiers (
U+1F3FBthroughU+1F3FF) are now measured as width0(#8275—https://github.com/fish-shell/fish-shell/issues/8275). They’re modifiers, not extra columns. 💅 - fish’s escape sequence removal now also knows Tmux’s wrapped escapes. Tmux escape respect era. 🌀
- Vi mode cursors are enabled in Apple Terminal.app (
#8167—https://github.com/fish-shell/fish-shell/issues/8167). Cursor behavior said vi mode. 👑 - Vi cursor shaping and
$PWDreporting is now also enabled onfoot(#8422—https://github.com/fish-shell/fish-shell/issues/8422). Foot got the memo too. 🦋 lswill use colors also on newer versions of Apple Terminal.app (#8309—https://github.com/fish-shell/fish-shell/issues/8309). Colorfullsstays colorful. 🌈- The
deleteandshift-tabkeys work more reliably underst(#8352—https://github.com/fish-shell/fish-shell/issues/8352,#8354—https://github.com/fish-shell/fish-shell/issues/8354). Reliable keys, as they should be. 💖
🛠️ Other improvements
- fish's test suite now uses
ctestand has become much faster to run. You can also run just one specific test now — targets are namedtest_$filename, somake test_set.fishonly runs theset.fishtest. Obsessed. (#7851) - The HTML version of the docs now has copy buttons for code examples, so you can steal snippets with one click (#8218).
- The HTML docs and the web-based configuration tool now pick more modern system fonts instead of falling back to Arial and something like Courier New most of the time. Your eyes will thank you (#8632).
- The Debian & Ubuntu package linked from fishshell.com is now a single package, rather than split into
fishandfish-common(#7845). - The macOS installer does not assert that Rosetta is required to install fish on machines with Apple Silicon (#8566). Goodbye pointless warning, we did not miss you.
- The macOS installer now cleans up previous
.pkginstallations when upgrading (#2963). Tidy queen behavior fr.
📦 For distributors
- The minimum version of CMake required to build fish is now
3.5.0. - The CMake installation supports absolute paths for
CMAKE_INSTALL_DATADIR(#8150). - Building using NetBSD curses works on any platform (#8087). Cross-platform slay.
- The build system now uses the default linker instead of forcing use of the
goldorlldlinker (#8152).
🐟 FISH 3.3.1 (RELEASED JULY 6, 2021)
This release of fish fixes the following problems identified in fish 3.3.0:
- The prompt and command line are redrawn correctly in response to universal variable changes (#8088). No more ghost text, we stan a clean repaint ✨
- A superfluous error that was produced when setting the
PATHorCDPATHenvironment variables to include colon-delimited components that do not exist was removed (#8095). The drama is gone. - The Vi mode indicator in the prompt is repainted correctly after ctrl-c cancels the current command (#8103).
- fish builds correctly on platforms that do not have a
spawn.hheader, such as old versions of OS X (#8097).
A number of improvements to the documentation, and fixes for completions, are included as well.
If you are upgrading from version 3.2.2 or before, please also review the release notes for 3.3.0 (included below). Do not skip, bestie, there's lore you need.
🌸 FISH 3.3.0 (RELEASED JUNE 28, 2021)
✨ Notable improvements and fixes
fish_configgained apromptsubcommand to show and pick from the sample prompts directly in the terminal, instead of having to open a webbrowser. For examplefish_config prompt choose defaultloads the default prompt in the current session (#7958). No browser, no problem 💅- The documentation has been reorganized to be easier to understand (#7773). It's giving clarity.
🗑️ Deprecations and removed features
- The
$fish_historyvalue"default"is no longer special. It used to be treated the same as"fish"(#7650). - Redirection to standard error with the
^character has been disabled by default. It can be turned back on using thestderr-nocaretfeature flag, but will eventually be disabled completely (#7105). So don't get too attached, okay? - Specifying an initial tab to
fish_confignow only works withfish_config browse(egfish_config browse variables), otherwise it would interfere with the newpromptsubcommand (see below) (#7958).
🧠 Scripting improvements
mathgained new functionslog2(like the documentation claimed),maxandmin(#7856). Also:mathfunctions can be used without the parentheses (egmath sin 2 + 6), and functions have the lowest precedence in the order of operations (#7877). It's giving math class but make it cute.- Shebang (
#!) lines are no longer required within shell scripts, improving support for scripts with concatenated binary contents. If a file fails to execute and passes a (rudimentary) binary safety check, fish will re-invoke it using/bin/sh(#7802). Wait that's actually so convenient. - Exit codes are better aligned with bash. A failed execution now reports
$statusof127if the file is not found, and126if it is not executable. Same numbers, same energy 🫶 echono longer writes its output one byte at a time, improving performance and allowing use with Linux's special API files (/proc,/sysand such) (#7836). One byte at a time was lowkey a crime.- fish should now better handle
cdon filesystems with brokenstat(3)responses (#7577). - Builtins now properly report a
$statusof1upon unsuccessful writes (#7857). string matchwith unmatched capture groups and without the--allflag now sets an empty variable instead of a variable containing the empty string. It also correctly imports the first match if multiple arguments are provided, matching the documentation (#7938). Subtle but iconic.- fish produces more specific errors when a command in a command substitution wasn't found or is not allowed. This now prints something like
"Unknown command"instead of"Unknown error while evaluating command substitution"(#respect). fish_indentallows inline variable assignments (FOO=BAR command) to use line continuation, instead of joining them into one line (#7955).- fish gained a
--no-configoption to disable configuration files. This applies to user-specific and the systemwideconfig.fish(typically in/etc/fish/config.fish), and configuration snippets (typically inconf.ddirectories). It also disables universal variables, history, and loading of functions from system or user configuration directories (#7921, #1256). Clean slate mode, no cap. - When universal variables are unavailable for some reason, setting a universal variable now sets a global variable instead (#7921). Graceful degradation, we love to see it.
$last_pidnow contains the process ID of the last process in the pipeline, allowing it to be used in scripts (#5036, #5832, #7721). Previously, this value contained the process group ID, but in scripts this was the same as the running fish's process ID. Big glow-up for scripts everywhere.process-exitevent handlers now receive the same value as$statusin all cases, instead of receiving-1when the exit was due to a signal.process-exitevent handlers for PID 0 also receivedJOB_EXITevents; this has been fixed. Rude little bug, gone.job-exitevent 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
setno longer works (these variables could not be used in expansions anyway). Honestly? Fair. fish_add_pathhandles an undefinedPATHenvironment variable correctly (#8082).
💅 Interactive improvements
- Commands entered before the previous command finishes will now be properly syntax highlighted. No more sad unhighlighted text 🎀
- fish now automatically creates
config.fishand the configuration directories in$XDG_CONFIG_HOME/fish(by default~/.config/fish) if they do not already exist (#7402). It's proactive, we love that for us. $SHLVLis no longer incremented in non-interactive shells. This means it won't be set to values larger than1just because your environment happens to run some scripts in$SHELLin its startup path (#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). Thank you, my ears 😭
fish --helpis more helpful if the documentation isn't installed (#7824).funcedwon't include an entry on where a function is defined, thanks to the newfunctions --no-detailsoption (#7879).- A new variable,
fish_killring, containing entries from the killring, is now available (#7445). Killring girlies rise 🧚 fish --privateprints a note on private mode on startup even if$fish_greetingis an empty list (#7974).- fish no longer attempts to lock history or universal variable files on remote filesystems, including NFS and Samba mounts. In rare cases, updates to these files may be dropped if separate fish instances modify them simultaneously (#7968). (Yes, that's the tradeoff — noted, not sorry.)
waitandon-process-exitwork correctly with jobs that have already exited (#7210).__fish_print_help(used for--helpoutput for fish's builtins) now respects theLESSenvironment variable, and if not set, uses better default pager settings (#7997).- Errors from
aliasare now printed to standard error, matching other builtins and functions (#7925). lsoutput is colorized on OpenBSD ifcolorlsutility is installed (#8035). Aesthetic win 🌈- The default pager color looks way better in terminals with light backgrounds now (#3412 <https://github.com/fish-shell/fish-shell/issues/3412>) — no more squinting, bestie 💖
- Even more robustness improvements landed for the bash history import (#7874 <https://github.com/fish-shell/fish-shell/issues/7874>). It just keeps getting sturdier.
- If fish starts up with zero locale info, it now tries to find a Unicode-aware locale for encoding (
LC_CTYPE), which makes emoji and other non-ASCII text display properly on misconfigured systems (#8031 <https://github.com/fish-shell/fish-shell/issues/8031>) ✨ If you actually want a C locale, set the variablefish_allow_singlebyte_localeto1. - The web-based configuration and documentation now have a dark mode if the browser requests it (#8043 <https://github.com/fish-shell/fish-shell/issues/8043>) — your eyes are safe, iconique 🎀
- Color variables can now also be given like
--background redand-b red, not just--background=red(#8053 <https://github.com/fish-shell/fish-shell/issues/8053>). Space girlies stay winning. exitrun insidefish_promptnow actually exits properly (#8033 <https://github.com/fish-shell/fish-shell/issues/8033>) — no cap, it used to just vibe there.- When you try to execute the unsupported POSIX-style brace command group (
{ ... }), fish will suggest its equivalentbegin; ...; endcommands (#6415 <https://github.com/fish-shell/fish-shell/issues/6415>). It's literally helping you help yourself 🫶
💅 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
uis bound toundoinstead ofhistory-search-backward, following GNU readline's behavior. Similarly,ctrl-ris bound toredoinstead ofhistory-search-backward, following Vim (#7908 <https://github.com/fish-shell/fish-shell/issues/7908>). sin Vi visual mode now does the same thing asc(#8039 <https://github.com/fish-shell/fish-shell/issues/8039>).- The binding for
",*,ynow usesfish_clipboard_copy, so it can support more than justxsel. - The
ctrl-spacebinding can be correctly customised now (#7922 <https://github.com/fish-shell/fish-shell/issues/7922>). exitworks correctly in bindings (#7967 <https://github.com/fish-shell/fish-shell/issues/7967>).- The
f1binding — the one that opens the manual page for the current command — now works around a bug in certainlessversions that fail to clear the screen (#7863 <https://github.com/fish-shell/fish-shell/issues/7863>). - The binding for
alt-snow toggles whethersudois prepended, even when it took the commandline from history instead of only adding it. Toggle queen 👑 - The new functions
fish_commandline_prependandfish_commandline_appendlet you toggle the presence of a prefix/suffix on the current commandline (#7905 <https://github.com/fish-shell/fish-shell/issues/7905>). backward-kill-path-component(Ctrl+W) no longer erases parts of two tokens when the cursor is positioned immediately after/(#6258 <https://github.com/fish-shell/fish-shell/issues/6258>).
🦋 Improved prompts
- The default Vi mode prompt now uses foreground instead of background colors, making it less obtrusive (#7880 <https://github.com/fish-shell/fish-shell/issues/7880>).
- Performance of the "informative" git prompt is improved somewhat (#7871 <https://github.com/fish-shell/fish-shell/issues/7871>). It's still slower than the non-informative version by its very nature — like, by design. In particular it is IO-bound, so it will be very slow on slow disks or network mounts 💀
- The sample prompts got updated. Some duplicated prompts — like the various classic variants — and 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 — nothing gets yanked out from under you, promise 🫶
- A new
prompt_loginhelper 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 andterlarprompts (#7932 <https://github.com/fish-shell/fish-shell/issues/7932>). - The web-based configuration's prompt picker now shows and installs
rightprompts (#7930 <https://github.com/fish-shell/fish-shell/issues/7930>). - The git prompt now has the same symbol order in normal and "informative" mode, and it's customizable via
$__fish_git_prompt_status_order(#7926 <https://github.com/fish-shell/fish-shell/issues/7926>).
🌈 Completions
- Added completions for:
firewall-cmd(#7900 <https://github.com/fish-shell/fish-shell/issues/7900>)sv(#8069 <https://github.com/fish-shell/fish-shell/issues/8069>)
- Improvements to plenty of completions! So many. Obsessed.
- Commands that wrap
cd(usingcomplete --wraps cd) get the same completions ascd(#4693 <https://github.com/fish-shell/fish-shell/issues/4693>). - The
--force-filesoption tocompleteworks for bare arguments now, not just options (#7920 <https://github.com/fish-shell/fish-shell/issues/7920>). - Completion descriptions for functions don't include the function definition anymore, making them more concise (#7911 <https://github.com/fish-shell/fish-shell/issues/7911>).
- The
killcompletions no longer error on MSYS2 (#8046 <https://github.com/fish-shell/fish-shell/issues/8046>). - Completion scripts are now loaded when calling a command via a relative path (like
./git) (#6001 <https://github.com/fish-shell/fish-shell/issues/6001>, #7992 <https://github.com/fish-shell/fish-shell/issues/7992>). - When there are multiple completion candidates, fish inserts their shared prefix. That prefix was computed in a case-insensitive way, which resulted in wrong case in the completion pager. 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, which prevents an erroneous
⏎from appearing if the terminal is resized at the wrong time — a thing that 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 get chopped off in certain terminals (#8002 <https://github.com/fish-shell/fish-shell/issues/8002>).
- fish's reflow handling has been disabled by default for
kitty(#7961 <https://github.com/fish-shell/fish-shell/issues/7961>). - The default prompt no longer produces errors when used with a dumb terminal (#7904 <https://github.com/fish-shell/fish-shell/issues/7904>).
- Terminal size variables are updated for window size change signal handlers (
SIGWINCH). - Pasting within a multi-line command using a terminal that supports bracketed paste works correctly, instead of producing an error (#7782 <https://github.com/fish-shell/fish-shell/issues/7782>).
set_colorproduces an error when used with invalid arguments, rather than empty output which interacts badly with Cartesian product expansion.
🎀 For distributors
- fish runs correctly on platforms without the
O_CLOEXECflag foropen(2)(#8023 <https://github.com/fish-shell/fish-shell/issues/8023>).
🌸 FISH 3.2.2 (RELEASED APRIL 7, 2021) 🌸
This release of fish fixes a number of additional issues identified in the fish 3.2 series — a little cleanup pass, and it ate:
- The command-not-found handler used suggestions from
pacmanon Arch Linux, but this caused major slowdowns on some systems, so it has been disabled (#7841 <https://github.com/fish-shell/fish-shell/issues/7841>). - fish will no longer hang on exit if another process is in the foreground on macOS (#7901 <https://github.com/fish-shell/fish-shell/issues/7901>).
- Certain programs (such as
lazygit) could create situations where fish would not receive keystrokes correctly, but it is now more robust in these situations (#7853 <https://github.com/fish-shell/fish-shell/issues/7853>). - Arguments longer than 1024 characters no longer trigger excessive CPU usage on macOS (#7837 <https://github.com/fish-shell/fish-shell/issues/7837>) 🔥
- fish builds correctly on macOS when using new versions of Xcode (#7838 <https://github.com/fish-shell/fish-shell/issues/7838>).
- Completions for
aura(#7865 <https://github.com/fish-shell/fish-shell/issues/7865>) andtshark(#7858 <https://github.com/fish-shell/fish-shell/issues/7858>) should no longer produce errors. - Background jobs no longer interfere with syntax highlighting — that was a regression introduced in fish 3.2.1, #7842 <https://github.com/fish-shell/fish-shell/issues/7842> 🙈
If you are upgrading from version 3.1.2 or before, please also review the release notes for 3.2.1 and 3.2.0 (included below).
💖 FISH 3.2.1 (RELEASED MARCH 18, 2021) 💖
okay so 3.2.1 is literally the "we fixed the things we broke in 3.2.0" release, and honestly? iconic of them to own it. bestie said bug report and then said fix. here's everything that got patched up 🩹✨
- Commands inside key bindings now run with fish's own 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 your terminal, especially when pasting (
#7770 <https://github.com/fish-shell/fish-shell/issues/7770>). no more mystery text spawning outta nowhere, slay 🙈 - Prompts that use the internal
__fish_print_pipestatusfunction will display correctly instead of dragging certain modifiers (like bold) further than they were ever meant to go (#7771 <https://github.com/fish-shell/fish-shell/issues/7771>). bold stays in its lane now 💅 - Redirections to internal file descriptors are allowed again, which reverses the changes in 3.2.0. This fixes a problem with Midnight Commander (
#7769 <https://github.com/fish-shell/fish-shell/issues/7769>). we love a reversal 🫶 - Universal variables should be fully reliable again regardless of operating system (
#7774 <https://github.com/fish-shell/fish-shell/issues/7774>). again being the key word, ngl. fish_git_promptno longer causes screen flickering in certain terminals (#7775 <https://github.com/fish-shell/fish-shell/issues/7775>). your eyes can rest now 😭fish_add_pathmanipulates thefish_user_pathsvariable correctly when moving multiple paths (#7776 <https://github.com/fish-shell/fish-shell/issues/7776>).- Pasting with a multi-line command no longer causes a
__fish_tokenizer_stateerror (#7782 <https://github.com/fish-shell/fish-shell/issues/7782>). paste with confidence bestie 🍓 psubinside event handlers cleans up temporary files properly (#7792 <https://github.com/fish-shell/fish-shell/issues/7792>). leaving no crumbs ✨- Event handlers declared with
--on-job-exit $fish_pidno longer run constantly (#7721 <https://github.com/fish-shell/fish-shell/issues/7721>), although heads up: these functions should use--on-event fish_exitinstead. like for real, that's the move 👀 - Changing terminal modes inside
config.fishworks (#7783 <https://github.com/fish-shell/fish-shell/issues/7783>). set_color --print-colorsno 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_founddirectly 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
typebuiltin now has the (deprecated)--quietlong form of-q(#7766 <https://github.com/fish-shell/fish-shell/issues/7766>). deprecated, so, yk, use it knowing ✋
it also includes some small enhancements, and by small i mean adorable:
helpandfish_configwork correctly when fish is running in a Chrome OS Crostini Linux VM (#7789 <https://github.com/fish-shell/fish-shell/issues/7789>). niche but we love her 🌈- The history file can be made a symbolic link without it being overwritten (
#7754 <https://github.com/fish-shell/fish-shell/issues/7754>), matching a similar improvement for the universal variable file in 3.2.0. consistency is the vibe 🔥 - An unhelpful error ("access: No error"), seen on Cygwin, is no longer produced (
#7785 <https://github.com/fish-shell/fish-shell/issues/7785>). "no error" as an error message was giving chaos, honestly 💀 - Improvements to the
rsynccompletions (#7763 <https://github.com/fish-shell/fish-shell/issues/7763>), some completion descriptions (#7788 <https://github.com/fish-shell/fish-shell/issues/7788>), and completions that use IP address (#7787 <https://github.com/fish-shell/fish-shell/issues/7787>). - Improvements to the appearance of
fish_config(#7811 <https://github.com/fish-shell/fish-shell/issues/7811>). glow-up 🎀
if you are upgrading from version 3.1.2 or before, please also review the release notes for 3.2.0 (included below). don't skip, bestie, it's literally right there 👇
🌸 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 default, undo is bound to Ctrl+Z, and redo to Alt+/. we're SO back 😭💖 - Builtins can now output before all data is read. For example,
string replaceno longer has to read all of stdin before it can begin to output. This makes it usable also for pipes where the previous command hasn't finished yet, like:
# Show all dmesg lines related to "usb"
dmesg -w | string match '*usb*'
- Prompts will now be truncated instead of replaced with
"> "if they are wider than the terminal (#904 <https://github.com/fish-shell/fish-shell/issues/904>). For example:
~/dev/build/fish-shell-git/src/fish-shell/build (makepkg)>
will turn into:
…h-shell/build (makepkg)>
It is still possible to react to the COLUMNS variable inside the prompt to implement smarter behavior. so you're not stuck, you just have options 💅
- 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>). one tab. ONE. 👑 - 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_pathhelper function to add paths to$PATHwithout producing duplicates, to be used interactively or inconfig.fish(#6960 <https://github.com/fish-shell/fish-shell/issues/6960>,#7028 <https://github.com/fish-shell/fish-shell/issues/7028>). For example:
fish_add_path /opt/mycoolthing/bin
will add /opt/mycoolthing/bin to the beginning of $fish_user_path without creating duplicates, so it can be called safely from config.fish or interactively, and the path will just be there, once. no dupes, no drama 🦋
- 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. finally an index that makes sense 😌
- 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. aesthetic upgrade, periodt ✨ fish --no-executewill no longer complain about unknown commands or non-matching wildcards, as these could be defined differently at runtime (especially for functions). This makes it usable as a static syntax checker (#977 <https://github.com/fish-shell/fish-shell/issues/977>). it's giving linter energy 🔍string match --regexnow integrates named PCRE2 capture groups as fish variables, allowing variables to be set directly fromstring match(#7459 <https://github.com/fish-shell/fish-shell/issues/7459>). To support this functionality,stringis now a reserved word and can no longer be wrapped in a function. so heads up — that's a real change, not a drill ⚠️- Globs and other expansions are limited to 512,288 results (
#7226 <https://github.com/fish-shell/fish-shell/issues/7226>). Because operating systems limit the number of arguments to commands, larger values are unlikely to work anyway, and this helps to avoid hangs. 512,288 is the magic number, don't ask 💀 - A new "fish for bash users" documentation page gives a quick overview of the scripting differences between bash and fish (
#2382 <https://github.com/fish-shell/fish-shell/issues/2382>), and the completion tutorial has also been moved out into its own document (#6709 <https://github.com/fish-shell/fish-shell/issues/6709>). reading material bestie, enjoy 📚
🦋 Syntax changes and new commands 🦋
- Range limits in index range expansions like
$x[$start..$end]may be omitted:$startand$enddefault to1and-1(the last item) respectively (#6574 <https://github.com/fish-shell/fish-shell/issues/6574>):
echo $var[1..]
echo $var[..-1]
echo $var[..]
All print the full list $var. lazy girl syntax and we ate 🔥
- When globbing, a segment which is exactly
**may now match zero directories. For example**/foomay matchfooin the current directory (#7222 <https://github.com/fish-shell/fish-shell/issues/7222>).
💜 Scripting improvements 💜
- The
type,_(gettext),.(source) and:(no-op) functions are now implemented builtins for performance purposes (#7342 <https://github.com/fish-shell/fish-shell/issues/7342>,#7036 <https://github.com/fish-shell/fish-shell/issues/7036>,#6854 <https://github.com/fish-shell/fish-shell/issues/6854>). zoom zoom ⚡ setand 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
statusare now only global in scope, soset -Uq statusreturns false (#7032 <https://github.com/fish-shell/fish-shell/issues/7032>). - The output for
set --showhas been shortened, only mentioning the scopes in which a variable exists (#6944 <https://github.com/fish-shell/fish-shell/issues/6944>). In addition, it now shows if a variable is a path variable. less yapping, more info 😌 - A new variable,
fish_kill_signal, is set to the signal that terminated the last foreground job, or0if 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>). padding era 🎀 string subhas a new--endoption to specify the end index of a substring (#6765 <https://github.com/fish-shell/fish-shell/issues/6765>,#5974 <https://github.com/fish-shell/fish-shell/issues/5974>).string splithas a new--fieldsoption to specify fields to output, similar tocut -f(#6770 <https://github.com/fish-shell/fish-shell/issues/6770>).string trimnow also trims vertical tabs by default (#6795 <https://github.com/fish-shell/fish-shell/issues/6795>).string replaceno 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>).stringsubcommands now quit early when used with--quiet(#7495 <https://github.com/fish-shell/fish-shell/issues/7495>). in and out, no lingering 💨string repeatnow handles multiple arguments, repeating each one (#5988 <https://github.com/fish-shell/fish-shell/issues/5988>).printfis so chill now — it no longer prints an error if you don't give it an argument (not even a format string). feed it nothing, it's fine 💅- The
trueandfalsebuiltins just straight-up ignore any arguments, like other shells do (#7030https://github.com/fish-shell/fish-shell/issues/7030). they're giving unbothered icons. fish_indentnow removes unnecessary quotes in simple cases (#6722https://github.com/fish-shell/fish-shell/issues/6722) and gained a--checkoption to just check if a file is indented correctly (#7251https://github.com/fish-shell/fish-shell/issues/7251). it's giving linter energy, we love to see it.fish_indentalso indents continuation lines that follow a line ending in\,|,&&or||. yes bestie it knows what you're doing ✨pushdonly adds a directory to the stack if changing to it was successful (#6947https://github.com/fish-shell/fish-shell/issues/6947). no more fake dirs in the stack, we said no cap.- A new
fish_job_summaryfunction is called whenever a background job stops or ends, or any job terminates from a signal (#6959https://github.com/fish-shell/fish-shell/issues/6959, #2727https://github.com/fish-shell/fish-shell/issues/2727, #4319https://github.com/fish-shell/fish-shell/issues/4319). the default behaviour can now be customized by redefining it — main character customization, honestly 🎀 statusgained newdirnameandbasenameconvenience 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))(#7076https://github.com/fish-shell/fish-shell/issues/7076, #1818https://github.com/fish-shell/fish-shell/issues/1818). literally the glow-up we needed 🌸- Broken pipelines are now handled more smoothly; in particular, bad redirection mid-pipeline results in the job continuing to run but with the broken file descriptor replaced with a closed file descriptor. this allows better error recovery and is more in line with other shells' behaviour (#7038
https://github.com/fish-shell/fish-shell/issues/7038). resilience era 💪 jobs --quiet PIDno longer prints "no suitable job" if the job for PID does not exist (eg because it has finished) (#6809https://github.com/fish-shell/fish-shell/issues/6809, #6812https://github.com/fish-shell/fish-shell/issues/6812). it simply ✨ does not ✨.jobsnow shows continued child processes correctly (#6818https://github.com/fish-shell/fish-shell/issues/6818). iconic behaviour, honestly.disownshould no longer create zombie processes when job control is off, such as inconfig.fish(#7183https://github.com/fish-shell/fish-shell/issues/7183). no more undead processes bestie, we're not doing a zombie apocalypse arc 🧟♀️💀- The
command,jobsandtypebuiltins support--queryas the long form of-q, matching other builtins. The long form--quietis deprecated (#7276https://github.com/fish-shell/fish-shell/issues/7276). so like, use--queryfrom now on, okurrr 🫶 argparseno longer requires a short flag letter for long-only options (#7585https://github.com/fish-shell/fish-shell/issues/7585) and only prints a backtrace with invalid options toargparseitself (#6703https://github.com/fish-shell/fish-shell/issues/6703). cleaner, quieter, better vibes.argparsenow passes the validation variables (e.g.$_flag_value) as local-exported variables, avoiding the need for--no-scope-shadowingin validation functions. big W for scope hygiene 🔥completetakes the first argument as the name of the command if the--command/-coption is not used, socomplete gitis treated likecomplete --command git, and it can show the loaded completions for specific commands withcomplete COMMANDNAME(#7321https://github.com/fish-shell/fish-shell/issues/7321). the way that just works now 😌set_color -b(without an argument) no longer prints an error message, matching other invalid invocations of this command (#7154https://github.com/fish-shell/fish-shell/issues/7154). silence is golden fr.execno longer produces a syntax error when the command cannot be found (#6098https://github.com/fish-shell/fish-shell/issues/6098). it just... doesn't do the thing. gracefully.set --eraseandabbr --erasecan now erase multiple things in one go, matchingfunctions --erase(#7377https://github.com/fish-shell/fish-shell/issues/7377). bulk delete slay 💅abbr --eraseno longer prints errors when used with no arguments or on an unset abbreviation (#7376https://github.com/fish-shell/fish-shell/issues/7376, #7732https://github.com/fish-shell/fish-shell/issues/7732). nothing to erase? nothing to say. periodt.test -t, for testing whether file descriptors are connected to a terminal, works for file descriptors0,1, and2(#4766https://github.com/fish-shell/fish-shell/issues/4766). It can still return incorrect results in other cases (#1228https://github.com/fish-shell/fish-shell/issues/1228) — so like, know the limits bestie, don't get too comfy 😭- Trying to execute scripts with Windows line endings (CRLF) produces a sensible error (#2783
https://github.com/fish-shell/fish-shell/issues/2783). no more cryptic nonsense, we get an actual explanation 🎀 - 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). specific error >>> mystery error, always. - 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). it was never recursion bestie, it was just self-love 💖
mathnow has a--baseoption to output the result in hexadecimal or octal (#7496https://github.com/fish-shell/fish-shell/issues/7496) and produces more specific error messages (#7508https://github.com/fish-shell/fish-shell/issues/7508). numbers, but make them mysterious and base-y ✨mathlearned bitwise functionsbitand,bitorandbitxor, used likemath "bitand(0xFE, 5)"(#7281https://github.com/fish-shell/fish-shell/issues/7281). bit math bestie, we're so back 🔥mathlearnedtaufor those who don't like typing"2 * pi". tau stans, this one's for you 🌈- Failed redirections will now set
$status(#7540https://github.com/fish-shell/fish-shell/issues/7540). finally, a status that tells the truth. - fish sets exit status in a more consistent manner after errors, including invalid expansions like
$foo[. consistent queen 👑 - Using
read --silentwhile fish is in private mode was adding these potentially-sensitive entries to the history; this has been fixed (#7230https://github.com/fish-shell/fish-shell/issues/7230). private mode actually being private? we love personal boundaries 🙈 readcan now read interactively from other files, and can be used to read from the terminal viaread </dev/tty(if the operating system provides/dev/tty) (#7358https://github.com/fish-shell/fish-shell/issues/7358). so many doors opening 🚪✨- A new
fish_status_to_signalfunction for transforming exit statuses to signal names has been added (#7597https://github.com/fish-shell/fish-shell/issues/7597, #7595https://github.com/fish-shell/fish-shell/issues/7595). translating numbers into feelings, iconic. - The fallback
realpathbuiltin supports the-s/--no-symlinksoption, like GNUrealpath(#7574https://github.com/fish-shell/fish-shell/issues/7574). no symlinks, no detours 💅 functionsandtypenow explain when a function was defined viasourceinstead of just sayingDefined in -. the dash was giving nothing honestly, thank u for the context 🫶- Significant performance improvements when globbing, appending to variables or in
math. faster is literally always the vibe ⚡🏎️ echono longer interprets options at the beginning of an argument (egecho "-n foo") (#7614https://github.com/fish-shell/fish-shell/issues/7614). it prints what you said. revolutionary.- fish now finds user configuration even if the
HOMEenvironment variable is not set (#7620https://github.com/fish-shell/fish-shell/issues/7620). it'll find you no matter what, obsessed 💜 - fish no longer crashes when started from a Windows-style working directory (eg
F:\path) (#7636https://github.com/fish-shell/fish-shell/issues/7636). no crashing bestie, we're too cute for that 💀 fish -cnow reads the remaining arguments into$argv(#2314https://github.com/fish-shell/fish-shell/issues/2314). argv girlies, your time has come.- The
pwdcommand supports the long options--logicaland--physical, matching other implementations (#6787https://github.com/fish-shell/fish-shell/issues/6787). long options for the long-option girlies. fish --profilenow only starts profiling after fish is ready to execute commands (all configuration is completed). There is a new--profile-startupoption that only profiles the startup and configuration process (#7648https://github.com/fish-shell/fish-shell/issues/7648). so you can profile the actual work vs the getting-ready montage 🎬- Builtins return a maximum exit status of
255, rather than potentially overflowing. In particular, this affectsexit,return,functions --query, andset --query(#7698https://github.com/fish-shell/fish-shell/issues/7698, #7702https://github.com/fish-shell/fish-shell/issues/7702). capped, contained, no overflow chaos. - It is no longer an error to run builtin with closed stdin. For example
count <&-now prints0, instead of failing. closed stdin is valid, we don't judge 🫶 - Blocks, functions, and builtins no longer permit redirecting to file descriptors other than
0(standard input),1(standard output) and2(standard error). For exampleecho hello >&5is now an error. This prevents corruption of internal state (#3303https://github.com/fish-shell/fish-shell/issues/3303).
ok so like. this one is the serious one bestie —>&5used to be allowed and now it is NOT, and the whole reason is that redirecting to random fds could corrupt fish's internal state. so if some old script of yours doesecho hello >&5, it's gonna error out now. not a bug, a boundary. periodt 🚧
✨ Interactive improvements ✨
- fish will now always attempt to become process group leader in interactive mode (#7060
https://github.com/fish-shell/fish-shell/issues/7060). This helps avoid hangs in certain circumstances, and allows tmux's current directory introspection to work (#5699https://github.com/fish-shell/fish-shell/issues/5699). main character energy in the process group, honestly 👑 - 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 shell finally caught up with itself 😭 - The prompt is reprinted after a background job exits (#1018
https://github.com/fish-shell/fish-shell/issues/1018). no more lost prompt, we stay oriented ✨ - fish no longer inserts a space after a completion ending in
.,,or-is accepted, improving completions for tools that provide dynamic completions (#6928https://github.com/fish-shell/fish-shell/issues/6928). tiny fix, huge vibe check ✅ - 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). second chances, we love those 🌸 help string match/replace/<subcommand>will show the help forstringsubcommands (#6786https://github.com/fish-shell/fish-shell/issues/6786). the docs are doc-ing 💅fish_key_readersets the exit status to0when used with--helpor--version(#6964https://github.com/fish-shell/fish-shell/issues/6964). asking for help is not a failure bestie 💖fish_key_readerandfish_indentsend output from--versionto standard output, matching other fish binaries (#6964https://github.com/fish-shell/fish-shell/issues/6964). consistency, we're obsessed.- A new variable
$status_generationis incremented only when the previous command produces an exit status (#6815https://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. detective mode: activated 🔍✨ fish_greetingis now a function that reads a variable of the same name, and it defaults to setting it globally. That means one less universal variable by default, and updating the greeting is way easier now. BUT — if you wanna disable the greeting, you now have to explicitly say universal scope (set -U fish_greeting) or turn it off inconfig.fish(#7265—https://github.com/fish-shell/fish-shell/issues/7265).- Events are properly emitted after a job is cancelled (
#2356—https://github.com/fish-shell/fish-shell/issues/2356). ✨ fish_preexecandfish_postexecevents are no longer triggered for empty commands (#4829—https://github.com/fish-shell/fish-shell/issues/4829,#7085—https://github.com/fish-shell/fish-shell/issues/7085).- Functions triggered by the
fish_exitevent are correctly run when the terminal is closed or the shell receivesSIGHUP(#7014—https://github.com/fish-shell/fish-shell/issues/7014). bye bestie, but like, cleanly 💅 - The
fish_promptevent no longer fires whenreadis used. If you need a function to run any timereadis invoked by a script, use the newfish_readevent instead (#7039—https://github.com/fish-shell/fish-shell/issues/7039). - A new
fish_posterrorevent 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). it's giving error-handling main character energy 😭 - The debugging system has now fully switched from the old numbered level to the new named category system introduced in 3.1. A bunch of new debugging categories got added, including
config,path,readerandscreen(#6511—https://github.com/fish-shell/fish-shell/issues/6511). See the output offish --print-debug-categoriesfor 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). little receipts on launch, love that for us 🎀 - The
-oshort option tofish, for--debug-output, works correctly instead of producing an invalid option error (#7254—https://github.com/fish-shell/fish-shell/issues/7254). short king finally behaving. - fish's debugging can now also be enabled via the
FISH_DEBUGandFISH_DEBUG_OUTPUTenvironment variables. This helps with debugging when no commandline options can be passed, like when fish is called in a shebang (#7359—https://github.com/fish-shell/fish-shell/issues/7359). no options? no problem bestie 🫶 - Abbreviations are now expanded after all command terminators (eg
;or|), not just space — same as fish 2.7.1 and before (#6970—https://github.com/fish-shell/fish-shell/issues/6970) — and also after closing a command substitution (#6658—https://github.com/fish-shell/fish-shell/issues/6658). she's back and she's better ✨ - The history file is now created with user-private permissions, matching other shells (
#6926—https://github.com/fish-shell/fish-shell/issues/6926). The directory containing the history file was already private, so there should not have been any private data revealed. ngl that's a relief 😮💨 - The output of
timeis 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). perfectly aligned, as she should be 💅 - 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_foundinstead of firing an event — way easier to replace and reason about. Previously-defined__fish_command_not_found_handlerfunctions with an appropriate event listener will still work (#7293—https://github.com/fish-shell/fish-shell/issues/7293). ctrl-chandling has been reimplemented in C++ and is therefore quicker (#5259—https://github.com/fish-shell/fish-shell/issues/5259), no longer occasionally prints an"unknown command"error (#7145—https://github.com/fish-shell/fish-shell/issues/7145), and doesn't overwrite multiline prompts anymore (#3537—https://github.com/fish-shell/fish-shell/issues/3537). interrupt her, she slays 🔥ctrl-cno longer kills background jobs for which job control is disabled, matching POSIX semantics (#6828—https://github.com/fish-shell/fish-shell/issues/6828,#6861—https://github.com/fish-shell/fish-shell/issues/6861).- Autosuggestions work properly after
ctrl-ccancels the current command line (#6937—https://github.com/fish-shell/fish-shell/issues/6937). the vibes recover instantly, iconic. - History search is now case-insensitive unless the search string contains an uppercase character (
#7273—https://github.com/fish-shell/fish-shell/issues/7273). fish_update_completionsgained a new--keepoption, 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). speedrun strats 🏃♀️- Aliases containing an embedded backslash appear properly in the output of
alias(#6910—https://github.com/fish-shell/fish-shell/issues/6910). openno longer hangs indefinitely on certain systems, as a bug inxdg-openhas been worked around (#7215—https://github.com/fish-shell/fish-shell/issues/7215). not her hanging around uninvited 💀- 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 -tworks like the long option--handlers-type, as documented, instead of producing an error (#6985—https://github.com/fish-shell/fish-shell/issues/6985). short option doing short option things, correctly this time.- History search now flashes when it found no more results (
#7362—https://github.com/fish-shell/fish-shell/issues/7362). visual feedback bestie, we love a little drama ⭐ - fish now creates the path in the environment variable
XDG_RUNTIME_DIRif it does not exist, before using it for runtime data storage (#7335—https://github.com/fish-shell/fish-shell/issues/7335). set_color --print-colorsnow also respects thebold,dim,underline,reverse,italicandbackgroundmodifiers, to better show their effect (#7314—https://github.com/fish-shell/fish-shell/issues/7314). showing off the whole wardrobe 🌈- 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 thehistoryvariable as it may be too large (one can use the History tab instead). It also starts the browser in another thread, avoiding hangs in some circumstances, especially with Firefox's Developer Edition (#7158—https://github.com/fish-shell/fish-shell/issues/7158). Finally, a bug in the Source Code Pro font may cause browsers to hang, so this font is no longer chosen by default (#7714—https://github.com/fish-shell/fish-shell/issues/7714). rip Source Code Pro, you had a good run 🫡 funcsavegained a new--directoryoption to specify the location of the saved function (#7041—https://github.com/fish-shell/fish-shell/issues/7041).helpworks properly on MSYS2 (#7113—https://github.com/fish-shell/fish-shell/issues/7113) and only usescmd.exeif running on WSL (#6797—https://github.com/fish-shell/fish-shell/issues/6797).- Resuming a piped job by its number, like
fg %1, works correctly (#7406—https://github.com/fish-shell/fish-shell/issues/7406). Resumed jobs show the correct title in the terminal emulator (#7444—https://github.com/fish-shell/fish-shell/issues/7444). name tag on point 🏷️ - Commands run from key bindings now use the same TTY modes as normal commands (
#7483—https://github.com/fish-shell/fish-shell/issues/7483). - Autosuggestions from history are now case-sensitive (
#3978—https://github.com/fish-shell/fish-shell/issues/3978). yes, she cares about case now 🙈 $statusfrom completion scripts is no longer passed outside the completion, which keeps the status display in the prompt as the last command's status (#7555—https://github.com/fish-shell/fish-shell/issues/7555). containment, finally 💅- Updated localisations for
pt_BR(#7480—https://github.com/fish-shell/fish-shell/issues/7480). 💖 fish_traceoutput now starts with->(likefish --profile), making the depth more visible (#7538—https://github.com/fish-shell/fish-shell/issues/7538). arrows!! so readable, obsessed.- 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). no more glitch era 😭 functionsproduces an error rather than crashing on certain invalid arguments (#7515—https://github.com/fish-shell/fish-shell/issues/7515). graceful queen.- A crash in completions with inline variable assignment (eg
A= b) has been fixed (#7344—https://github.com/fish-shell/fish-shell/issues/7344). fish_private_modemay now be changed dynamically usingset(#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). lowkey genius, iykyk.- 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). secret commands stay secret... until they don't 🕵️♀️ - Importing bash history or reporting errors with recursive globs (
**) no longer hangs (#7407—https://github.com/fish-shell/fish-shell/issues/7407,#7497—https://github.com/fish-shell/fish-shell/issues/7497). bindnow shows\x7ffor the del key instead of a literalDELcharacter (#7631—https://github.com/fish-shell/fish-shell/issues/7631). readable output, thank u ✨- Paths containing variables or tilde expansion are only suggested when they are still valid (
#7582—https://github.com/fish-shell/fish-shell/issues/7582). no stale suggestions in this house 💅 - Syntax highlighting can now color a command as invalid even if executed quickly (
#5912—https://github.com/fish-shell/fish-shell/issues/5912). she keeps up with your typing speed now 🌸 - Redirection targets are no longer highlighted as error if they contain variables which will likely be defined by the current commandline (
#6654—https://github.com/fish-shell/fish-shell/issues/6654). false alarm avoided 🫶 - 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). tough girl era 💪 - fish handles being in control of the TTY without owning its own process group way better now, which lowkey saves you from some hangs in special configurations (
#7388). 🫶 - Keywords can finally be colored differently — just set the
fish_color_keywordvariable (fish_color_commandis used as a fallback) (#7678). colorful keywords era 💅 - Just like
fish_indent, the interactive reader will indent continuation lines that follow a line ending in a backslash,|,&&or||(#7694). pretty multiline commands, we love to see it ✨ - Commands with a trailing escaped space are saved in history correctly now (
#7661). no more ghost spaces bestie 👻 fish_promptno longer mangles Unicode characters in the private-use rangeU+F600-U+F700. (#7723) she's respectful of your weird little glyphs now 🎀- The universal variable file,
fish_variables, can be made a symbolic link without it being overwritten (#7466). symlink girlies stay winning 🌸 - fish is now more resilient against
mktempfailing (#7482). she's got coping mechanisms now 😭
✨ New or improved bindings ✨
- As mentioned above, new special input functions
undo(ctrl+_ or ctrl+z) andredo(alt+/) can be used to revert changes to the command line or the pager search field (#6570). undo/redo ate and left no crumbs 🔥 - ctrl+z is now available for binding (
#7152). free real estate 🦋 - Additionally, using the
cancelspecial input function (bound to escape by default) right after fish picked an unambiguous completion will undo that (#7433). oops-proof 💖 fish_clipboard_paste(ctrl+v) trims indentation from multiline commands, because fish already indents (#7662). no double-indent jump scare 🙈- Vi mode bindings now support
dh,dl,c0,cf,ct,cF,cT,ch,cl,y0,ci,ca,yi,ya,di,da,d;,d,,o,Oand Control+left/right keys to navigate by word (#6648,#6755,#6769,#7442,#7516). vi girlies we are SO back 👑 - Vi mode bindings support
~(tilde) to toggle the case of the selected character (#6908). sHoUtY tExT unlocked ✨ - Functions
up-or-searchanddown-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. smooth moves only 🎀 - 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. no more accidental teleporting 😭
- The special input function
beginning-of-history(pageup) now moves to the oldest search instead of the youngest — that'send-of-history(pagedown). the lore is consistent now 🦋 - A new special input function
forward-single-charmoves one character to the right, and if an autosuggestion is available, only take a single character from it (#7217,#4984). baby steps, literally 💅 - Special input functions can now be joined with
oras a modifier (adding toand), though only some commands set an exit status (#7217). This includessuppress-autosuggestionto reflect whether an autosuggestion was suppressed (#1419). logic brain activated 🧚 - A new function
__fish_preview_current_file, bound to alt+o, opens the current file at the cursor in a pager (#6838,#6855). peek at the source, icon behavior 👑 edit_command_buffer(alt+e and alt+v) passes the cursor position to the external editor if the editor is recognized (#6138,#6954). your editor knows where you were, slay ✨__fish_prepend_sudo(alt+s) now toggles a sudo prefix (#7012) and avoids shifting the cursor (#6542). toggle it like a light switch 💅__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). she remembers for you 🫶__fish_toggle_comment_commandline(alt+#) now uncomments and presents the last comment from history if the commandline is empty (#7137). comment archaeology 🔍__fish_whatis_current_token(alt+w) prints descriptions for functions and builtins (#7191,#2083). context on demand, we stan 🌈- The definition of "word" and "bigword" for movements was refined, fixing (eg) vi mode's behavior with
eon the second-to-last char, and bigword's behavior with single-character words and non-blank non-graphical characters (#7353,#7354,#4025,#7328,#7325). the word lore got a patch note 📜 - 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. WSL besties getting their flowers 💐 - Using the
*-jumpspecial input functions before typing anything else no longer crashes fish. no more crash jumpscare 💀 - Completing variable overrides (
foo=bar) could replace the entire thing with just the completion in some circumstances. This has been fixed (#7398). fixed bestie, breathe 😮💨
💅 Improved prompts 💅
- The default and example prompts print the correct exit status for commands prefixed with
not(#6566). truthful status, periodt ✨ - git prompts include all untracked files in the repository, not just those in the current directory (
#6086). full picture energy 🦋 - The git prompts correctly show stash states (
#6876,#7136) and clean states (#7471). stash honesty is self-care 🎀 - 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_statuscan be set to enable more information. opt-in info dump, we love a considerate queen 👑 - The
fish_vcs_promptpasses its arguments to the various VCS prompts that it calls (#7033). sharing is caring 🫶 - The Subversion prompt was broken in a number of ways in 3.1.0 and has been restored (
#6715,#7278). welcome back, we missed you 💖 - A new helper function
fish_is_root_usersimplifies checking for superuser privilege (#7031,#7123). root check but make it cute 🧚 - New colorschemes — ayu Light, ayu Dark and ayu Mirage (
#7596). aesthetic upgrade incoming 🌈 - Bugs related to multiline prompts, including repainting (
#5860) or navigating directory history (#3550) leading to graphical glitches have been fixed. no more visual chaos, ngl 🙈 - The nim prompt now handles vi mode better (
#6802). nim girlies, this one's for you 💅
🌈 Improved terminal support 🌈
- A new variable,
fish_vi_force_cursor, can be set to forcefish_vi_cursorto attempt changing the cursor shape in vi mode, regardless of terminal (#6968). Thefish_vi_cursoroption--force-itermhas been deprecated. deprecated, bestie — don't use it for new stuff 💀 diffwill now colourize output, if supported (#7308). pretty diffs, we're obsessed 🍓- Autosuggestions appear when the cursor passes the right prompt (
#6948) or wraps to the next line (#7213). suggestions follow you around 🦋 - The cursor shape in Vi mode changes properly in Windows Terminal (
#6999,#6478). Windows Terminal finally cooperating 💅 - The spurious warning about terminal size in small terminals has been removed (
#6980). no more needless panic 🎀 - Dynamic titles are now enabled in Alacritty (
#7073) and emacs' vterm (#7122). title bar glow-up ✨ - Current working directory updates are enabled in foot (
#7099) and WezTerm (#7649). cwd tracking said hello 👋 - The width computation for certain emoji agrees better with terminals (especially flags) (
#7237). flag emoji finally getting the respect they deserve 🌈 - Long command lines are wrapped in all cases, instead of sometimes being put on a new line (
#5118). consistent wrapping, periodt 💅 - The pager is properly rendered with long command lines selected (
#2557). pager said "I got this" 🫶 - 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_reflowvariable (#7491). resize without the glitch arc 🎀 - fish now sets terminal modes sooner, which stops output from appearing before the greeting and prompt are ready (
#7489). no more premature output jump scare 😭 - Better detection of new Konsole versions for true color support and cursor shape changing. obsessed 💅
fishno longer attempts to modify the terminal size viaTIOCSWINSZ, improving compatibility with Kitty (#6994https://github.com/fish-shell/fish-shell/issues/6994). no cap, it just behaves nicer ✨
🎀 COMPLETIONS 🎀
- Added completions for:
7z,7zaand7zr(#7220https://github.com/fish-shell/fish-shell/issues/7220)alias(#7035https://github.com/fish-shell/fish-shell/issues/7035)alternatives(#7616https://github.com/fish-shell/fish-shell/issues/7616)apk(#7108https://github.com/fish-shell/fish-shell/issues/7108)asciidoctor(#7000https://github.com/fish-shell/fish-shell/issues/7000)avifdecandavifenc(#7674https://github.com/fish-shell/fish-shell/issues/7674)bluetoothctl(#7438https://github.com/fish-shell/fish-shell/issues/7438)cjxlanddjxl(#7673https://github.com/fish-shell/fish-shell/issues/7673)cmark(#7000https://github.com/fish-shell/fish-shell/issues/7000)create_ap(#7096https://github.com/fish-shell/fish-shell/issues/7096)deno(#7138https://github.com/fish-shell/fish-shell/issues/7138)dhclient(#6684https://github.com/fish-shell/fish-shell/issues/6684)- Postgres-related commands
dropdb,createdb,pg_restore,pg_dumpandpg_dumpall(#6620https://github.com/fish-shell/fish-shell/issues/6620) dotnet(#7558https://github.com/fish-shell/fish-shell/issues/7558)downgrade(#6751https://github.com/fish-shell/fish-shell/issues/6751)gapplication,gdbus,gioandgresource(#7300https://github.com/fish-shell/fish-shell/issues/7300)gh(#7112https://github.com/fish-shell/fish-shell/issues/7112)gitkgroups(#6889https://github.com/fish-shell/fish-shell/issues/6889)hashcat(#7746https://github.com/fish-shell/fish-shell/issues/7746)hikari(#7083https://github.com/fish-shell/fish-shell/issues/7083)icdiff(#7503https://github.com/fish-shell/fish-shell/issues/7503)imv(#6675https://github.com/fish-shell/fish-shell/issues/6675)john(#7746https://github.com/fish-shell/fish-shell/issues/7746)julia(#7468https://github.com/fish-shell/fish-shell/issues/7468)k3d(#7202https://github.com/fish-shell/fish-shell/issues/7202)ldapsearch(#7578https://github.com/fish-shell/fish-shell/issues/7578)lightdmanddm-tool(#7624https://github.com/fish-shell/fish-shell/issues/7624)losetup(#7621https://github.com/fish-shell/fish-shell/issues/7621)micro(#7339https://github.com/fish-shell/fish-shell/issues/7339)mpc(#7169https://github.com/fish-shell/fish-shell/issues/7169)- Metasploit's
msfconsole,msfdbandmsfvenom(#6930https://github.com/fish-shell/fish-shell/issues/6930) mtr(#7638https://github.com/fish-shell/fish-shell/issues/7638)mysql(#6819https://github.com/fish-shell/fish-shell/issues/6819)ncat,nc.openbsd,nc.traditionalandnmap(#6873https://github.com/fish-shell/fish-shell/issues/6873)openssl(#6845https://github.com/fish-shell/fish-shell/issues/6845)prime-run(#7241https://github.com/fish-shell/fish-shell/issues/7241)ps2pdf{12,13,14,wr}(#6673https://github.com/fish-shell/fish-shell/issues/6673)pyenv(#6551https://github.com/fish-shell/fish-shell/issues/6551)rst2html,rst2html4,rst2html5,rst2latex,rst2man,rst2odt,rst2pseudoxml,rst2s5,rst2xetex,rst2xmlandrstpep2html(#7019https://github.com/fish-shell/fish-shell/issues/7019)spago(#7381https://github.com/fish-shell/fish-shell/issues/7381)sphinx-apidoc,sphinx-autogen,sphinx-buildandsphinx-quickstart(#7000https://github.com/fish-shell/fish-shell/issues/7000)strace(#6656https://github.com/fish-shell/fish-shell/issues/6656)systemd'sbootctl,coredumpctl,hostnamectl(#7428https://github.com/fish-shell/fish-shell/issues/7428),homectl(#7435https://github.com/fish-shell/fish-shell/issues/7435),networkctl(#7668https://github.com/fish-shell/fish-shell/issues/7668) anduserdbctl(#7667https://github.com/fish-shell/fish-shell/issues/7667)tcpdump(#6690https://github.com/fish-shell/fish-shell/issues/6690)tigtracerouteandtracepath(#6803https://github.com/fish-shell/fish-shell/issues/6803)windscribe(#6788https://github.com/fish-shell/fish-shell/issues/6788)wireshark,tshark, anddumpcapxbps-*(#7239https://github.com/fish-shell/fish-shell/issues/7239)xxhsum,xxh32sum,xxh64sumandxxh128sum(#7103https://github.com/fish-shell/fish-shell/issues/7103)yadm(#7100https://github.com/fish-shell/fish-shell/issues/7100)zopfliandzopflipng(#6872https://github.com/fish-shell/fish-shell/issues/6872)
- Lots of improvements to completions, including:
gitcompletions can complete the right and left parts of a commit range likefrom..toorleft...right. the way that works is so satisfying 🦋- Completion scripts for custom Git subcommands like
git-xyzare now loaded with Git completions. The completions can now be defined directly on the subcommand (usingcomplete git-xyz), and completion forgit xyzwill work. (#7075https://github.com/fish-shell/fish-shell/issues/7075,#7652https://github.com/fish-shell/fish-shell/issues/7652,#4358https://github.com/fish-shell/fish-shell/issues/4358) makecompletions no longer second-guessmake's file detection, fixing target completion in some cases (#7535https://github.com/fish-shell/fish-shell/issues/7535). let make cook, okay? 👑- Command completions now correctly print the description even if the command was fully matched (like in
ls<TAB>). setcompletions no longer hide variables starting with__, they are sorted last instead. respectfully, they were being a little shy 🙈
- Improvements to the manual page completion generator (
#7086https://github.com/fish-shell/fish-shell/issues/7086,#6879https://github.com/fish-shell/fish-shell/issues/6879,#7187https://github.com/fish-shell/fish-shell/issues/7187). 🎀 - Significant performance improvements to completion of the available commands (
#7153https://github.com/fish-shell/fish-shell/issues/7153), especially on macOS Big Sur where there was a significant regression (#7365https://github.com/fish-shell/fish-shell/issues/7365,#7511https://github.com/fish-shell/fish-shell/issues/7511). we love a glow-up ✨ - Suffix completion using
__fish_complete_suffixuses the same fuzzy matching logic as normal file completion, and completes any file but sorts files with matching suffix first (#7040https://github.com/fish-shell/fish-shell/issues/7040,#7547https://github.com/fish-shell/fish-shell/issues/7547). Previously, it only completed files with matching suffix.
📦 FOR DISTRIBUTORS 📦
fishhas a new interactive test driver based onpexpect, removing the optional dependency onexpect(and adding an optional dependency onpexpect) (#5451https://github.com/fish-shell/fish-shell/issues/5451,#6825https://github.com/fish-shell/fish-shell/issues/6825). out with the old, in with the pexpect 💅- The
CHANGELOGwas moved to restructured text, allowing it to be included in the documentation (#7057https://github.com/fish-shell/fish-shell/issues/7057). 🎀 fishhandlesncursesinstalled in a non-standard prefix better (#6600https://github.com/fish-shell/fish-shell/issues/6600,#7219https://github.com/fish-shell/fish-shell/issues/7219), and uses variadictparmon NetBSD curses (#6626https://github.com/fish-shell/fish-shell/issues/6626). niche but iconic 🦋- The Web-based configuration tool no longer uses an obsolete Angular version (
#7147https://github.com/fish-shell/fish-shell/issues/7147). - The
fishproject has adopted the Contributor Covenant code of conduct (#7151https://github.com/fish-shell/fish-shell/issues/7151). good vibes only, officially 🫶
💀 DEPRECATIONS AND REMOVED FEATURES 💀
- The
fish_color_matchvariable is no longer used. (Previously this controlled the color of matching quotes and parens when usingread). rip to a real one 😭 fish 3.2.0will be the last release in which the redirection to standard error with the^character is enabled. Thestderr-nocaretfeature flag will be changed to"on"in future releases. heads up, bestie ⚠️stringis now a reserved word and cannot be used for function names (see above).fish_vi_cursor's option--force-itermhas been deprecated (see above).command,jobsandtypelong-form option--quietis deprecated in favor of--query(see above).- The
fish_command_not_foundevent 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 useemit fish_command_not_found. - The
fish_promptevent no longer fires whenreadis used. If you need a function to run any timereadis invoked by a script, use the newfish_readevent instead (#7039https://github.com/fish-shell/fish-shell/issues/7039). not me learning this the hard way 💀 - To disable the greeting message permanently it is no longer enough to just run
set fish_greetinginteractively as it is no longer implicitly a universal variable. Useset -U fish_greetingor disable it inconfig.fishwithset -g fish_greeting. no more ghost greeting, use the flags 🎀 - The long-deprecated and non-functional
-m/--read-modeoptions toreadwere removed in3.1b1. Using the short form, or a never-implemented-Boption, no longer crashesfish(#7659https://github.com/fish-shell/fish-shell/issues/7659). - With the addition of new categories for debug options, the old numbered debugging levels have been removed.
🛠️ FOR DISTRIBUTORS AND DEVELOPERS 🛠️
fishsource tarballs are now distributed using the XZ compression method (#5460https://github.com/fish-shell/fish-shell/issues/5460). smaller tarball, same slay ✨- The
fishsource tarball contains an example FreeDesktop entry and icon. 🎀 - The CMake variable
MAC_CODESIGN_IDcan now be set to"off"to disable code-signing (#6952https://github.com/fish-shell/fish-shell/issues/6952,#6792https://github.com/fish-shell/fish-shell/issues/6792). - Building on macOS earlier than
10.13.6succeeds, instead of failing on code-signing (#6791https://github.com/fish-shell/fish-shell/issues/6791). we love a build that just works 🫶 - The
pkg-configfile now uses variables so the paths it hands out are actually portable across prefixes. slay 💅 - The default values for
extra_completionsdir,extra_functionsdirandextra_confdirnow use the installation prefix instead of hardcoding/usr/local(#6778 ·https://github.com/fish-shell/fish-shell/issues/6778). no more assuming everyone lives in/usr/local, we love to see it 🫶 - New CMake variable alert 🚨:
FISH_USE_SYSTEM_PCRE2controls whether fish builds against the system-installed PCRE2 or the version it bundles. By default it prefers the system library if available, unless Mac codesigning is enabled (#6952 ·https://github.com/fish-shell/fish-shell/issues/6952). - Running the full interactive test suite now needs Python 3.5+ and the
pexpectpackage (#6825 ·https://github.com/fish-shell/fish-shell/issues/6825); theexpectpackage is no longer required. we love a glow-up ✨ - Support for Python 2 in fish's tools (
fish_configand the manual page completion generator) is no longer guaranteed. Please use Python 3.5 or later (#6537 ·https://github.com/fish-shell/fish-shell/issues/6537). it's 2020 bestie, Python 2 has left the chat 💀 - 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'sdistutilspackage (#7514 ·https://github.com/fish-shell/fish-shell/issues/7514). iconic behaviour honestly 👑 - Heads up forever: fish 3.2 is the last release to support Red Hat Enterprise Linux & CentOS version 6. this is your warning arc 🎀
🌸 FISH 3.1.2 (RELEASED APRIL 29, 2020) 🌸
This release of fish fixes one major issue that got discovered in fish 3.1.1:
- Commands like
fzfandenhancd, when used witheval, would hang 😭evalwas buffering output too aggressively, and that's been fixed (#6955 ·https://github.com/fish-shell/fish-shell/issues/6955).
If you're upgrading from version 3.0.0 or before, please also review the release notes for 3.1.1, 3.1.0 and 3.1b1 (they're included below, keep scrolling bestie 🫶).
🦋 FISH 3.1.1 (RELEASED APRIL 27, 2020) 🦋
This release of fish fixes a whole bunch of major issues discovered in fish 3.1.0. buckle up ✨
- Commands which involve
. ( ... | psub)now work correctly, because a bug in thefunction --on-job-exitoption has been fixed (#6613 ·https://github.com/fish-shell/fish-shell/issues/6613). - Conflicts between upstream packages for
ripgrepandbat, and the fish packages, have been resolved (#5822 ·https://github.com/fish-shell/fish-shell/issues/5822). no more fighting in the group chat 💅 - Starting fish in a directory without read access, like via
su, no longer crashes (#6597 ·https://github.com/fish-shell/fish-shell/issues/6597). - The glob ordering changes that were introduced in 3.1.0 have been reverted, returning the order of globs to the previous state (#6593 ·
https://github.com/fish-shell/fish-shell/issues/6593). we tried something, it didn't eat, we're moving on 🙈 - Redirections using the deprecated caret syntax to a file descriptor (eg
^&2) work correctly (#6591 ·https://github.com/fish-shell/fish-shell/issues/6591). deprecated but still functional, she's doing her best 💀 - Redirections that append to a file descriptor (eg
2>>&1) work correctly (#6614 ·https://github.com/fish-shell/fish-shell/issues/6614). - Building fish on macOS (#6602 ·
https://github.com/fish-shell/fish-shell/issues/6602) or with new versions of GCC (#6604 ·https://github.com/fish-shell/fish-shell/issues/6604, #6609 ·https://github.com/fish-shell/fish-shell/issues/6609) is now successful 🔥 timeis now correctly listed in the output ofbuiltin -n, andtime --helpworks 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-commandgives the expected output when used with an environment override — that is,F=B status current-commandreturnsstatusinstead ofF=B(#6635 ·https://github.com/fish-shell/fish-shell/issues/6635). the way it used to leak the override? embarrassing 😭testno longer crashes when used with "nan" or "inf" arguments, erroring out instead (#6655 ·https://github.com/fish-shell/fish-shell/issues/6655).- Copying from the end of the command line no longer crashes fish (#6680 ·
https://github.com/fish-shell/fish-shell/issues/6680). we simply cannot be crashing over a copy-paste bestie 😭 readno longer removes multiple separators when splitting a variable into a list, restoring the previous behaviour from fish 3.0 and before (#6650 ·https://github.com/fish-shell/fish-shell/issues/6650).- Functions using
--on-job-exitand--on-process-exitwork reliably again (#6679 ·https://github.com/fish-shell/fish-shell/issues/6679). - Functions using
--on-signal INTwork reliably in interactive sessions, as they did in fish 2.7 and before (#6649 ·https://github.com/fish-shell/fish-shell/issues/6649). Heads up though: these handlers have never worked in non-interactive sessions, and making them work is an ongoing process. not a fix, a WIP 🧚 - Functions using
--on-variablework reliably with variables which are set implicitly (rather than withset), such asfish_bind_modeandPWD(#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 (
$TERMbegins withxterm, does not include "256color", and$TERM_PROGRAMis not set) (#6701 ·https://github.com/fish-shell/fish-shell/issues/6701). the colour detection was lowkey lying to us 🌈 - The Mercurial (
hg) prompt no longer produces an error when the current working directory is removed (#6699 ·https://github.com/fish-shell/fish-shell/issues/6699). Also, for performance reasons it shows only basic information by default; to restore the detailed status, set$fish_prompt_hg_show_informative_status. - The VCS prompt,
fish_vcs_prompt, no longer displays Subversion (svn) status by default, due to the potential slowness of this operation (#6681 ·https://github.com/fish-shell/fish-shell/issues/6681). we're protecting your prompt's vibe check ⭐ - 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
CorPOSIXlocale) no longer renders all output blank (#6736 ·https://github.com/fish-shell/fish-shell/issues/6736). emoji breaking your entire terminal is not the slay we were going for 💀 helpprefers to usexdg-open, avoiding the use ofopenon Debian systems where this command is actuallyopenvt(#6739 ·https://github.com/fish-shell/fish-shell/issues/6739). sneaky name collision, we saw you 👀- 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. so don't get too attached 🎀 - 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). fzfin complex pipes no longer hangs. More generally, code run as part of command substitutions orevalwill no longer have separate process groups (#6624 ·https://github.com/fish-shell/fish-shell/issues/6624, #6806 ·https://github.com/fish-shell/fish-shell/issues/6806). this is the one, this is the hang fix 🔥
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're 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. so yeah, that's on us for not saying it louder 📢
🎀 FISH 3.1.0 (RELEASED FEBRUARY 12, 2020) 🎀
Compared to the beta release of fish 3.1b1, fish version 3.1.0:
- Fixes a regression where spaces after a brace were removed despite brace expansion not occurring (#6564 ·
https://github.com/fish-shell/fish-shell/issues/6564). - Fixes a number of problems in compiling and testing on Cygwin (#6549 ·
https://github.com/fish-shell/fish-shell/issues/6549) and Solaris-derived systems such as Illumos (#6553 ·https://github.com/fish-shell/fish-shell/issues/6553, #6554 ·https://github.com/fish-shell/fish-shell/issues/6554, #6555 ·https://github.com/fish-shell/fish-shell/issues/6555, #6556 ·https://github.com/fish-shell/fish-shell/issues/6556, and #6558 ·https://github.com/fish-shell/fish-shell/issues/6558). look at all those issue numbers, we were busy 🫠 - Fixes the process for building macOS packages.
- Fixes a regression where excessive error messages are printed if Unicode characters are emitted in non-Unicode-capable locales (#6584 ·
https://github.com/fish-shell/fish-shell/issues/6584). - Contains some improvements to the documentation and a small number of completions.
If you're 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
$pipestatusvariable 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). literally so useful, obsessed 💅 - fish no longer buffers pipes to the last function in a pipeline, improving many cases where pipes appeared to block or hang (#1396 ·
https://github.com/fish-shell/fish-shell/issues/1396). the hangs? gone. the vibe? immaculate ✨ - An overhaul of error messages for builtin commands, including a removal of the overwhelming usage summary, more readable stack traces (#3404 ·
https://github.com/fish-shell/fish-shell/issues/3404, #5434 ·https://github.com/fish-shell/fish-shell/issues/5434), and stack traces fortest(aka[) (#5771 ·https://github.com/fish-shell/fish-shell/issues/5771). your errors are now readable, you're welcome bestie 🫶 - fish's debugging arguments have been significantly improved. The
--debug-leveloption has been removed, and a new--debugoption replaces it. This option accepts various categories, which may be listed viafish --print-debug-categories(#5879 ·https://github.com/fish-shell/fish-shell/issues/5879). A new--debug-outputoption allows for redirection of debug output. debugging main character energy 🔍 stringhas a newcollectsubcommand 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). this one ate, no cap 👑- The fish manual, tutorial and FAQ are now available in man format as
fish-doc,fish-tutorialandfish-faqrespectively (#5521 · `https://github.com/fish-shell/fish-shell/issues/5521). read the docs in your terminal like a true terminal girlie 🎀 - Like every other shell,
cdnow always looks for its argument in the current directory as a last resort — even if theCDPATHvariable doesn't include it or doesn't include.(#4484 <https://github.com/fish-shell/fish-shell/issues/4484>). - fish now correctly handles
CDPATHentries that start with..(#6220 <https://github.com/fish-shell/fish-shell/issues/6220>) or that contain./(#5887 <https://github.com/fish-shell/fish-shell/issues/5887>). - The
fish_tracevariable can be set to trace execution (#3427 <https://github.com/fish-shell/fish-shell/issues/3427>) — it does basically the same job asset -xdoes in other shells. iykyk ✨ - fish uses the temporary directory that the system says to use, instead of just assuming
/tmpexists and vibing there (#3845 <https://github.com/fish-shell/fish-shell/issues/3845>). - The fish web configuration tool (
fish_config) now prints a list of the commands it's executing, which is so helpful for understanding what it's doing and debugging it (#5584 <https://github.com/fish-shell/fish-shell/issues/5584>). - Major performance glow-ups when pasting (#5866 <https://github.com/fish-shell/fish-shell/issues/5866>), when executing lots of commands (#5905 <https://github.com/fish-shell/fish-shell/issues/5905>), when 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>). she ate 💅
✨ Syntax changes and new commands ✨
- There's a brand-new builtin command,
time, which lets you time fish functions and builtins as well as external commands (#117 <https://github.com/fish-shell/fish-shell/issues/117>). iconic honestly. - Brace expansion now only happens if the braces actually include a
,or a variable expansion — which means common commands likegit reset HEAD@{0}don't need escaping anymore (#5869 <https://github.com/fish-shell/fish-shell/issues/5869>). no more crying over reflog syntax 😭 - New redirections
&>and&|can redirect or pipe stdout, and also redirect stderr to stdout (#6192 <https://github.com/fish-shell/fish-shell/issues/6192>). switchnow allows arguments that expand to nothing, like empty variables (#5677 <https://github.com/fish-shell/fish-shell/issues/5677>).- The
VAR=val cmdsyntax can now be used to run a command in a modified environment (#6287 <https://github.com/fish-shell/fish-shell/issues/6287>). periodt. andis no longer recognised as a command, so nonsensical constructs likeand and andnow produce a syntax error (#6089 <https://github.com/fish-shell/fish-shell/issues/6089>). good. we don't need that energy 💀math's exponent operator^used to be left-associative, but now it uses the way more common right-associative behaviour (#6280 <https://github.com/fish-shell/fish-shell/issues/6280>). Somath '3^0.5^2'used to be calculated as(30.5)2and now it's calculated as3(0.52). (the superscripts got a lil eaten in the manpage rendering but bestie you get it — grouping changed, be aware 🫶)- Back in fish 3.0, the variable used with
forloops inside command substitutions could leak into enclosing scopes. That was an accidental behaviour change, and it's been reverted (#6480 <https://github.com/fish-shell/fish-shell/issues/6480>).
🌸 Scripting improvements 🌸
string split0now returns0if it split something (#5701 <https://github.com/fish-shell/fish-shell/issues/5701>).- In the interest of consistency,
builtin -qandcommand -qcan now be used to query whether a builtin or command exists (#5631 <https://github.com/fish-shell/fish-shell/issues/5631>). mathnow accepts--scale=maxfor the maximum scale (#5579 <https://github.com/fish-shell/fish-shell/issues/5579>).builtin $varnow works correctly, so you can use a variable as the builtin name (#5639 <https://github.com/fish-shell/fish-shell/issues/5639>).cdunderstands the--argument, so you can finally change into directories that start with a hyphen (#6071 <https://github.com/fish-shell/fish-shell/issues/6071>). the way that was a whole problem before 😭complete --do-completenow does fuzzy matches too (#5467 <https://github.com/fish-shell/fish-shell/issues/5467>).complete --do-completecan be used inside completions, which allows limited recursion (#3474 <https://github.com/fish-shell/fish-shell/issues/3474>).countnow also counts lines fed on standard input (#5744 <https://github.com/fish-shell/fish-shell/issues/5744>).evalproduces an exit status of0when given no arguments, like other shells do (#5692 <https://github.com/fish-shell/fish-shell/issues/5692>).printfprints what it can when the input hasn't been fully converted to a number, but it still prints an error (#5532 <https://github.com/fish-shell/fish-shell/issues/5532>).complete -C foonow works as expected, instead of requiringcomplete -Cfoo.completehas a new--force-filesoption to re-enable file completions. This letssudo -Eandpacman -Qocomplete correctly (#5646 <https://github.com/fish-shell/fish-shell/issues/5646>).argparsenow defaults to showing the current function name (instead ofargparse) in its errors, which makes--namesuperfluous a lot of the time (#5835 <https://github.com/fish-shell/fish-shell/issues/5835>).argparsehas a new--ignore-unknownoption to keep unrecognized options, which lets multipleargparsepasses parse options (#5367 <https://github.com/fish-shell/fish-shell/issues/5367>).argparsecorrectly handles flag value validation for options that only have short names (#5864 <https://github.com/fish-shell/fish-shell/issues/5864>).read -S(the short option of--shell) is recognised correctly (#5660 <https://github.com/fish-shell/fish-shell/issues/5660>).readunderstands--list, which acts like--arrayin reading all arguments into a list inside a single variable, but is just better named (#5846 <https://github.com/fish-shell/fish-shell/issues/5846>).readhas a new option,--tokenize, which splits a string into variables according to the shell's tokenization rules — considering quoting, escaping, and so on (#3823 <https://github.com/fish-shell/fish-shell/issues/3823>). obsessed with her honestly.readinteracts more correctly with the deprecated$IFSvariable, in particular by removing multiple separators when splitting a variable into a list (#6406 <https://github.com/fish-shell/fish-shell/issues/6406>), matching other shells.fish_indentnow handles semicolons better, including leaving them in place for; andand; orinstead of breaking the line (#5859 <https://github.com/fish-shell/fish-shell/issues/5859>).fish_indent --writenow supports multiple file arguments, indenting them in turn.- The default
readlimit has been increased to 100MiB (#5267 <https://github.com/fish-shell/fish-shell/issues/5267>). mathnow also understandsxfor multiplication, provided it is followed by whitespace (#5906 <https://github.com/fish-shell/fish-shell/issues/5906>).mathreports the right error when incorrect syntax is used inside parentheses (#6063 <https://github.com/fish-shell/fish-shell/issues/6063>), and warns when unsupported logical operations are used (#6096 <https://github.com/fish-shell/fish-shell/issues/6096>).functions --erasenow also prevents fish from autoloading a function for the first time (#5951 <https://github.com/fish-shell/fish-shell/issues/5951>). 🎀jobs --lastreturns0to indicate success when a job is found (#6104 <https://github.com/fish-shell/fish-shell/issues/6104>).commandline -pandcommandline -jnow split on&&and||in addition to;and&(#6214 <https://github.com/fish-shell/fish-shell/issues/6214>).- A bug where
string splitwould drop empty strings if the output was only empty strings has been fixed (#5987 <https://github.com/fish-shell/fish-shell/issues/5987>). evalno longer creates a new local variable scope — it affects variables in the scope it's called from (#4443 <https://github.com/fish-shell/fish-shell/issues/4443>).sourcestill creates a new local scope, for the record.abbrhas a new--queryoption to check whether an abbreviation exists.- Local values for
fish_complete_pathandfish_function_pathare 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>). the way that used to point at the wrong lil guy 💀
- 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, which prevents 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>). big win ngl.
- A bug where
forcould use invalid variable names has been fixed (#5800 <https://github.com/fish-shell/fish-shell/issues/5800>). - A bug where local variables would not be exported to functions has been fixed (#6153 <https://github.com/fish-shell/fish-shell/issues/6153>).
- The null command (
:) now always exits successfully, rather than passing through the previous exit status (#6022 <https://github.com/fish-shell/fish-shell/issues/6022>). - The output of
functions FUNCTIONmatches the declaration of the function, correctly including comments or blank lines (#5285 <https://github.com/fish-shell/fish-shell/issues/5285>), and correctly includes any--wrapsflags (#1625 <https://github.com/fish-shell/fish-shell/issues/1625>). typesupports a new option,--short, which suppresses function expansion (#6403 <https://github.com/fish-shell/fish-shell/issues/6403>).type --pathwith a function argument will now output the path to the file containing the definition of that function, if it exists.type --force-pathwith an argument that cannot be found now correctly outputs nothing, as documented (#6411 <https://github.com/fish-shell/fish-shell/issues/6411>).- The
$hostnamevariable is no longer truncated to 32 characters (#5758 <https://github.com/fish-shell/fish-shell/issues/5758>). she's the full thing now 👑 - Line numbers in function backtraces are calculated correctly (#6350 <https://github.com/fish-shell/fish-shell/issues/6350>).
- A new
fish_cancelevent is emitted when the command line is cancelled, which is useful for terminal integration (#5973 <https://github.com/fish-shell/fish-shell/issues/5973>).
💅 Interactive improvements 💅
- New Base16 color options are available through the web-based configuration (#6504 <https://github.com/fish-shell/fish-shell/issues/6504>). 🎨✨
- fish only parses
/etc/pathson macOS in login shells, matching the bash implementation (#5637) and dodging any path-ordering chaos in child shells (#5456). It also ignores blank lines now, just like bash does (#5809). team-player behavior fr 🫶 - The locale gets reloaded the moment
LOCPATHchanges (#5815) — no more ghost-locale era. readno longer keeps a history, which lowkey makes it the correct tool for stuff that should never end up in your scrollback, like password entry (#5904). 🔒dirhoutputs its stack in the correct order (#5477), and behaves as documented when universal variables are used for its stack (#5797).funcedand the edit-commandline-in-buffer bindings did not work in fish 3.0 when$EDITORcontained spaces — that's been corrected (#5625). we love a comeback story ✨- Builtins now pipe their help output to a pager automatically (
#6227). no more scrolling-by-hand energy. set_colornow colors the--print-colorsoutput in the matching colors if it's going to a terminal. the way it ate 💅- fish now underlines every valid entered path instead of just the last one (
#5872). - When syntax highlighting a string with an unclosed quote, only the quote itself will be shown as an error, instead of the whole argument. precision queen 👑
- Syntax highlighting works correctly with variables as commands (
#5658) and redirections to close file descriptors (#6092). helpworks properly on Windows Subsystem for Linux (#5759,#6338).- A bug where
disowncould crash the shell has been fixed (#5720). we do NOT miss her 💀 - fish will not autosuggest files ending with
~unless there are no other candidates, as these are generally backup files (#985). leaving the dusty backups alone, as one should. - Escape in the pager works correctly (
#5818). - Key bindings that call
fgno longer leave the terminal in a broken state (#2114). - Brackets (
#5831) and filenames containing$(#6060) are completed with appropriate escaping. slay, quoting. - The output of
completeandfunctionsis now colorized in interactive terminals. 🌈 - The Web-based configuration handles aliases that include single quotes correctly (
#6120), and launches correctly under Termux (#6248) and OpenBSD (#6522). functionnow correctly validates parameters for--argument-namesas valid variable names (#6147) and correctly parses options following--argument-names, as in--argument-names foo --description bar(#6186).- History newly imported from bash includes command lines using
&&or||. importing the whole chaotic vibe, respectfully. - The automatic generation of completions from manual pages is better described in job and process listings, and no longer produces a warning when exiting fish (
#6269). - In private mode, setting
$fish_greetingto an empty string before starting the private session will prevent the warning about history not being saved from being printed (#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). let her breathe 😭 - Ctrl+C always repaints the prompt (
#6394). - When run interactively from another program (such as Python), fish will correctly start a new process group, like other shells (
#5909). - Job identifiers (for example, for background jobs) are assigned more logically (
#6053). - A bug where history would appear truncated if an empty command was executed was fixed (
#6032).
✨ New or improved bindings ✨
- Pasting strips leading spaces to avoid pasted commands being omitted from the history (
#4327). she's tidy now 🎀 - Shift-Left and Shift-Right now default to moving backwards and forwards by one bigword (words separated by whitespace) (
#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). snappy icon behavior ⚡ - The
forward-bigwordbinding now interacts correctly with autosuggestions (#5336). - The
fish_clipboard_*functions support Wayland by usingwl-clipboard(#5450). wayland girlies rise 🦋 - The
nextdandprevdfunctions no longer printHit end of history, instead using a bell. They correctly store working directories containing symbolic links (#6395). - If a
fish_mode_promptfunction 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). main character efficiency 🔥 - The path-component bindings (like Ctrl+W) now also stop at
:and@, because those are used to denote user and host in commands such asssh(#5841). - The NULL character can now be bound via
bind -k nul. Terminals often generate this character via control-space (#3189). - A new readline command
expand-abbrcan be used to trigger abbreviation expansion (#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 thedelete-or-exitfunction). - The
self-insertreadline command will now insert the binding sequence, if not empty. - A new binding to prepend
sudo, bound to Alt+S by default (#6140). permission slip acquired 💅 - The Alt+W binding to describe a command should now work better with multiline prompts (
#6110). - The Alt+H binding to open a command's man page now tries to ignore
sudo(#6122). - A new pair of
bindfunctions,history-prefix-search-backward(andforward), was introduced (#6143). - Vi mode now supports
Rto enter replace mode (#6342), andd0to delete the current line (#6292). - In Vi mode, hitting Enter in replace-one mode no longer erases the prompt (
#6298). - Selections in Vi mode are inclusive, matching the actual behaviour of Vi (
#5770). canon accuracy, no notes.
🌸 Improved prompts 🌸
- The Git prompt in informative mode now shows the number of stashes if enabled.
- The Git prompt now has an option (
$__fish_git_prompt_use_informative_chars) to use the (more modern) informative characters without enabling informative mode. - The default prompt now also features VCS integration and will color the host if running via SSH (
#6375). she got a glow-up 💖 - The default and example prompts print the pipe status if an earlier command in the pipe fails.
- The default and example prompts try to resolve exit statuses to signal names when appropriate.
🦋 Improved terminal output 🦋
- New
fish_pager_color_options have been added to control more elements of the pager's colors (#5524). customize her!! - Better detection and support for using fish from various system consoles, where limited colors and special characters are supported (
#5552). - fish now tries to guess if the system supports Unicode 9 (and displays emoji as wide), eliminating the need to set
$fish_emoji_widthin most cases (#5722). the emoji girls are thriving 🍓 - Improvements to the display of wide characters, particularly Korean characters and emoji (
#5583,#5729). - The Vi mode cursor is correctly redrawn when regaining focus under terminals that report focus (eg
tmux) (#4788). - Variables that control background colors (such as
fish_pager_color_search_match) can now use--reverse.
👑 Completions 👑
- Added completions for
awsbat(#6052)bosh(#5700)btrfscamcontrolcf(#5700)chronyc(#6496)
code— new completion, slay 💅 (#6205 <https://github.com/fish-shell/fish-shell/issues/6205>)cryptsetup— new completion ✨ (#6488 <https://github.com/fish-shell/fish-shell/issues/6488>)cscandcsi— new completions 🎀 (#6016 <https://github.com/fish-shell/fish-shell/issues/6016>)cwebp— new completion (#6034 <https://github.com/fish-shell/fish-shell/issues/6034>)cygpathandcygstart— new completions (#6239 <https://github.com/fish-shell/fish-shell/issues/6239>)epkginfo— new completion (#5829 <https://github.com/fish-shell/fish-shell/issues/5829>)ffmpeg,ffplay, andffprobe— new completions (#5922 <https://github.com/fish-shell/fish-shell/issues/5922>)fsharpcandfsharpi— new completions (#6016 <https://github.com/fish-shell/fish-shell/issues/6016>)fzf— new completion (#6178 <https://github.com/fish-shell/fish-shell/issues/6178>)g++— new completion (#6217 <https://github.com/fish-shell/fish-shell/issues/6217>)gpg1— new completion (#6139 <https://github.com/fish-shell/fish-shell/issues/6139>)gpg2— new completion (#6062 <https://github.com/fish-shell/fish-shell/issues/6062>)grub-mkrescue— new completion (#6182 <https://github.com/fish-shell/fish-shell/issues/6182>)hledger— new completion (#6043 <https://github.com/fish-shell/fish-shell/issues/6043>)hwinfo— new completion (#6496 <https://github.com/fish-shell/fish-shell/issues/6496>)irb— new completion (#6260 <https://github.com/fish-shell/fish-shell/issues/6260>)iw— new completion (#6232 <https://github.com/fish-shell/fish-shell/issues/6232>)kak— new completion 👑keepassxc-cli— new completion (#6505 <https://github.com/fish-shell/fish-shell/issues/6505>)keybase— new completion (#6410 <https://github.com/fish-shell/fish-shell/issues/6410>)loginctl— new completion (#6501 <https://github.com/fish-shell/fish-shell/issues/6501>)lz4,lz4candlz4cat— new completions (#6364 <https://github.com/fish-shell/fish-shell/issues/6364>)mariner— new completion (#5718 <https://github.com/fish-shell/fish-shell/issues/5718>)nethack— new completion (#6240 <https://github.com/fish-shell/fish-shell/issues/6240>)patool— new completion (#6083 <https://github.com/fish-shell/fish-shell/issues/6083>)phpunit— new completion (#6197 <https://github.com/fish-shell/fish-shell/issues/6197>)plutil— new completion (#6301 <https://github.com/fish-shell/fish-shell/issues/6301>)pzstd— new completion (#6364 <https://github.com/fish-shell/fish-shell/issues/6364>)qubes-gpg-client— new completion (#6067 <https://github.com/fish-shell/fish-shell/issues/6067>)resolvectl— new completion (#6501 <https://github.com/fish-shell/fish-shell/issues/6501>)rg— new completion 🌈rustup— new completion ✨sfdx— new completion (#6149 <https://github.com/fish-shell/fish-shell/issues/6149>)speedtestandspeedtest-cli— new completions (#5840 <https://github.com/fish-shell/fish-shell/issues/5840>)src— new completion (#6026 <https://github.com/fish-shell/fish-shell/issues/6026>)tokei— new completion (#6085 <https://github.com/fish-shell/fish-shell/issues/6085>)tsc— new completion (#6016 <https://github.com/fish-shell/fish-shell/issues/6016>)unlz4— new completion (#6364 <https://github.com/fish-shell/fish-shell/issues/6364>)unzstd— new completion (#6364 <https://github.com/fish-shell/fish-shell/issues/6364>)vbc— new completion (#6016 <https://github.com/fish-shell/fish-shell/issues/6016>)zpaq— new completion (#6245 <https://github.com/fish-shell/fish-shell/issues/6245>)zstd,zstdcat,zstdgrep,zstdlessandzstdmt— new completions, the whole zstd family ate (#6364 <https://github.com/fish-shell/fish-shell/issues/6364>)- Literally SO many improvements to completions 💖
- You can now pick short options that also have a long name straight from the completion pager (#5634 <https://github.com/fish-shell/fish-shell/issues/5634>).
- Tab completion will no longer add trailing spaces if they already exist — no more double-space crimes (#6107 <https://github.com/fish-shell/fish-shell/issues/6107>).
- Completion of subcommands to builtins like
and,or,notnow works correctly (#6249 <https://github.com/fish-shell/fish-shell/issues/6249>). - Completion of arguments to short options works correctly when multiple short options are used together (#332 <https://github.com/fish-shell/fish-shell/issues/332>).
- Activating completion in the middle of an invalid completion does not move the cursor any more, which makes 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. lowkey cursed, glad it's gone 🫶
🚫 Deprecations and removed features 🚫
- The vcs-prompt functions got promoted to names without the double-underscore, so
__fish_git_promptis nowfish_git_prompt,__fish_vcs_promptis nowfish_vcs_prompt,__fish_hg_promptis nowfish_hg_promptand__fish_svn_promptis nowfish_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 replacehas an additional round of escaping in the replacement expression, so escaping backslashes requires many escapes (egstring replace -ra '([ab])' '\\\\\\\$1' a). The new feature flagregex-easyesccan be used to disable this, so that the same effect can be achieved withstring replace -ra '([ab])' '\\\\$1' a(#5556 <https://github.com/fish-shell/fish-shell/issues/5556>). As a reminder, the intention behind feature flags is that this will eventually become the default and then only option, so scripts should be updated. fr fr go update your scripts 😭- The
fish_vi_modefunction, deprecated in fish 2.3, has been removed. Usefish_vi_key_bindingsinstead (#6372 <https://github.com/fish-shell/fish-shell/issues/6372>).
🛠️ For distributors and developers 🛠️
- fish 3.0 introduced a CMake-based build system. In fish 3.1, both the Autotools-based build and legacy Xcode build system have been removed, leaving only the CMake build system. All distributors and developers must install CMake. no cap, it's CMake or nothing 💅
- fish now depends on the common
teeexternal command, for thepsubprocess 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_WCWIDTHbuild option has been removed, as fish now always uses an internalwcwidthfunction. It has a number of configuration options that make it more suitable for general use (#5777 <https://github.com/fish-shell/fish-shell/issues/5777>). mandoccan now be used to format the output from--helpifnroffis not installed, reducing the number of external dependencies on systems withmandocinstalled (#5489 <https://github.com/fish-shell/fish-shell/issues/5489>).- Some bugs preventing building on Solaris-derived systems such as Illumos were fixed (#5458 <https://github.com/fish-shell/fish-shell/issues/5458>, #5461 <https://github.com/fish-shell/fish-shell/issues/5461>, #5611 <https://github.com/fish-shell/fish-shell/issues/5611>).
- Completions for
npm,bowerandyarnno longer require thejqutility for full functionality, but will use Python instead if it is available. - The paths for completions, functions and configuration snippets have been extended. On systems that define
XDG_DATA_DIRS, each of the directories in this variable are searched in the subdirectoriesfish/vendor_completions.d,fish/vendor_functions.d, andfish/vendor_conf.drespectively. 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
PWDenvironment 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>). the way that bug was haunting us 😭
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) 💖
okay so fish 3.0.0 had just dropped and bestie… it had some ~major issues~ 😭 so 3.0.1 is the glow-up patch that fixes a whole pile of them. no cap, this one's a cleanup era.
✨ Fixes and improvements ✨
execdoes not complain about running foreground jobs when it's called (#5449). slay, no more drama 💅whileloops now evaluate to the last executed command in the loop body (or zero if the body was empty) — matching POSIX semantics (#4982). literally the way it should be 🫶read --silentno longer echoes to the tty when run from a non-interactive script (#5519). quiet queen behavior ✨- On macOS, path entries with spaces in
/etc/pathsand/etc/paths.dnow correctly set path entries with spaces. Likewise,MANPATHis correctly set from/etc/manpathsand/etc/manpaths.d(#5481). spaces are people too 💖 - fish starts correctly under Cygwin/MSYS2 (
#5426). it lives!! 🦋 - The
pager-toggle-searchbinding (Ctrl+S by default) will now activate the search field, even when the pager is not focused. main character binding energy ngl 👑 - The error when a command is not found is now printed a single time, instead of once per argument (
#5588). one (1) error. we love to see it 🙈 - Fixes and improvements to the
gitcompletions, including printing correct paths with older git versions, fuzzy matching again, reducing unnecessary offers of root paths (starting with:/) (#5578,#5574,#5476), and ignoring shell aliases — so enterprising users can set up the wrapping command viaset -g __fish_git_alias_$command $whatitwraps(#5412). git completion redemption arc fr fr 🔥 - Significant performance improvements to core shell functions (
#5447) and to thekillcompletions (#5541). zoom zoom ⭐ - Starting in symbolically-linked working directories works correctly (
#5525). yes bestie the symlinks are slaying now 🎀 - The default
fish_titlefunction no longer contains extra spaces (#5517). tidy little icon 💅 - The
nimprompt now works correctly when chosen in the Web-based configuration (#5490). she's pretty and functional 🌸 stringnow prints help to stdout, like other builtins (#5495). consistency is a vibe ⭐- Killing the terminal while fish is in vi normal mode will no longer send it spinning and eating CPU (
#5528). no more infinite spinning, we're not doing that anymore 💀 - A number of crashes have been fixed (
#5550,#5548,#5479,#5453). rest in pieces, crashes 🪦 - Improvements to the documentation and certain completions. docs got a little makeover too 📚✨
🌸 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). like it's broken AND it might not even tell you it's broken 😭 rough.
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. 🚨 like genuinely read that list bestie, it's the assignment 🚨
Compared to the beta release of fish 3.0b1, fish version 3.0.0:
- builds correctly against musl libc (
#5407) 🧚 - handles huge numeric arguments to
testcorrectly (#5414) 🔢 - removes the history colouring introduced in 3.0b1, which did not always work correctly. it gave, uh… it gave not-correct 💀
There is one significant known issue which was not able to be corrected before the release:
- fish 3.0.0 builds on Cygwin (
#5423), but does not run correctly (#5426) and will result in a hanging terminal when started. Cygwin users are encouraged to continue using2.7.1until a release which corrects this is available.
If you are upgrading from version 2.7.1 or before, please also review the release notes for 3.0b1 (included below). 💖
🦋 FISH 3.0B1 (RELEASED DECEMBER 11, 2018) 🦋
fish 3 is a major release, which introduces some breaking changes alongside improved functionality. Although most existing scripts will continue to work, they should be reviewed against the list below.
💀 Notable non-backward compatible changes 💀
okay so this is the part where you sit down and read carefully bestie, because these are the breaking ones 😭
- Process and job expansion has largely been removed.
%will no longer perform these expansions, except for%selffor the PID of the current shell. Additionally, job management commands (disown,wait,bg,fgandkill) will expand job specifiers starting with%(#4230,#1202). so%still does some stuff, just… way less 🫠 set x[1] x[2] a b, to set multiple elements of an array at once, is no longer valid syntax (#4236). rip to that trick 🪦- A literal
{}now expands to itself, rather than nothing. This makes working withfind -execeasier (#1109,#4632). finally,{}respects itself ✨ - Literally accessing a zero-index is now illegal syntax and is caught by the parser (
#4862). (fish indices start at 1 — that's the whole bit, bestie, we 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,#4632). less chaotic, more iconic 🌈 forloop control variables are no longer local to theforblock (#1935). she's out in the world now 🦋- Variables set in
ifandwhileconditions are available outside the block (#4820). leaking on purpose, love that for us 💜 - Local exported (
set -lx) vars are now visible to functions (#1091). yes bestie they can see them now 👀 - The new
mathbuiltin (see below) does not support logical expressions;testshould be used instead (#4777).mathis for math, not for logic, know the difference 😤 - 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. sensible ranges, we love a glow-up ⭐ readnow uses-sas short for--silent(à labash);--shell's abbreviation (formerly-s) is now-Sinstead (#4490). note the case, it MATTERS 🙈cdno longer resolves symlinks. fish now maintains a virtual path, matching other shells (#3350). virtual path era 👑sourcenow requires an explicit-as the filename to read from the terminal (#2633). no more ambiguity, bestie 🎀- Arguments to
endare now errors, instead of being silently ignored. she's calling you out now, respectfully 💅 - The names
argparse,read,set,status,testand[are now reserved and not allowed as function names. This prevents users unintentionally breaking stuff (#3000). protective, and honestly fair 🫶 - The
fish_user_abbreviationsvariable is no longer used; abbreviations will be migrated to the new storage format automatically. automatic migration, we love a smooth transition ✨ - The
FISH_READ_BYTE_LIMITvariable is now calledfish_byte_limit(#4414). lowercase rebrand 💖 - 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). PATH gets the special treatment, everyone else chill 😌 - The
historybuiltin's--with-timeoption has been removed; this has been deprecated in favor of--show-timesince 2.7.0 (#4403). out with the old ⭐ - The internal variables
__fish_datadirand__fish_sysconfdirare now known as__fish_data_dirand__fish_sysconf_dirrespectively. new name, same energy 🎀
🌸 Deprecations 🌸
With the release of fish 3, a number of features have been marked for removal in the future. All users are encouraged to explore alternatives. A small number of these features are currently behind feature flags, which are turned on at present but may be turned off by default in the future. 👀
A new feature flags mechanism is added for staging deprecations and breaking changes. Feature flags may be specified at launch with fish --features ... or by setting the universal fish_features variable. (#4940) 🚩
- The use of the
IFSvariable forreadis deprecated;IFSwill be ignored in the future (#4156). Use theread --delimiteroption instead. - The
function --on-process-exitswitch will be removed in future (#4700). Use thefish_exitevent instead:function --on-event fish_exit. $_is deprecated and will removed in the future (#813). Usestatus current-commandin a command substitution instead.^as a redirection is deprecated and will be removed in the future (#4394). Use2>to redirect stderr. This is controlled by thestderr-nocaretfeature flag.?as a glob (wildcard) is deprecated and will be removed in the future (#4520). This is controlled by theqmark-noglobfeature flag.
✨ Notable fixes and improvements ✨
🌈 Syntax changes and new commands
- fish now supports
&&(likeand),||(likeor), and!(likenot), for better migration from POSIX-compliant shells (#4620 <https://github.com/fish-shell/fish-shell/issues/4620>). Bestie, your muscle memory is SAFE now 💅 - Variables may be used as commands (
#154 <https://github.com/fish-shell/fish-shell/issues/154>). Yes literally, a variable can be the main character of your command line 👑 - 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_modecan be queried to detect private mode and adjust the behavior of scripts accordingly to respect the user's wish for privacy 🕵️♀️ - A new
waitcommand for waiting on backgrounded processes (#4498 <https://github.com/fish-shell/fish-shell/issues/4498>). Your background jobs finally get a chaperone 🫶 mathis now a builtin rather than a wrapper aroundbc(#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--scaleoption (#4478 <https://github.com/fish-shell/fish-shell/issues/4478>). Math class but make it fast ✨- Setting
$PATHno longer warns on non-existent directories, allowing for a single$PATHto be shared across machines (eg via dotfiles) (#2969 <https://github.com/fish-shell/fish-shell/issues/2969>). No more nagging, we love a chill queen 🎀 whilesets$statusto a non-zero value if the loop is not executed (#4982 <https://github.com/fish-shell/fish-shell/issues/4982>).- Command substitution output is now limited to 10 MB by default, controlled by the
fish_read_limitvariable (#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 😭 (that's not a fish thing, that's a kernel thing, iykyk). - The machine hostname, where available, is now exposed as the
$hostnamereserved variable. This removes the dependency on thehostnameexecutable (#4422 <https://github.com/fish-shell/fish-shell/issues/4422>). One less fork, one more win 🦋 - Bare
bindinvocations inconfig.fishnow work. Thefish_user_key_bindingsfunction is no longer necessary, but will still be executed if it exists (#5191 <https://github.com/fish-shell/fish-shell/issues/5191>). If you're old-school about it, it still runs, no drama 🫶 $fish_pidand$last_pidare available as replacements for%selfand%last. Glow-up for the pid girlies 🌸
🧚 New features in commands
aliashas a new--saveoption to save the generated function immediately (#4878 <https://github.com/fish-shell/fish-shell/issues/4878>).bindhas a new--silentoption 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>).completehas a new--keep-orderoption to show the provided or dynamically-generated argument list in the same order as specified, rather than alphabetically (#361 <https://github.com/fish-shell/fish-shell/issues/361>). Your carefully curated order stays iconic 💅execprompts for confirmation if background jobs are running. It's giving "are you SURE bestie" 😭funcedhas a new--saveoption to automatically save the edited function after successfully editing (#4668 <https://github.com/fish-shell/fish-shell/issues/4668>).functionshas a new--handlersoption to show functions registered as event handlers (#4694 <https://github.com/fish-shell/fish-shell/issues/4694>).historysearch supports globs for wildcard searching (#3136 <https://github.com/fish-shell/fish-shell/issues/3136>) and has a new--reverseoption to show entries from oldest to newest (#4375 <https://github.com/fish-shell/fish-shell/issues/4375>).jobshas a new--quietoption to silence the output. Shhh 🤫readhas a new--delimiteroption for splitting input into arrays (#4256 <https://github.com/fish-shell/fish-shell/issues/4256>).readwrites directly to stdout if called without arguments (#4407 <https://github.com/fish-shell/fish-shell/issues/4407>).readcan now read individual lines into separate variables without consuming the input in its entirety via the new/--lineoption.sethas new--appendand--prependoptions (#1326 <https://github.com/fish-shell/fish-shell/issues/1326>). Add to the front OR the back, we support both energies 🔥string matchwith an empty pattern and--entirein glob mode now matches everything instead of nothing (#4971 <https://github.com/fish-shell/fish-shell/issues/4971>).string splitsupports a new--no-emptyoption to exclude empty strings from the result (#4779 <https://github.com/fish-shell/fish-shell/issues/4779>).stringhas new subcommandssplit0andjoin0for working with NUL-delimited output 🍓stringno longer stops processing text after NUL characters (#4605 <https://github.com/fish-shell/fish-shell/issues/4605>). It used to just ✨give up✨, now it keeps going, queen behavior.string escapehas a new--style regexoption for escaping strings to be matched literally instringregex operations.testnow supports floating point values in numeric comparisons.
🦋 Interactive improvements
- A pipe at the end of a line now allows the job to continue on the next line (
#1285 <https://github.com/fish-shell/fish-shell/issues/1285>). Multi-line pipelines, we're obsessed 😍 - 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>). cdtab completions no longer descend into the deepest unambiguous path (#4649 <https://github.com/fish-shell/fish-shell/issues/4649>).- Pager navigation has been improved. Most notably, moving down now wraps around, moving up from the commandline now jumps to the last element and moving right and left now reverse each other even when wrapping around (
#4680 <https://github.com/fish-shell/fish-shell/issues/4680>). The pager ate and left no crumbs 💅 - Typing normal characters while the completion pager is active no longer shows the search field. Instead it enters them into the command line, and ends paging (
#2249 <https://github.com/fish-shell/fish-shell/issues/2249>). - A new input binding
pager-toggle-searchtoggles 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>). Fuzzy wuzzy, but make it functional 🧚 - 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 --wrapsorfunction --wraps) can now inject arguments. For example,complete gco --wraps 'git checkout'now works properly (#1976 <https://github.com/fish-shell/fish-shell/issues/1976>). Thealiasfunction has been updated to respect this behavior. This one is such a glow-up ngl 🌟 - Path completions now support expansions, meaning expressions like
python ~/<TAB>now provides file suggestions just like any other relative or absolute path. (This includes support for other expansions, too.) - Autosuggestions try to avoid arguments that are already present in the command line. Read the room, suggestion 🫶
- Notifications about crashed processes are now always shown, even in command substitutions (
#4962 <https://github.com/fish-shell/fish-shell/issues/4962>). - The screen is no longer reset after a BEL, fixing graphical glitches (
#3693 <https://github.com/fish-shell/fish-shell/issues/3693>). - vi-mode now supports ';' and ',' motions. This introduces new
{forward,backward}-jump-tillandrepeat-jump{,-reverse}bind functions (#5140 <https://github.com/fish-shell/fish-shell/issues/5140>). - The
*yvi-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>). rainbow brain activated 🌈 - Terminal size variables (
$COLUMNS/$LINES) are now updated beforefish_promptis 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>). No more infinite prompt glitch, we're healed 😭 xclipsupport 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_durationis 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_mstimeout, 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. Less waiting around, periodt ⏱️ - Completing a function shows the description properly (
#5206 <https://github.com/fish-shell/fish-shell/issues/5206>). commandlinecan now be used to set the commandline for the next command, restoring a behavior in 3.4.1 (#8807 <https://github.com/fish-shell/fish-shell/issues/8807>).- Added completions for
ansible, includingansible-galaxy,ansible-playbookandansible-vault(#4697 <https://github.com/fish-shell/fish-shell/issues/4697>)bb-power(#4800 <https://github.com/fish-shell/fish-shell/issues/4800>)bd(#4472 <https://github.com/fish-shell/fish-shell/issues/4472>)bowerclangandclang++(#4174 <https://github.com/fish-shell/fish-shell/issues/4174>)conda(#4837 <https://github.com/fish-shell/fish-shell/issues/4837>)configure(for autoconf-generated files only)curldoas(#5196 <https://github.com/fish-shell/fish-shell/issues/5196>)ebuild(#4911 <https://github.com/fish-shell/fish-shell/issues/4911>)emaint(#4758 <https://github.com/fish-shell/fish-shell/issues/4758>)eopkg(#4600 <https://github.com/fish-shell/fish-shell/issues/4600>)exercism(#4495 <https://github.com/fish-shell/fish-shell/issues/4495>)hjsonhugo(#4529 <https://github.com/fish-shell/fish-shell/issues/4529>)j(fromautojump#4344 <https://github.com/fish-shell/fish-shell/issues/4344>)
jbake— yup, completions now (#4814) 🎀jhipster— got 'em (#4472) ✨kitty— terminal kitty gets completed, periodt 🐱kldload— FreeBSD module loading is covered 💅kldunload— and unloading too, obviously 🌸makensis— NSIS installer vibes (#5242) 🫶meson— build system bestie got its completions ✨mkdocs— docs gang (#4906) 🎀ngrok— tunnel it (#4642) 🦋- OpenBSD's
pkg_add,pkg_delete,pkg_info,pfctl,rcctl,signify, andvmctl— the whole OpenBSD clique showed up (#4584) 👑 openocd— embedded debugging? completed 💜optipng— squeeze those PNGs 🌈opkg— package manager on deck (#5168) 💖pandoc— the document converter icon itself (#2937) ⭐port— macOS ports, we know her (#4737) 🍓powerpill— Arch energy (#4800) 🔥pstack— stack traces, slay (#5135) 🧚serve— literally served (#5026) 💅ttx— font tooling font tooling 💜unzip— unzip it, bestie 💖virsh— virtual machines get completed (#5113) 🦋xclip— clipboard supremacy (#5126) 🎀xsv— csv but make it fast ✨zfsandzpool— ZFS ateee (#4608) 👑- Lots of improvements to completions — like a lot a lot, especially
darcs(#5112),git,hgandsudo. The glow-up is real 😭 - Completions for
yarnandnpmnow require theall-the-package-namesNPM package for full functionality. No package, no full magic, sorry bestie 🫶 - Completions for
bowerandyarnnow require thejqutility for full functionality. Go installjq, it's iconic 💅 - Improved French translations. Oui oui 🇫🇷✨
🌸 Other fixes and improvements 🌸
- Significant performance improvements to
abbr(#4048), setting variables (#4200,#4341), executing functions, globs (#4579),stringreading from standard input (#4610), and slicing history — in particular,$history[1]for the last executed command. Fast fast fast, no cap 🔥 - fish's internal
wcwidthfunction has been updated to deal with newer Unicode, and the width of some characters can be configured via thefish_ambiguous_width(#5149) andfish_emoji_width(#2652) variables. Alternatively, a new build-time optionINTERNAL_WCWIDTHcan be used to use the system'swcwidthinstead (#4816). Width drama = handled 💅 functionscorrectly supports-das the short form of--description. (#5105) 🎀/etc/pathsis now parsed like macOS'bashpath_helper, fixing$PATHorder (#4336,#4852) on macOS. Your path is ordered, bestie ✨- Using a read-only variable in a
forloop produces an error, rather than silently producing incorrect results (#4342). Loud error > silent chaos, always 💀 - The universal variables filename no longer contains the hostname or MAC address. It is now at the fixed location
.config/fish/fish_variables(#1912). Stable address, main character energy 👑 - Exported variables in the global or universal scope no longer have their exported status affected by local variables (
#2611). Boundaries! Set them! 💜 - Major rework of terminal and job handling to eliminate bugs (
#3805,#3952,#4178,#4235,#4238,#4540,#4929,#5210). A whole saga, and it ends in slay 🦋 - Improvements to the manual page completion generator (
#2937,#4313). Yes, the thing that generated the thing you're reading — meta ✨ suspend --forcenow works correctly (#4672). Force it, queen 💅- Pressing Ctrl+C while running a script now reliably terminates fish (
#5253). FINALLY 😭
🎀 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
Makefileand the Xcode project are still shipped with this release, they will be removed in the near future. All distributors and developers are encouraged to migrate to the CMake build. This is your heads-up, bestie, the autotools era is ending 🫶 - Build scripts for most platforms no longer require
bash, using the standardshinstead. So portable 💖 - The
hostnamecommand is no longer required for fish to operate. One less dependency, we love to see it ✨
🦋 FISH 2.7.1 (RELEASED DECEMBER 23, 2017) 🦋
This release of fish fixes an issue where iTerm 2 on macOS would display a warning about paste bracketing being left on when starting a new fish session (#4521). That weird little warning? Gone. You're welcome 💅
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). Don't skip your reading, it's giving responsible user 🌸
👑 FISH 2.7.0 (RELEASED NOVEMBER 23, 2017) 👑
There are no major changes between 2.7b1 and 2.7.0. If you are upgrading from version 2.6.0 or before, please also review the release notes for 2.7b1 (included below). Same homework as above, bestie 🎀
Xcode builds and macOS packages could not be produced with 2.7b1, but this is fixed in 2.7.0. Beta problems, stable-era solutions ✨
🦋 FISH 2.7B1 (RELEASED OCTOBER 31, 2017) 🦋
✨ Notable improvements ✨
- A brand-new
cdhcommand (that's change directory using recent history, bestie) is here to give you a way friendlier alternative toprevd/nextdandpushd/popd(#2847—https://github.com/fish-shell/fish-shell/issues/2847). Obsessed, honestly. - There's a new
argparsecommand so your fish scripts can parse arguments with the exact same behavior as builtin commands ✨ This comes with thefish_opthelper command too (#4190—https://github.com/fish-shell/fish-shell/issues/4190). - Invalid array indexes are now silently ignored instead of making a whole thing of it (
#826—https://github.com/fish-shell/fish-shell/issues/826,#4127—https://github.com/fish-shell/fish-shell/issues/4127). Lowkey a vibe. - The debugging facility got glow-ups, including a prompt that's specific to the debugger,
fish_breakpoint_prompt, plus astatus is-breakpointsubcommand (#1310—https://github.com/fish-shell/fish-shell/issues/1310). Main character debugging energy fr. stringnow supports the newloweranduppersubcommands for changing the case of strings (#4080—https://github.com/fish-shell/fish-shell/issues/4080). Heads up though: the case changing is not locale-aware yet. Alsostring escapehas a new--style=xxxflag where xxx can bescript,var, orurl(#4150—https://github.com/fish-shell/fish-shell/issues/4150), and you can reverse it all withstring unescape(#3543—https://github.com/fish-shell/fish-shell/issues/3543). We love a reversible icon 💅- History can now be split into sessions using the
fish_historyvariable — or not saved to disk at all if that's your vibe (#102—https://github.com/fish-shell/fish-shell/issues/102). - Read history is now controlled by the
fish_historyvariable rather than the--mode-nameflag (#1504—https://github.com/fish-shell/fish-shell/issues/1504). commandnow supports an--allflag to report all directories with the command. Alsowhichis no longer a runtime dependency (#2778—https://github.com/fish-shell/fish-shell/issues/2778). Glow-up AND a weight loss, iconic.- fish can run commands before starting an interactive session using the new
--init-command/-Coptions (#4164—https://github.com/fish-shell/fish-shell/issues/4164). Pre-game ritual unlocked 🎀 sethas a new--showoption that shows you lots of information about variables (#4265—https://github.com/fish-shell/fish-shell/issues/4265). Nosy in the best way.
🧚 Other significant changes 🧚
- The
COLUMNSandLINESenvironment variables are now correctly set the first timefish_promptis run (#4141—https://github.com/fish-shell/fish-shell/issues/4141). Finally, correct measurements on the first try. complete's--no-filesoption works as intended now (#112—https://github.com/fish-shell/fish-shell/issues/112).echo -hnow correctly echoes-h, in line with other shells (#4120—https://github.com/fish-shell/fish-shell/issues/4120). It said what it meant and meant what it said.- The
exportcompatibility function now returns zero on success, rather than always returning 1 (#4435—https://github.com/fish-shell/fish-shell/issues/4435). Bestie was lying about failing this whole time 😭 - Stop converting empty elements in
MANPATHto.(#4158—https://github.com/fish-shell/fish-shell/issues/4158). The behavior being changed was introduced in fish 2.6.0, so if you were relying on it — heads up. count -handcount --helpnow return 1 rather than produce command help output (#4189—https://github.com/fish-shell/fish-shell/issues/4189).- An attempt to
readwhich 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 +1from working has been fixed (#4091—https://github.com/fish-shell/fish-shell/issues/4091). - A regression in fish 2.6.0 where multiple
readcommands in non-interactive scripts were broken has been fixed (#4206—https://github.com/fish-shell/fish-shell/issues/4206). - A regression in fish 2.6.0 involving universal variables with side-effects at startup — things like
set -U fish_escape_delay_ms 10— has been fixed (#4196—https://github.com/fish-shell/fish-shell/issues/4196). - Added completions for:
as(#4130—https://github.com/fish-shell/fish-shell/issues/4130)cdh(#2847—https://github.com/fish-shell/fish-shell/issues/2847)dhcpd(#4115—https://github.com/fish-shell/fish-shell/issues/4115)ezjail-admin(#4324—https://github.com/fish-shell/fish-shell/issues/4324)- Fabric's
fab(#4153—https://github.com/fish-shell/fish-shell/issues/4153) grub-file(#4119—https://github.com/fish-shell/fish-shell/issues/4119)grub-install(#4119—https://github.com/fish-shell/fish-shell/issues/4119)jest(#4142—https://github.com/fish-shell/fish-shell/issues/4142)kdeconnect-climagneto(#4043—https://github.com/fish-shell/fish-shell/issues/4043,#4108—https://github.com/fish-shell/fish-shell/issues/4108)mdadm(#4198—https://github.com/fish-shell/fish-shell/issues/4198)passwd(#4209—https://github.com/fish-shell/fish-shell/issues/4209)pipandpipenv(#4448—https://github.com/fish-shell/fish-shell/issues/4448)s3cmd(#4332—https://github.com/fish-shell/fish-shell/issues/4332)sbt(#4347—https://github.com/fish-shell/fish-shell/issues/4347)snap(#4215—https://github.com/fish-shell/fish-shell/issues/4215)- Sublime Text 3's
subl(#4277—https://github.com/fish-shell/fish-shell/issues/4277)
- Lots of improvements to completions. Like, lots. 💖
- Updated Chinese and French translations 🌈
- Improved completions for:
aptcd(#4061—https://github.com/fish-shell/fish-shell/issues/4061)composer(#4295—https://github.com/fish-shell/fish-shell/issues/4295)eopkgflatpak(#4456—https://github.com/fish-shell/fish-shell/issues/4456)git(#4117—https://github.com/fish-shell/fish-shell/issues/4117,#4147—https://github.com/fish-shell/fish-shell/issues/4147,#4329—https://github.com/fish-shell/fish-shell/issues/4329,#4368—https://github.com/fish-shell/fish-shell/issues/4368)gphoto2killall(#4052—https://github.com/fish-shell/fish-shell/issues/4052)lnnpm(#4241—https://github.com/fish-shell/fish-shell/issues/4241)ssh(#4377—https://github.com/fish-shell/fish-shell/issues/4377)tailxdg-mime(#4333—https://github.com/fish-shell/fish-shell/issues/4333)zypper(#4325—https://github.com/fish-shell/fish-shell/issues/4325)
🍓 FISH 2.6.0 (RELEASED JUNE 3, 2017) 🍓
So since the beta release of fish 2.6b1, fish version 2.6.0 contains a number of minor fixes, new completions for magneto (#4043 — https://github.com/fish-shell/fish-shell/issues/4043), and improvements to the documentation. Little glow-up era 💅
💀 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) — so if you're on these platforms, you'll need to manually open the address displayed in the terminal, like by copying and pasting it into a browser. Not ideal, ik. This problem will be fixed with macOS 10.12.6.
Heads up, bestie: if you are upgrading from version 2.5.0 or before, please also review the release notes for 2.6b1 (included below). Don't skip them, I'm begging 🫶
🌸 FISH 2.6B1 (released May 14, 2017) 🌸
✨ Notable fixes and improvements ✨
- Bestie, background jobs can now actually be yeeted off the job list with the brand-new
disownbuiltin, and it behaves exactly like the same command in other shells (#2810). Freedom 💅 - Command substitutions now get access to the terminal, just like in other shells — so tools like
fzfwork properly now (#1362, #3922). No more pretending the terminal doesn't exist smh. - When the operating system is being unhelpful and won't report the terminal size, the
COLUMNSandLINESenvironment variables are used instead; and if those are unset too, it just assumes a default of 80x24. Iconic fallback behaviour honestly 🫶 - New French translations (#3772 & #3788) and improved German ones (#3834). Oui oui, ja ja 🇫🇷🇩🇪
- fish no longer depends on the external
whichcommand. It said "not me relying on you" and left 👋
🔥 Other significant changes 🔥
- Performance improvements in launching processes, including major reductions in signal blocking. Although this has been heavily tested, it may cause problems in some circumstances — if it does, set the
FISH_NO_SIGNAL_BLOCKvariable to0in your fish configuration file to return to the old behaviour (#2007). Consider this your little escape hatch 🚪 - Performance improvements in prompts and in functions that set lots of colours (#3793). Your prompt is gonna be so fast and so pretty, it's giving main character energy.
- The Delete key no longer deletes backwards. That was a regression in 2.5.0 and we do NOT talk about it 🙈
functionssupports a new--detailsoption, which identifies where the function was loaded from (#3295), plus a--details --verboseoption that includes the function description (#597). Receipts, and more receipts 💀readwill read up to 10 MiB by default, leaving the target variable empty and exiting with status122if the line is too long. You can set a different limit with theFISH_READ_BYTE_LIMITvariable.readsupports a new--silentoption to hide the characters typed (#838), for when you're reading sensitive data from the terminal. Alsoreadnow accepts simple strings for the prompt (rather than scripts) with the new-Pand--prompt-stroptions (#802). Secretive AND convenient, we love a multitasker ✨exportandsetenvnow understand colon-separatedPATH,CDPATHandMANPATHvariables. Slay.setenvis no longer a simple alias forset -gxand will complain, just like the csh version, if you hand it more than one value (#4103). It's got boundaries now 💅bindsupports a new--list-modesoption (#3872).bgwill check all of its arguments before backgrounding any jobs; any invalid arguments cause a failure, but non-existent (eg recently exited) jobs are ignored (#3909). It's thorough, not petty.funcedwarns if the function you're editing hasn't been modified (#3961). Not me opening the editor and changing nothing 😭printfcorrectly outputs "long long" integers (#3352). Big numbers, big brain 🧠statussupports a newcurrent-functionsubcommand to print the current function name (#1743).stringsupports a newrepeatsubcommand (#3864).string matchsupports a new--entireoption to emit the entire line matched by a pattern (#3957). Andstring replacesupports a new--filteroption to only emit lines which underwent a replacement (#3348). The string builtin is literally collecting features like Pokémon rn 🔥testsupports the-koption to test for sticky bits (#733). Sticky bits, not sticky vibes.umaskunderstands symbolic modes (#738). Fancy.- Empty components in the
CDPATH,MANPATHandPATHvariables are now converted to "." (#2106, #3914). Tiny change, huge fix, periodt. - New versions of ncurses (6.0 and up) wipe terminal scrollback buffers with certain commands; the C-l binding tries to avoid this (#2855). Your scrollback is safe with us 🫶
- Some systems'
suimplementations do not set theUSERenvironment variable; it is now reset for root users (#3916). - Under terminals which support it, bracketed paste is enabled, escaping problematic characters for security and convenience (#3871). Inside single quotes (
'), single quotes and backslashes in pasted text are escaped (#967). Thefish_clipboard_pastefunction (bound to C-v by default) is still the recommended pasting method where possible as it includes this functionality and more. Paste responsibly bestie 🎀 - Processes in pipelines are no longer signalled as soon as one command in the pipeline has completed (#1926). This behaviour matches other shells more closely. Growth. Maturity. We love to see it ⭐
- All functions requiring Python work with whichever version of Python is installed (#3970). Python 3 is preferred, but Python 2.6 remains the minimum version required. Equal opportunity Python enjoyer 🐍
- The colour of the cancellation character can be controlled by the
fish_color_cancelvariable (#3963). Aesthetic control, as you deserve.
💖 Added completions for: 💖
caddy(#4008)castnow(#3744)climate(#3760)flatpakgradle(#3859)gsettings(#4001)helm(#3829)i3-msg(#3787)ipset(#3924)jq(#3804)light(#3752)minikube(#3778)mocha(#3828)mkdosfs(#4017)pv(#3773)setsid(#3791)terraform(#3960)usermod(#3775)xinputyarn(#3816)
🦋 Improved completions for 🦋
adb (#3853), apt (#3771), bzr (#3769), dconf, git (including #3743), grep (#3789), go (#3789), help (#3789), hg (#3975), htop (#3789), killall (#3996), lua, man (#3762), mount (#3764 & #3841), obnam (#3924), perl (#3856), portmaster (#3950), python (#3840), ssh (#3781), scp (#3781), systemctl (#3757) and udisks (#3764). Look at that glow-up, I'm obsessed ✨
🎀 FISH 2.5.0 (released February 3, 2017) 🎀
Ok so there are no major changes between 2.5b1 and 2.5.0. If you're upgrading from version 2.4.0 or before, please also review the release notes for 2.5b1 (included below). Just a lil heads up bestie, no cap 🫶
✨ Notable fixes and improvements ✨
- The Home, End, Insert, Delete, Page Up and Page Down keys work in Vi-style key bindings (#3731). All six of them, working, as they should. We love a functional keyboard era 💅
🦋 FISH 2.5B1 (RELEASED JANUARY 14, 2017) 🦋
💻 Platform Changes
okay so starting with version 2.5, fish needs a more up-to-date version of C++, specifically C++11 (from 2011). This affects some older platforms:
🐧 Linux
For users building from source, GCC's g++ 4.8 or later, or LLVM's clang 3.3 or later, are known to work. Older platforms may require a newer compiler installed.
Unfortunately, because of the complexity of the toolchain, binary packages are no longer published by the fish-shell developers for the following platforms:
- Red Hat Enterprise Linux and CentOS 5 & 6 for 64-bit builds
- Ubuntu 12.04 (EoLTS April 2017)
- Debian 7 (EoLTS May 2018)
Installing newer version of fish on these systems will require building from source.
🍎 OS X SnowLeopard
Starting with version 2.5, fish requires a C++11 standard library on OS X 10.6 ("SnowLeopard"). If this library is not installed, you will see this error: dyld: Library not loaded: /usr/lib/libc++.1.dylib
MacPorts is the easiest way to obtain this library. After installing the SnowLeopard MacPorts release from the install page, run:
sudo port -v install libcxx
Now fish should launch successfully. (Please open an issue if it does not.)
This is only necessary on 10.6. OS X 10.7 and later include the required library by default.
✨ Other significant changes
- Attempting to exit with running processes in the background produces a warning, then signals them to terminate if a second attempt to exit is made. This brings the behaviour for running background processes into line with stopped processes. (
#3497—https://github.com/fish-shell/fish-shell/issues/3497) randomcan now havestart,stopandstepvalues specified, or the newchoicesubcommand 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 likefish_vi_key_bindingsin fish 2.3.0 (#3556—https://github.com/fish-shell/fish-shell/issues/3556). functionnow 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
testbuilt-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). completeno longer recognises--authoritativeand--unauthoritativeoptions, and they are marked as obsolete.statusaccepts subcommands, and should be used likestatus is-interactive. The old options continue to be supported for the foreseeable future (#3526—https://github.com/fish-shell/fish-shell/issues/3526), although only one subcommand or option can be specified at a time.- Selection mode (used with "begin-selection") no longer selects a character the cursor does not move over (
#3684—https://github.com/fish-shell/fish-shell/issues/3684). - List indexes are handled better, and a bit more liberally in some cases (
echo $PATH[1 .. 3]is now valid) (#3579—https://github.com/fish-shell/fish-shell/issues/3579). - The
fish_mode_promptfunction is now simply a stub aroundfish_default_mode_prompt, which allows the mode prompt to be included more easily in customised prompt functions (#3641—https://github.com/fish-shell/fish-shell/issues/3641).
🛠️ Notable fixes and improvements
alias, run without options or arguments, lists all defined aliases, and aliases now include a description in the function signature that identifies them.completeaccepts empty strings as descriptions (#3557—https://github.com/fish-shell/fish-shell/issues/3557).commandaccepts-q/--quietin 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
--helpoptions work better with copying and pasting (#2673—https://github.com/fish-shell/fish-shell/issues/2673). helplaunches the browser specified by the$fish_help_browservariable if it is set (#3131—https://github.com/fish-shell/fish-shell/issues/3131).- History merging could lose items under certain circumstances and is now fixed (
#3496—https://github.com/fish-shell/fish-shell/issues/3496). - The
$statusvariable is now set to123when 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_hostnamefunction which prints a hostname suitable for use in prompts (#3482—https://github.com/fish-shell/fish-shell/issues/3482). - The
__fish_man_pagefunction (bound to Alt+h by default) now tries to recognize subcommands (e.g.git addwill now open the "git-add" man page) (#3678—https://github.com/fish-shell/fish-shell/issues/3678). - A new function
edit_command_buffer(bound to Alt+e & Alt+v by default) to edit the command buffer in an external editor (#1215—https://github.com/fish-shell/fish-shell/issues/1215,#3627—https://github.com/fish-shell/fish-shell/issues/3627). set_colornow supports italics (--italics), dim (--dim) and reverse (--reverse) modes (#3650—https://github.com/fish-shell/fish-shell/issues/3650).- Filesystems with very slow locking (eg incorrectly-configured NFS) will no longer slow fish down (
#685—https://github.com/fish-shell/fish-shell/issues/685). - Improved completions for
apt(#3695—https://github.com/fish-shell/fish-shell/issues/3695),fusermount(#3642—https://github.com/fish-shell/fish-shell/issues/3642),make(#3628—https://github.com/fish-shell/fish-shell/issues/3628),netctl-auto(#3378—https://github.com/fish-shell/fish-shell/issues/3378),nmcli(#3648—https://github.com/fish-shell/fish-shell/issues/3648),pygmentize(#3378—https://github.com/fish-shell/fish-shell/issues/3378), andtar(#3719—https://github.com/fish-shell/fish-shell/issues/3719). - Added completions for:
VBoxHeadless(#3378—https://github.com/fish-shell/fish-shell/issues/3378)VBoxSDL(#3378—https://github.com/fish-shell/fish-shell/issues/3378)base64(#3378—https://github.com/fish-shell/fish-shell/issues/3378)caffeinate(#3524—https://github.com/fish-shell/fish-shell/issues/3524)dconf(#3638—https://github.com/fish-shell/fish-shell/issues/3638)dig(#3495—https://github.com/fish-shell/fish-shell/issues/3495)dpkg-reconfigure(#3521—https://github.com/fish-shell/fish-shell/issues/3521ෂ—https://github.com/fish-shell/fish-shell/issues/3522)feh(#3378—https://github.com/fish-shell/fish-shell/issues/3378)launchctl(#3682—https://github.com/fish-shell/fish-shell/issues/3682)lxc(#3554—https://github.com/fish-shell/fish-shell/issues/3554෬—https://github.com/fish-shell/fish-shell/issues/3564),mddiagnose(#3524—https://github.com/fish-shell/fish-shell/issues/3524)mdfind(#3524—https://github.com/fish-shell/fish-shell/issues/3524)mdimport(#3524—https://github.com/fish-shell/fish-shell/issues/3524)mdls(#3524—https://github.com/fish-shell/fish-shell/issues/3524)mdutil(#3524—https://github.com/fish-shell/fish-shell/issues/3524)mkvextract(#3492—https://github.com/fish-shell/fish-shell/issues/3492)nvram(#3524—https://github.com/fish-shell/fish-shell/issues/3524)objdump(#3378—https://github.com/fish-shell/fish-shell/issues/3378)sysbench(#3491—https://github.com/fish-shell/fish-shell/issues/3491)tmutil(#3524—https://github.com/fish-shell/fish-shell/issues/3524)
🎀 FISH 2.4.0 (RELEASED NOVEMBER 8, 2016) 🎀
There are no major changes between 2.4b1 and 2.4.0.
🌸 Notable fixes and improvements
- The documentation is now generated properly and with the correct version identifier.
- Automatic cursor changes are now only enabled on the subset of XTerm versions known to support them, resolving a problem where older versions printed garbage to the terminal before and after every prompt (
#3499—https://github.com/fish-shell/fish-shell/issues/3499). - Improved the title set in Apple Terminal.app.
- Added completions for
defaultsand improved completions fordiskutil(#3478—https://github.com/fish-shell/fish-shell/issues/3478).
FISH 2.4B1 (RELEASED OCTOBER 18, 2016)
✨ Significant changes ✨
- The clipboard situation got a total glow-up with explicit bindings. The killring commands no longer copy from, or paste to, the X11 clipboard — use the new
copy(C-x) andpaste(C-v) bindings instead. And bestie, the clipboard is now available on OS X as well as systems using X11 (e.g. Linux).#3061 <https://github.com/fish-shell/fish-shell/issues/3061> historyuses subcommands (history delete) rather than options (history --delete) for its actions#3367 <https://github.com/fish-shell/fish-shell/issues/3367>. So yeah — you can no longer specify multiple actions via flags (e.g.,history --delete --save something). That door is closed, periodt.- New
historyoptions have been added, including--max=nto limit the number of history entries,--show-timeoption to show timestamps#3175 <https://github.com/fish-shell/fish-shell/issues/3175>,#3244 <https://github.com/fish-shell/fish-shell/issues/3244>, and--nullto null terminate history entries in the search output. history searchis now case-insensitive by default (which also affectshistory delete)#3236 <https://github.com/fish-shell/fish-shell/issues/3236>.history deletenow correctly handles multiline commands#31 <https://github.com/fish-shell/fish-shell/issues/31>. Finally, honestly 😭- 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.8will be used#277 <https://github.com/fish-shell/fish-shell/issues/277>. - A number followed by a caret (e.g.
5^) is no longer treated as a redirection#1873 <https://github.com/fish-shell/fish-shell/issues/1873>. - The
$versionspecial variable can be overwritten, so that it can be used for other purposes if required. main character energy, it can be anything now 💅
🎀 Notable fixes and improvements 🎀
- The
fish_realpathbuiltin has been renamed torealpathand made compatible with GNUrealpathwhen run without arguments#3400 <https://github.com/fish-shell/fish-shell/issues/3400>. It is used only for systems without arealpathorgrealpathutility#3374 <https://github.com/fish-shell/fish-shell/issues/3374>. - Improved color handling on terminals/consoles with 8-16 colors, particularly the use of bright named color
#3176 <https://github.com/fish-shell/fish-shell/issues/3176>,#3260 <https://github.com/fish-shell/fish-shell/issues/3260>. Your palette is thriving ✨ fish_indentcan 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>. jobsshould only print its header line once#3127 <https://github.com/fish-shell/fish-shell/issues/3127>.- Wildcards in redirections are highlighted appropriately
#2789 <https://github.com/fish-shell/fish-shell/issues/2789>. - Suggestions will be offered more often, like after removing characters
#3069 <https://github.com/fish-shell/fish-shell/issues/3069>. history --mergenow correctly interleaves items in chronological order#2312 <https://github.com/fish-shell/fish-shell/issues/2312>.- Options for
fish_indenthave been aligned with the other binaries — in particular,-dnow means--debug. The--dumpoption has been renamed to--dump-parse-tree#3191 <https://github.com/fish-shell/fish-shell/issues/3191>. - The display of bindings in the Web-based configuration has been greatly improved
#3325 <https://github.com/fish-shell/fish-shell/issues/3325>, as has the rendering of prompts#2924 <https://github.com/fish-shell/fish-shell/issues/2924>. - fish should no longer hang using 100% CPU in the C locale
#3214 <https://github.com/fish-shell/fish-shell/issues/3214>. No more jet engine impersonations, we stan 💀 - 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>. Aesthetic and functional 🦋 - Command lines with escaped space characters at the end tab-complete correctly
#2447 <https://github.com/fish-shell/fish-shell/issues/2447>. - Added completions for:
arcanist#3256 <https://github.com/fish-shell/fish-shell/issues/3256>connmanctl#3419 <https://github.com/fish-shell/fish-shell/issues/3419>figlet#3378 <https://github.com/fish-shell/fish-shell/issues/3378>mdbook#3378 <https://github.com/fish-shell/fish-shell/issues/3378>ninja#3415 <https://github.com/fish-shell/fish-shell/issues/3415>p4, the Perforce client#3314 <https://github.com/fish-shell/fish-shell/issues/3314>pygmentize#3378 <https://github.com/fish-shell/fish-shell/issues/3378>ranger#3378 <https://github.com/fish-shell/fish-shell/issues/3378>
- Improved completions for
aura#3297 <https://github.com/fish-shell/fish-shell/issues/3297>,abbr#3267 <https://github.com/fish-shell/fish-shell/issues/3267>,brew#3309 <https://github.com/fish-shell/fish-shell/issues/3309>,chown#3380 <https://github.com/fish-shell/fish-shell/issues/3380>,#3383 <https://github.com/fish-shell/fish-shell/issues/3383>,cygport#3392 <https://github.com/fish-shell/fish-shell/issues/3392>,git#3274 <https://github.com/fish-shell/fish-shell/issues/3274>,#3226 <https://github.com/fish-shell/fish-shell/issues/3226>,#3225 <https://github.com/fish-shell/fish-shell/issues/3225>,#3094 <https://github.com/fish-shell/fish-shell/issues/3094>,#3087 <https://github.com/fish-shell/fish-shell/issues/3087>,#3035 <https://github.com/fish-shell/fish-shell/issues/3035>,#3021 <https://github.com/fish-shell/fish-shell/issues/3021>,#2982 <https://github.com/fish-shell/fish-shell/issues/2982>,#3230 <https://github.com/fish-shell/fish-shell/issues/3230>,kill&pkill#3200 <https://github.com/fish-shell/fish-shell/issues/3200>,screen#3271 <https://github.com/fish-shell/fish-shell/issues/3271>,wget#3470 <https://github.com/fish-shell/fish-shell/issues/3470>, andxz#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=1to get verbose output#3248 <https://github.com/fish-shell/fish-shell/issues/3248>. Quiet, mysterious, slay. - Improved compatibility with minor platforms including musl
#2988 <https://github.com/fish-shell/fish-shell/issues/2988>, Cygwin#2993 <https://github.com/fish-shell/fish-shell/issues/2993>, Android#3441 <https://github.com/fish-shell/fish-shell/issues/3441>,#3442 <https://github.com/fish-shell/fish-shell/issues/3442>, Haiku#3322 <https://github.com/fish-shell/fish-shell/issues/3322>and Solaris .
FISH 2.3.1 (RELEASED JULY 3, 2016)
Okay so this one is a functionality and bugfix release. Heads up though — this release does not contain all the changes to fish since the last release, but it fixes a number of issues directly affecting users at present and includes a small number of new features. Not a full makeover, more like a targeted touch-up 💅
🌸 Significant changes 🌸
- A new
fish_key_readerbinary for decoding interactive keypresses#2991 <https://github.com/fish-shell/fish-shell/issues/2991>. She's new here and she's iconic. fish_mode_prompthas 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_configcan now properly be launched from the OS X app bundle#3140 <https://github.com/fish-shell/fish-shell/issues/3140>. No cap, it actually launches now.
🦋 Notable fixes and improvements 🦋
- Extra lines were sometimes inserted into the output under Windows (Cygwin and Microsoft Windows Subsystem for Linux) due to TTY timestamps not being updated
#2859 <https://github.com/fish-shell/fish-shell/issues/2859>. Ghost lines? Not on our watch 👻 - The
stringbuiltin’s match mode now handles the combination of-rnv(match, invert and count) correctly#3098 <https://github.com/fish-shell/fish-shell/issues/3098>. - Improvements to TTY special character handling
#3064 <https://github.com/fish-shell/fish-shell/issues/3064>, locale handling#3124 <https://github.com/fish-shell/fish-shell/issues/3124>and terminal environment variable handling#3060 <https://github.com/fish-shell/fish-shell/issues/3060>. - Work towards handling the terminal modes for external commands launched from initialisation files
#2980 <https://github.com/fish-shell/fish-shell/issues/2980>. - Ease the upgrade path from fish 2.2.0 and before by warning users to restart fish if the
stringbuiltin is not available#3057 <https://github.com/fish-shell/fish-shell/issues/3057>. Friendliest possible "bestie pls restart" energy. type -anow syntax-colorizes function source output. So pretty, so readable ✨- Added completions for
alsamixer,godoc,gofmt,goimports,gorename,lscpu,mkdir,modinfo,netctl-auto,poweroff,termite,udisksctlandxz#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>,stringandsuspend#3154 <https://github.com/fish-shell/fish-shell/issues/3154>.
🎀 FISH 2.3.0 (RELEASED MAY 20, 2016) 🎀
okay so bestie, real talk: there are, like, literally no significant changes between 2.3.0 and 2.3b2. That's it. That's the whole vibe. Moving on. ✨
💅 Other notable fixes and improvements
abbrnow allows non-letter keys (#2996). yes queen, keys that aren't letters. we love flexibility.- Define a few extra colours on first start (
#2987). first impressions matter, so we're coming in with a full palette. 🌈 - Multiple documentation updates. the docs got a glow-up.
- Added completions for
rmmod(#3007). so you can't forget how modules work while you're removing them. - Improved completions for
git(#2998). git completions keep getting better and honestly? obsessed.
😭 Known issues
- Interactive commands started from fish configuration files or from the
-coption may, under certain circumstances, be started with incorrect terminal modes and fail to behave as expected. A fix is planned but requires further testing (#2619). lowkey a real one — so heads up, this is a genuine known bug, not a vibe, and the fix is still marinating.
🦋 FISH 2.3B2 (RELEASED MAY 5, 2016) 🦋
✨ Significant changes
- A new
fish_realpathbuiltin and associated function to allow the use ofrealpatheven on those platforms that don't ship an appropriate command (#2932). norealpathon your system? not anymore bestie. - Alt+# toggles the current command line between commented and uncommented states, making it easy to save a command in history without executing it. the way that just… saves a command to history without running it? main character energy fr. 👑
- The
fish_vi_modefunction is now deprecated in favour offish_vi_key_bindings. deprecated means move on, babe — use the new name.
💖 Other notable fixes and improvements
- Fix the build on Cygwin (
#2952) and RedHat Enterprise Linux/CentOS 5 (#2955). we build where you build. - Avoid confusing the terminal line driver with non-printing characters in
fish_title(#2453). the terminal line driver was getting confused and we said no more of that. - Improved completions for
busctl,git(#2585,#2879,#2984), andnetctl. completion sweep, slay. 🧚
🌸 FISH 2.3B1 (RELEASED APRIL 19, 2016) 🌸
🔥 Significant Changes
- A new
stringbuiltin to handle… strings! This builtin will measure, split, search and replace text strings, including using regular expressions. It can also be used to turn lists into plain strings usingjoin.stringcan be used in place ofsed,grep,tr,cut, andawkin many situations. (#2296) — okay this is THE moment. it's giving builtin that eats the classic tools' lunch. iconic. 💅 - Allow using escape as the Meta modifier key, by waiting after seeing an escape character wait up to
300msfor an additional character. This is consistent withreadline(e.g.bash) and can be configured via thefish_escape_delay_msvariable. This allows using escape as the Meta modifier. (#1356) — note the number,300ms, and the variable namefish_escape_delay_ms, bestie, they're all doing work here. - Add new directories for vendor functions and configuration snippets (
#2500). vendor stuff gets its own lil home. - A new
fish_realpathbuiltin and associatedrealpathfunction should allow scripts to resolve path names viarealpathregardless of whether there is an external command of that name; albeit with some limitations. See the associated documentation. limitations are mentioned, so go read the docs, i'm not making things up.
💀 Backward-incompatible changes
bestie, this whole list is stuff that WILL break your old setup. read it. absorb it. i'm serious. 😭
- Unmatched globs will now cause an error, except when used with
for,setorcount(#2719). andandorwill now bind to the closestiforwhile, allowing compound conditions withoutbeginandend(#1428).set -qlnow searches up to function scope for variables (#2502).status -fwill now behave the same when run as the main script or usingsource(#2643).sourceno longer puts the file name in$argvif no arguments are given (#139).- History files are stored under the
XDG_DATA_HOMEhierarchy (by default, in~/.local/share), and existing history will be moved on first use (#744). your history is moving house and honestly it'll be happier there.
🍓 Other notable fixes and improvements
- fish no longer silences errors in
config.fish(#2702). if something's wrong in there, you'll hear about it now. no more secrets. - Directory autosuggestions will now descend as far as possible if there is only one child directory (
#2531). it just keeps going down. as far as possible. one child at a time. - Add support for bright colors (
#1464). brights are in, we're glowing. ✨ - Allow Ctrl+J (
\cj) to be bound separately from Ctrl+M (\cm) (#217). they were previously the same party and now they get their own. psubnow has a-s/-suffixoption to name the temporary file with that suffix. yes the quotes in the original are curly, the flag is-sand the long one is-suffix, that's the whole deal.- Enable 24-bit colors on select terminals (
#2495). 24-BIT COLOR. on select terminals, so don't come for me if yours isn't one. - Support for SVN status in the prompt (
#2582). - Mercurial and SVN support have been added to the Classic + Git (now Classic + VCS) prompt (via the new
__fish_vcs_promptfunction) (#2592). it's not just git anymore, it's a whole VCS situation. exportnow handles variables with a=in the value (#2403). yes, the value. the=inside the value. handled.- New completions for:
alsactl- Archlinux's
asp,makepkg - Atom's
apm(#2390) entr- the "Event Notify Test Runner" (#2265)- Fedora's
dnf(#2638) - OSX
diskutil(#2738) pkgng(#2395)- pulseaudio's
pacmdandpactl - rust's
rustcandcargo(#2409) sysctl(#2214)- systemd's
machinectl(#2158),busctl(#2144),systemd-nspawn,systemd-analyze,localectl,timedatectl - and more
- fish no longer has a function called
sgrep, freeing it for user customization (#2245). it's yours now. name your childsgrepif you want. - A rewrite of the completions for
cd, fixing a few bugs (#2299,#2300,#562). thecdcompletions got a full makeover and honestly she's serving. - Linux VTs now run in a simplified mode to avoid issues (
#2311). - The vi-bindings now inherit from the emacs bindings.
- fish will also execute
fish_user_key_bindingswhen in vi-mode. yes, even in vi-mode. equal treatment. 🫶 funcedwill now also check$VISUAL(#2268).- A new
suspendfunction (#2269). - Subcommand completion now works better with split
/usr(#2141). - The command-not-found-handler can now be overridden by defining a function called
__fish_command_not_found_handlerinconfig.fish(#2332). your handler, your rules. - A few fixes to the Sorin theme. a lil touch-up, she's fine.
PWDshortening in the prompt can now be configured via thefish_prompt_pwd_dir_lengthvariable, set to the length per path component (#2473).- fish no longer requires
/etc/fish/config.fishto correctly start, and now ships a skeleton file that only contains some documentation (#2799). it boots without it bestie, the skeleton file is just vibes and docs.
🌸 FISH 2.2.0 (RELEASED JULY 12, 2015) 🌸
✨ Significant changes ✨
- Abbreviations, bestie!! The brand-new
abbrcommand gives you interactively-expanded abbreviations, so your most-used commands are literally right there at your fingertips (#731—https://github.com/fish-shell/fish-shell/issues/731). Obsessed. - Vi mode is here 🎀 — run
fish_vi_modeand fish switches into the key bindings and the prompt that Vi editor girlies already know and love (#65—https://github.com/fish-shell/fish-shell/issues/65). - A brand-new inline and interactive pager that the zsh crowd will feel right at home with (
#291—https://github.com/fish-shell/fish-shell/issues/291). Iconic. - Underlying architectural changes, and this one's the big one 👑 — the
fishduniversal variable server has been removed, because it was a whole source of many bugs and security problems. Heads up though: old fish sessions will not be able to communicate universal variable changes with new fish sessions. For best results, restart all running instances of fish. No cap. - The web-based configuration tool got a glow-up 💅 — it's been redesigned, and it features a prompt theme chooser plus other improvements.
- New translations in German, Brazilian Portuguese, and Chinese 🌈.
💀 Backward-incompatible changes 💀
These are kept to a minimum, but they either change undocumented features or are just too hard to use in their existing forms. Ngl, these changes may break existing scripts.
commandlineno longer interprets functions "in reverse" — instead it behaves as expected (#1567—https://github.com/fish-shell/fish-shell/issues/1567).- The previously-undocumented
CMD_DURATIONvariable is now set for all commands and contains the execution time of the last command in milliseconds (#1585—https://github.com/fish-shell/fish-shell/issues/1585). It is no longer exported to other commands (#1896—https://github.com/fish-shell/fish-shell/issues/1896). if/elseconditional statements now return values consistent with the Single Unix Specification, like other shells do (#1443—https://github.com/fish-shell/fish-shell/issues/1443).- A new "top-level" local scope has been added, so local variables declared on the commandline are now 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 version1.8.7or newer to build. - fish now defines a default directory for other packages to drop their completions into. By default this is
/usr/share/fish/vendor-completions.d; on systems with pkgconfig installed, this path is discoverable withpkg-config --variable completionsdir fish. - A brand-new parser that removes a bunch of bugs 💖 — all existing syntax should keep working.
- New
fish_preexecandfish_postexecevents are fired before and after job execution respectively (#1549—https://github.com/fish-shell/fish-shell/issues/1549). - Unmatched wildcards no longer prevent a job from running. Wildcards used interactively will still print an error, but the job will proceed and the wildcard will expand to zero arguments (
#1482—https://github.com/fish-shell/fish-shell/issues/1482). - The
.command is deprecated and thesourcecommand is preferred (#310—https://github.com/fish-shell/fish-shell/issues/310). Usesource, bestie 🥺. bindsupports "bind modes", which lets bindings be set for a particular named mode — this is what makes the Vi mode implementation possible.- A new
exportalias, which behaves like it does in other shells (#1833—https://github.com/fish-shell/fish-shell/issues/1833). commandhas a new--searchoption to print the name of the disk file that would be executed, just like other shells'command -v(#1540—https://github.com/fish-shell/fish-shell/issues/1540).commandlinehas a new--paging-modeoption to support the new pager.completehas a new--wrapsoption, which allows a command to (recursively) inherit the completions of a wrapped command (#393—https://github.com/fish-shell/fish-shell/issues/393), andcomplete -enow correctly erases completions (#380—https://github.com/fish-shell/fish-shell/issues/380).- Completions are now generated from manual pages by default on the first run of fish (
#997—https://github.com/fish-shell/fish-shell/issues/997). She's resourceful 💅. fish_indentcan now produce colorized (--ansi) and HTML (--html) output (#1827—https://github.com/fish-shell/fish-shell/issues/1827).functions --erasenow prevents autoloaded functions from being reloaded in the current session.historyhas a new--mergeoption, to incorporate history from other sessions into the current session (#825—https://github.com/fish-shell/fish-shell/issues/825).jobsreturns1if there are no active jobs (#1484—https://github.com/fish-shell/fish-shell/issues/1484).readhas several new options:--arrayto break input into an array (#1540—https://github.com/fish-shell/fish-shell/issues/1540)--nullto break lines on NUL characters rather than newlines (#1694—https://github.com/fish-shell/fish-shell/issues/1694)--ncharsto read a specific number of characters (#1616—https://github.com/fish-shell/fish-shell/issues/1616)--right-promptto display a right-hand-side prompt during interactiveread(#1698—https://github.com/fish-shell/fish-shell/issues/1698)
typehas a new-qoption to suppress output (#1540—https://github.com/fish-shell/fish-shell/issues/1540) and, like other shells,type -anow 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). Life-changing, fr. fish_titlefunctions have access to the arguments of the currently running argument as$argv[1](#1542—https://github.com/fish-shell/fish-shell/issues/1542).- The OS command-not-found handler is used on Arch Linux (
#1925—https://github.com/fish-shell/fish-shell/issues/1925), nixOS (#1852—https://github.com/fish-shell/fish-shell/issues/1852), openSUSE and Fedora (#1280—https://github.com/fish-shell/fish-shell/issues/1280). - Alt+. searches backwards in the token history, mapping to the same behavior as inserting the last argument of the previous command, like other shells (
#89—https://github.com/fish-shell/fish-shell/issues/89). - The
SHLVLenvironment variable is incremented correctly (#1634—https://github.com/fish-shell/fish-shell/issues/1634ڝ—https://github.com/fish-shell/fish-shell/issues/1693). - Added completions for:
adb(#1165—https://github.com/fish-shell/fish-shell/issues/1165һ—https://github.com/fish-shell/fish-shell/issues/1211),apt(#2018—https://github.com/fish-shell/fish-shell/issues/2018),aura(#1292—https://github.com/fish-shell/fish-shell/issues/1292),composer(#1607—https://github.com/fish-shell/fish-shell/issues/1607),cygport(#1841—https://github.com/fish-shell/fish-shell/issues/1841),dropbox(#1533—https://github.com/fish-shell/fish-shell/issues/1533),elixir(#1167—https://github.com/fish-shell/fish-shell/issues/1167),fossil,heroku(#1790—https://github.com/fish-shell/fish-shell/issues/1790),iex(#1167—https://github.com/fish-shell/fish-shell/issues/1167),kitchen(#2000—https://github.com/fish-shell/fish-shell/issues/2000),nix(#1167—https://github.com/fish-shell/fish-shell/issues/1167),node/npm(#1566—https://github.com/fish-shell/fish-shell/issues/1566),opam(#1615—https://github.com/fish-shell/fish-shell/issues/1615),setfacl(#1752—https://github.com/fish-shell/fish-shell/issues/1752),tmuxinator(#1863—https://github.com/fish-shell/fish-shell/issues/1863), andyast2(#1739—https://github.com/fish-shell/fish-shell/issues/1739). Slay. - Improved completions for:
brew(#1090—https://github.com/fish-shell/fish-shell/issues/1090ܒ—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ޟ—https://github.com/fish-shell/fish-shell/issues/1951),man(#960—https://github.com/fish-shell/fish-shell/issues/960),modprobe(#1124—https://github.com/fish-shell/fish-shell/issues/1124),pacman(#1292—https://github.com/fish-shell/fish-shell/issues/1292),rpm(#1236—https://github.com/fish-shell/fish-shell/issues/1236),rsync(#1872—https://github.com/fish-shell/fish-shell/issues/1872),scp(#1145—https://github.com/fish-shell/fish-shell/issues/1145),ssh(#1234—https://github.com/fish-shell/fish-shell/issues/1234),sshfs(#1268—https://github.com/fish-shell/fish-shell/issues/1268),systemctl(#1462—https://github.com/fish-shell/fish-shell/issues/1462,#1950—https://github.com/fish-shell/fish-shell/issues/1950޴—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), andzypper(#1787—https://github.com/fish-shell/fish-shell/issues/1787).
🦋 FISH 2.1.2 (RELEASED FEB 24, 2015) 🦋
fish 2.1.2 contains a workaround for a filesystem bug in Mac OS X Yosemite 💀. #1859 — https://github.com/fish-shell/fish-shell/issues/1859
Specifically, after installing fish 2.1.1 and then rebooting, "Verify Disk" in Disk Utility will report "Invalid number of hard links." We don't have any reports of data loss or other adverse consequences, okay? Breathe. fish 2.1.2 avoids triggering the bug, but it 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: bestie if you're upgrading, stop all running instances offishdas soon as possible after installing this release — it'll restart itself automatically, don't worry. On most systems there's literally nothing else you need to do. But heads up: some environments (the ones whereXDG_RUNTIME_DIRis set), like Fedora 20, will need you to restart all running fish processes before universal variables work the way they're supposed to. 😭
Distributors, please — you're highly encouraged to call killall fishd, pkill fishd or something similar in your installation scripts, or at least warn your users to do it themselves. 🫶
🔒 Security fixes
- The
fish_configweb interface now uses an authentication token to protect requests, and it only responds to requests from the local machine that carry this token — which prevents a remote code execution attack. (closing CVE-2014-2914).#1438 psubandfuncedare no longer vulnerable to attacks which allow local privilege escalation and data tampering (closing CVE-2014-2906 and CVE-2014-3856).#1437fishduses a secure path for its socket, which prevents a local privilege escalation attack (closing CVE-2014-2905).#1436__fish_print_packagesis no longer vulnerable to attacks which would allow local privilege escalation and data tampering (closing CVE-2014-3219).#1440
✨ Other fixes
fishdnow ignoresSIGPIPE, which fixes crashes when using tools like GNU Parallel — crashes that happened more often as a result of the otherfishdchanges, ngl.#1084ښ
🦋 FISH 2.1.0 🦋
🌟 Significant Changes
- Tab completions will fuzzy-match files.
#568
Okay so when you tab-complete a file, fish first tries prefix matches (foo matches foobar), then substring matches (ooba matches foobar), and lastly subsequence matches (fbr matches foobar). Example time: in a directory with files foo1.txt, foo2.txt, foo3.txt…, you can type just the numeric part and hit tab to fill in the rest. obsessed.
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,#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
Before this, 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. And if no job is in the background, it'll just fail to expand. So 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 - VTE based terminals should now know the working directory.
#906 - The autotools build now works on Mavericks.
#968 - The end-of-line binding (ctrl+E) now accepts autosuggestions.
#932 - Directories in
/etc/paths(used on OS X) are now prepended instead of appended, similar to other shells.#927 - Option-right-arrow (used for partial autosuggestion completion) now works on iTerm2.
#920 - Tab completions now work properly within nested subcommands.
#913 printfsupports\e, the escape character.#910fish_config historyno longer shows duplicate items.#900$fish_user_pathsis now prepended to$PATHinstead of appended.#888- Jobs complete when all processes complete.
#876
For example, in previous versions of fish, sleep 10 | echo Done returns control immediately, because echo does not read from stdin. Now it does not complete until sleep exits (presumably after 10 seconds). character development tbh
- Better error reporting for square brackets.
#875 - fish no longer tries to add
/binto$PATHunlessPATHis totally empty.#852 - History token substitution (alt+up) now works correctly inside subshells.
#833 - Flow control is now disabled, freeing up ctrl+S and ctrl+Q for other uses.
#814 - sh-style variable setting like
foo=barnow produces better error messages.#809 - Commands with wildcards no longer produce autosuggestions.
#785 funcedno longer freaks out when supplied with no arguments.#780fish.appnow works correctly in a directory containing spaces.#774- Tab completion cycling no longer occasionally fails to repaint.
#765 - Comments now work in
eval'd strings.#684 - History search (up-arrow) now shows the item matching the autosuggestion, if that autosuggestion was truncated.
#650 - Ctrl+T now transposes characters, as in other shells.
#128
<h2>🌸 Other Notable Fixes 🌸</h2>
- VCS completions got a glow-up —
darcs,cvs,svn, etc. all refreshed 💅 - We stopped calling
getcwdon the main thread, because it can literally hang — no cap 😭 (#696—https://github.com/fish-shell/fish-shell/issues/696) - Ctrl+D (forward delete) no longer slams to a stop at a period — it just keeps going (
#667—https://github.com/fish-shell/fish-shell/issues/667) - Completions for sooo many new commands 🎀
- fish now respects rxvt's unique keybindings, iykyk (
#657—https://github.com/fish-shell/fish-shell/issues/657) xselis not built as part of fish anymore. It'll still get invoked if you installed it separately, tho (#633—https://github.com/fish-shell/fish-shell/issues/633)__fish_filter_mimeno longer spews (#628—https://github.com/fish-shell/fish-shell/issues/628)- the
-no-executeoption tofishno longer falls over when it reaches the end of a block (#624—https://github.com/fish-shell/fish-shell/issues/624) fish_configknows how to find fish even when it's not in your$PATH(#621—https://github.com/fish-shell/fish-shell/issues/621)- a leading space now stops the line from being written to history, exactly like bash and zsh do it (
#615—https://github.com/fish-shell/fish-shell/issues/615) - hitting enter after a backslash only drops you to a new line if the backslash is followed by whitespace or the end of the line (
#613—https://github.com/fish-shell/fish-shell/issues/613) printfis a builtin now ⭐ (#611—https://github.com/fish-shell/fish-shell/issues/611)- event handlers shouldn't fire anymore when signals are blocked (
#608—https://github.com/fish-shell/fish-shell/issues/608) set_coloris a builtin now too (#578—https://github.com/fish-shell/fish-shell/issues/578)- man page completions moved — they live in a brand new
generated_completionsdirectory now instead of yourcompletionsdirectory (#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 completing from inside a pair of quotes now tries to "appropriate" the closing quote for you 🫶 (
#552—https://github.com/fish-shell/fish-shell/issues/552) $EDITORcan be a list now — like, for example,set EDITOR gvim -f)(#541—https://github.com/fish-shell/fish-shell/issues/541)casebodies get indented now, finally (#530—https://github.com/fish-shell/fish-shell/issues/530)- the profile switch
-pno longer crashes (#517—https://github.com/fish-shell/fish-shell/issues/517) - you can Ctrl+C your way out of
readnow (#516—https://github.com/fish-shell/fish-shell/issues/516) umaskactually works on OS X now (#515—https://github.com/fish-shell/fish-shell/issues/515)- stopped calling
getpwnamon the main thread, because 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, which is honestly iconic of it (
#367—https://github.com/fish-shell/fish-shell/issues/367) - backslashes join lines now instead of creating multiple commands (
#347—https://github.com/fish-shell/fish-shell/issues/347) echoimplements the-eflag to interpret escapes (#337—https://github.com/fish-shell/fish-shell/issues/337)- when the last token in your input has capital letters, fish uses its case in preference to the autosuggestion's case, which is very main character of you (
#335—https://github.com/fish-shell/fish-shell/issues/335) - descriptions have their own muted color now (
#279—https://github.com/fish-shell/fish-shell/issues/279) - wildcards starting with a
.(likels .*) no longer match.and..(#270—https://github.com/fish-shell/fish-shell/issues/270) - recursive wildcards handle symlink loops now 🌀 (
#268—https://github.com/fish-shell/fish-shell/issues/268) - you can delete history items right from the
fish_configweb interface (#250—https://github.com/fish-shell/fish-shell/issues/250) - the OS X build weak links
wcsdupandwcscasecmp(#240—https://github.com/fish-shell/fish-shell/issues/240) - fish saves and restores the process group now, which stops certain processes from being wrongly reported as stopped (
#197—https://github.com/fish-shell/fish-shell/issues/197) funcedtakes an editor option now (#187—https://github.com/fish-shell/fish-shell/issues/187)- alternating row colors are available in the fish pager via
fish_pager_color_secondary✨ (#186—https://github.com/fish-shell/fish-shell/issues/186) - universal variable values are stored based on your MAC address now, not your hostname (
#183—https://github.com/fish-shell/fish-shell/issues/183) - the caret
^only does a stderr redirection if it's the first character of a token — this one's for the git girlies, it made them happy (#168—https://github.com/fish-shell/fish-shell/issues/168) - autosuggestions 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 makes
sudoask for a password every single time, thank god 😭 - fish behaves better under Midnight Commander (
#121—https://github.com/fish-shell/fish-shell/issues/121) set -eno longer crashes (#100—https://github.com/fish-shell/fish-shell/issues/100)- fish will automatically import history from bash if there's no fish history yet (
#66—https://github.com/fish-shell/fish-shell/issues/66) - backslashed-newlines inside quoted strings behave more intuitively now (
#52—https://github.com/fish-shell/fish-shell/issues/52) - tab titles show up correctly in iTerm2 (
#47—https://github.com/fish-shell/fish-shell/issues/47) scpremote path completion sometimes works now, which is lowkey all you can ask for (#42—https://github.com/fish-shell/fish-shell/issues/42)- the
readbuiltin no longer shows autosuggestions (#29—https://github.com/fish-shell/fish-shell/issues/29) - custom key bindings can be set via the
fish_user_key_bindingsfunction 🎀 (#21—https://github.com/fish-shell/fish-shell/issues/21) - all Python scripts run correctly under both Python 2 and Python 3 (
#14—https://github.com/fish-shell/fish-shell/issues/14) - the "accept autosuggestion" key is configurable now (
#19—https://github.com/fish-shell/fish-shell/issues/19) - autosuggestions will not suggest invalid commands anymore (
#6—https://github.com/fish-shell/fish-shell/issues/6)
🦋 FISHFISH BETA R2 🦋
<h2>🐛 Bug Fixes 🐛</h2>
- Implicit
cdis 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. That's a strange job-control feature of BSD systems, OS X included. Disabling it frees up Control+Y for other stuff — specifically for
yank, which now works on OS X. fish_indentis fixed. Especially,funcedandfuncsavework again.- a
SIGTERMends the whole execution stack again now (resolving#13—https://github.com/fish-shell/fish-shell/issues/13). - bumped the
__fish_config_interactiveversion number so the defaultfish_color_autosuggestionactually kicks in. fish_confighandles combined term256 and classic colors better — like"555 yellow".
<h2>🌻 New Features 🌻</h2>
- A
historybuiltin, plus an associated interactive function that lets you delete history items. Example usage:- print all history items beginning with
echo:history --prefix echo - print all history items containing
foo:history --contains foo - interactively delete some items containing
foo:history --delete --contains foo
- print all history items beginning with
Credit to @siteshwar for implementation. Thanks @siteshwar! 🫶
👑 FISHFISH BETA R1 👑
🧚 Scripting
- No changes! Like, literally zero 💅 Every single fish script, config file, completion, etc. from trunk should keep on working like nothing happened. Bestie behavior only.
✨ New Features ✨
- Autosuggestions 🩷 Think, like, the URL field in your browser. When you type a command, fish will suggest the rest of it after the cursor, in a muted gray when possible. You can accept that suggestion with the right arrow key or Ctrl+F. Where do the suggestions come from? Command history, completions, and some custom code for
cd— and there's a lot of potential for improvement here. The suggestions are computed on a backgroundpthread, so they never slow down your typing. The autosuggestion feature is incredible. The author misses it dearly every time they use anything else 😭🔥 term256support where available, specifically modern xterms and OS X Lion 🌈 You can specify colors the old way (set_color cyan) or by specifying RGB hex values (set_color FF3333); fish will pick the closest supported color. Some xterms do not advertiseterm256support either in the$TERMorterminfomax_colorsfield, 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's a new function,
fish_config. It 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 — and all changes apply immediately to all running shells. Eventually all configuration ought to be supported via this mechanism (but in addition to, not instead of, command line mechanisms). Both vibes, no rivalry 💖 - Man page completions 🦋 There's a new function,
fish_update_completions. It reads all theman1files from your manpath, removes the roff formatting, parses them to find the commands and options, and outputs fish completions into~/.config/fish/completions. It won't overwrite existing completion files (except ones that it generated itself). Respectful queen behavior 👑
🛠️ Programmatic Changes
- fish is now entirely in C++ 💀 The author has no particular love for C++, but it provides a ready memory-model to replace
halloc. They've made an effort to keep it to a sane and portable subset (noC++11, noboost, no going crazy with templates or smart pointers), but they do use the STL and a littletr1. hallocis entirely gone, replaced by normal C++ ownership semantics. If you don't know whathallocis, 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_thave been removed and replaced by STL equivalents likestd::vector,std::map, andstd::wstring. A lot of the string handling now usesstd::wstringinstead ofwchar_t *. - fish now spawns
pthreads for tasks like syntax highlighting that require blocking I/O 🧵 - History has been completely rewritten 📜 History files now use an extensible YAML-style syntax. History "merging" (multiple shells writing to the same history file) now works better. There is now a maximum history length of about 250k items (
256 * 1024). - The parser has been "instanced," so you can now create more than one 👯♀️
- Total #LoC has shrunk slightly even with the new features. Less code, more slay, that's the dream 🍓
⚡ Performance
- fish now runs syntax highlighting in a background thread, so typing commands is always responsive even on slow filesystems 🏃♀️💨
echo,test, andpwdare now builtins, which eliminates many forks 🔥- The files in
share/functionsandshare/completionsnow get 'internalized' into C strings that get compiled in with fish. This substantially reduces the number of files touched at startup. A consequence is that you cannot change these functions without recompiling — but often other functions depend on these "standard" functions, so changing them is perhaps not a good idea anyways 🙈
Here are some system call counts for launching and then exiting fish with the default configuration, on OS X. The first column is fish trunk, the next column is with our changes, and the last column is bash for comparison. This data was collected via dtrace.
open— before:9, after:4, bash:5fork— before:28, after:14, bash:0stat— before:131, after:85, bash:11lstat— before:670, after:0, bash:0read— before:332, after:80, bash:4write— before:172, after:149, bash:0
The large number of forks relative to bash are due to fish's insanely expensive default prompt, which is unchanged in my version. If we switch to a prompt comparable to bash's (lame) default, the forks drop to 16 with trunk, 4 after our changes 👀
The large reduction in lstat() numbers is due to fish no longer needing to call ttyname() on OS X 🎉
We've got some work to do to be as lean as bash, but we're on the right track 💪
🌸 Author
fish-shell developers
🫶 Copyright
fish-shell developers
And that's a wrap on the whole page, bestie 🎬💖 This one was rendered under version 4.9, dated Sep 08, 2026, and it's the FISH-RELEASENOTES(1) manual page — go forth and flex your history knowledge, ilysm 🌈👑✨
📦 where this page comes from
- arch rolling: fish 4.9.3-1 · GPL-2.0-only AND BSD-3-Clause AND ISC AND MIT AND PSF-2.0
- 💖 girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms