I switched to the fish shell a while ago and it’s great. The sntax is sane and understandable, tab completions work pretty well, history completions save you a lot of time and my shell feels faster to me now.
It’s super easy to create a custom shell prompt:
function fish_prompt set_color red -o echo -n ">> " set_color cyan -o if test $PWD = $HOME echo -n "~" else echo -n (basename $PWD) end echo -n " " if git status >/dev/null ^/dev/null set_color red -o echo -n (git branch | grep '*' | cut -c3-) echo -n " " if not test (git status | tail -1) = "nothing to commit, working directory clean" set_color yellow -o echo -n "× " end end end
This displays the current working directory, then the current git branch if one exists, then an ×, if there are uncommitted changes in the git repository.
My right prompt displays the ruby version currently in use
function fish_right_prompt set_color white -o rbenv version | cut -d ' ' -f 1 end
All you need to do is create two files, name them
fish_right_prompt.fish and place them in
Adding your own tab-completions is also pretty easy. Here’s a simple example:
complete -f -c jekyll -a 'build doctor help import new serve' complete -f -c jekyll -s w -l 'watch'
The first line will tab-complete jekyll’s
serve commands. The second line will complete the
--watch option. Of course, Jekyll has many more commands and options and writing the whole thing would be much longer, but you get the idea. Put these lines in
.config/fish/completions into a file named
jekyll.fish and you’ll be good to go.
I highly encourage you to at least read through the introductory fish tutorial.