

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).
I have this in my config:
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
historylist. We also need to specify that we want the expansion even if we’re in an argument to another command, such as insudo !!.