After trying various shells such as bash and fish I have finally alighted on zsh with prezto.

prezto is a framework which extends zsh and gets around the issue with a default zsh install that it is powerful but in the default configuration does not come with sensible defaults.

Other frameworks exist to get around this problem: another popular one is Oh-my-zsh. Prezto seems to be regarded as quicker by most commentators, however.

zsh with prezto is great because it gives you zsh with easily customised features to make it friendlier, looks like it has had good uptake, and is reasonably quick.

Steps below:

  1. Follow the instructions at http://sourabhbajaj.com/mac-setup/iTerm/zsh.html.

    These instructions are for OSX/MacOS. Note: he also includes instructions for oh-my-zsh which has similar functionality and you don’t need to install them both, so scrol down a bit to get to the instructions you want to follow.

    On FreeBSD sudo pkg install zsh rather than brew. Also on FreeBSD chsh -s zsh will change the default shell

    I prefer the sorin theme so I did not put in the line

     `zstyle ':prezto:module:prompt' theme 'paradox'`
    
  2. As part of the steps above, you get fancy right-prompt indicators in a git repository, at least with the default sorin theme.

    A list of what these mean are below courtesy of below courtesy of https://github.com/sorin-ionescu/prezto/issues/591#issuecomment-40392245:

    • The square signifies that there are untracked changes
    • The = signifies there are unmergerd changes
    • The -> signifies that something has been renamed
    • The 6-pointed blue star signifies that there is a modification
    • The red X signifies that something has been deleted
    • The green + signifies that something is added
    • The blue 5-pointed star signifies that something is stashed
    • The arrow pointing down means you are behind
    • The arrow pointing up means you are ahead
  3. You will want a place to put your aliases etc, which would normally be included in say a .bashrc (with bash) or .zshrc file. These can be imported to keep .zshrc tidy, of course.

    Easy just add the below to .zshrc

     # Customize to your needs...  
     if [[ -s "${ZDOTDIR:-$HOME}/.libshell.zsh" ]]; then
           source "${ZDOTDIR:-$HOME}/.libshell.zsh"
     fi
    

    Then create ~/.libshell.zsh and put all your aliases etc in there