Fish shell, a popular user-friendly command-line shell, has announced version 4.2, a new release that builds on the 4.0 series. Among the most visible improvements is an upgrade to history-based autosuggestions, which now properly handle multi-line commands.

Fish 4.2 also improves how prompts are managed: transient prompts that contain more lines than the final one are now cleared properly, preventing visual clutter on screen. Similarly, the shell now hides parts of a multi-line prompt that have scrolled out of view, eliminating duplicated lines after repainting.

  • Oinks@lemmy.blahaj.zone
    link
    fedilink
    arrow-up
    16
    ·
    edit-2
    1 day ago

    This is by no means complete, but the features that I value would be:

    • <Tab> cycles though completions as it should instead of duplicating the prompt.
    • Completions also show help text (if there’s a provider for one). For example on git <Tab> it shows a short message describing what the command does. JJ goes further: jj diff -r <Tab> shows part of the commit message for the offered commits.
    • There are just more completions than in any other shell I know. Aside from JJ the new Nix CLI also has great Fish completions and can dynamically complete flake outputs like package names.
    • Entire commands can be history completed with <C-E> or <Right>. This completion is also directory-aware and can usually avoid suggesting commands with paths to files that don’t exist. In practice I find that it’s really good at suggesting the command I actually want to run, to the point that I rarely invoke FZF anymore.
    • Abbreviations are in most cases better aliases since they do the same thing but don’t obscure what you’re actually running.
    • No word splitting when expanding variables, because it’s never what you intended.
    • Globs that fail to match anything are errors instead of silently doing the wrong thing.
    • Control structures are a bit nicer (but that is subjective).

    You can get most of these with liberal use of shell options, installing blesh, or alternatively installing zsh with a bunch of plugins, but Fish just has all of them out of the box. You don’t even need bash-completions.

    how hard is it to transition?

    It has a reputation of being very difficult from the past when it didn’t have &&/|| but I think today plenty of Linux users would not even notice. The most notable remaining differences are setting variables (requires the set builtin unless used to modify the environment for a single command), control structures (irrelevant in interactive use) and lack of !! (but you can make an abbreviation to bring it back).

    • Cris@lemmy.world
      link
      fedilink
      English
      arrow-up
      2
      ·
      7 hours ago

      Any chance you could give a simple explainer on how to set up a !! abbreviation in fish?

      I’m a fairly non-technical fish user and every time I’ve tried to figure out how to do it I’ve ended up giving up 😅

      If you don’t know off the top of your head thats fine, but it seemed worth an ask ☺️

      • Oinks@lemmy.blahaj.zone
        link
        fedilink
        arrow-up
        2
        ·
        edit-2
        7 hours ago

        I have this in my config:

        function lastcmd
            echo $history[1]
        end
        
        abbr --add "!!" --position anywhere --function lastcmd
        

        I believe I originally got this implementation from the GitHub issues. The key is that abbreviations can also call functions, which can in turn index into the history list. We also need to specify that we want the expansion even if we’re in an argument to another command, such as in sudo !!.