← Back to all sparks
F

fish shell

DEVOPS
Velocity2.5

Smart and user-friendly command line shell

Four minor versions in five months, and the shell's remaining work is almost all interaction detail.

shellrust-rewritevi-modeterminal-compatibilitylocalizationregression-churn
Current state
fish is deep into the 4.x Rust-era grind: 4.4.0 through 4.8.1 land in roughly five months, each carrying 60-234 commits from a steadily widening contributor base with new committers in every release. The changes are overwhelmingly interactive — keybindings, completion pager behavior, prompt handling, color variables. Each minor release is followed within days or weeks by a patch cleaning up its own regressions.
Where it's heading
Two threads run underneath the interaction polish. One is shedding legacy C-era dependencies: terminfo and ncurses are gone for good, and 4.8.0 moves Rust-side translation off GNU gettext onto Fluent with purpose-built tooling. The other is fitting into a modern terminal environment rather than working around old ones — OSC 133 prompt marking, systemd run0's prompt variables, emoji width defaulting to 2. The project is trading compatibility with terminals nobody runs for fidelity in the ones people actually use.
Prediction
Expect the gettext-to-Fluent migration to extend from Rust source into fish script messages, since 4.8.0 flags script translations as the remaining holdout, and expect the release-then-patch rhythm to continue given every minor in this window needed one.

Recent moves

  1. 25d ago

    fish 4.8.1 restores word-wise alt keybindings off macOS

    The now-standard cleanup pass after a minor: alt-backspace and friends go back to operating on words rather than tokens off macOS, and the Konsole prompt-marking workaround becomes opt-out via a feature flag instead of a hardcoded exception. Also splits builtin and function coloring into separate variables.

    View source ↗
  2. 1mo ago

    fish 4.8.0 moves Rust-side translations to Fluent

    234 commits from 39 authors, and the structural piece is the translation toolchain: Rust-defined messages move to Fluent with a new fluent-ftl-tools library, leaving script-defined messages on gettext for now. Consistent with the project's pattern of retiring C-era infrastructure a layer at a time.

    View source ↗
  3. 3mo ago

    fish 4.7.1 fixes fish_config failing to start

    A one-line patch for a 4.7.0 regression that stopped fish_config from starting. Another instance of the minor-then-patch cadence that runs through this whole window.

    View source ↗
  4. 3mo ago

    fish 4.7.0 stops setting the theme in non-interactive shells

    198 commits, weighted toward interactive correctness: repaints no longer blow away the completion pager and other transient UI state, and history stops being corrupted with NUL bytes on SIGTERM or SIGHUP. The default theme also stops applying in non-interactive shells, a small scoping fix with visible consequences for scripts.

    View source ↗
  5. 4mo ago

    fish 4.6.0 defaults emoji width to 2, adds run0 prompt vars

    Picks up SHELL_PROMPT_PREFIX, SHELL_PROMPT_SUFFIX and SHELL_WELCOME, which systemd's run0 sets — fish adapting to its environment rather than the reverse. Emoji width flips to 2 by default, and set_color gains individual attribute toggles. Spanish and Japanese translations land alongside.

    View source ↗
  6. 4mo ago

    fish 4.4.0 aligns vi-mode word movement with Vim

    Brings vi-mode word movement largely in line with Vim and adds a dozen new input functions plus count support to back it. Substantial enough that 4.5.0 became mostly a patch release for the vi regressions it introduced.

    View source ↗