fish for zsh users

You don't need to configure anything to get good completion and history functionality in fish. There's isn't even an option for the number of history lines to store. You just get a lot of history.

fish shows autosuggestions as you type, but neither Tab or the Up key will accept that autosuggestion! Press Right or Ctrl-e or End instead.

When the command line is empty, Alt-Left and Alt-Right quickly navigate through your directory history.

The other keyboard shortcuts are listed here.

The Up key searches through command history by the prefix or substring you've already typed into the command line. If you want to do a normal Up, first clear the line with Ctrl-c.

You can complete an argument instead of a whole command line with Alt-Up.

You can make Ctrl-c more zsh-like with:

function fish_user_key_bindings
    # Instead of having ctrl-c clear the command, keep the command
    # and start a prompt on a new line.
    bind \cc 'echo "^C"; commandline ""; commandline -f repaint'

There's no Ctrl-r, so either get used to the Up key or try re-search (which doesn't work quite as well as Ctrl-r in zsh.)

There's no middle-of-word autocompletion, but it's probably easy to live without.

ENV_VAR=x command is unsupported; use env ENV_VAR=x command instead.

${variable}.notpartofvariable instead has the dollar sign inside the brackets: {$variable}.notpartofvariable.

There's no set -e, but you can prefix every subsequent line with and, as in this example.

You can't background a shell function with & because there is no subshell functionality yet.

There's no &&; use ; and instead.

There's no "$@"; use $argv instead.

There's no $1... in functions; use $argv[1]... instead.

There's no PS1; fish instead calls the fish_prompt function.

There's no [abc] syntax matching any one of the 'a', 'b', or 'c' characters; use {a,b,c} instead.

**/* is instead just **.

alias just defines a function.

There's no time command. (You can install the standalone time with apt-get install time.

fish keeps the directory slashes as you tab-complete, which can really make a mess if you use rsync. You can use a function for stripping the slashes from rsync.

Unlike zsh, there's no way to Ctrl-c a very slow tab-completion.

Your customizations can go into $HOME/.config/fish/, but that file will be used for all fish shells, including non-interactive shells (such as one spawned by an rsync remote). You can break some programs pretty badly by changing things for non-interactive shells. For example, if you have alias rsync='rsync -X' in (server-side), you'll see this whenever you run rsync without -X (client-side):

[Receiver] Invalid dir index: -1 (-101 - -101)
rsync error: protocol incompatibility (code 2) at
	flist.c(2630) [Receiver=3.1.1]
Instead, have contain something like
if status --is-interactive
    . $HOME/.config/fish/
and put almost all of your customizations into

You can disable the fish greeting with set fish_greeting.

Your custom fish_prompt probably won't work in Linux text consoles, because fish will use fish_fallback_prompt instead when TERM=linux. Don't set TERM to xterm-256color because that will break some applications (nano included). To customize the prompt for all terminals, define a fish_fallback_prompt instead and add:

function fish_prompt

(If you do it the other way around, you will overflow the stack and not get a prompt.)

Wikipedia has a translation table with more shell syntax.