Be sure to try Fish 2.0 which is even much more awesome than the older version.
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'The size difference was based on my intuition that when I maintained my own .bashrc and .zshrc, I was able to "get away" with fewer total lines in my .zshrc than my .bashrc. I remember my .bashrc being dozens of pages, my .zshrc was only a couple.
Compare that to my fish init file...all it does is set a few paths and aliases and turn off the greeting, because everything else just works out of the box for me.
$ ls -lh .bashrc
-rw-r--r-- 1 <me> <me> 10k Jul 26 13:31 .bashrc
Yep.It's also remarkably fast because I took great effort to optimize the parts that happen the most. Shell is actually pretty fast if you don't fork and exec all the time...
add_to PATH /usr/sbin
prefix and unprefix are a macro for a bunch of standard replace_in/remove_froms: prefix() {
replace_in PATH "$1/bin"
replace_in PATH "$1/sbin"
replace_in PATH "$1/lib/ccache"
replace_in MANPATH "$1/share/man"
replace_in MANPATH "$1/man"
replace_in PKG_CONFIG_PATH "$1/lib/pkgconfig"
...etc.
So that later I can do stuff like: prefix /usr/local
prefix /usr/local/brew
prefix /usr/local/ports
...All of which are managed by different package managers (stow, brew, ports).All that stuff is the part I optimized so that it only uses bash built-ins and never execs. Converting that away from sed/perl shaved about 8 seconds off my startup time (it's now so fast I don't notice it).
The next 20% is interactive stuff. Setting up the prompt, aliases, stty, etc. This is generally more complicated than it technically needs to be because it's cross platform so it'll run on any unix-y thing with no changes.
Then remaining 40% is a big chunk of shell functions that are mostly unused in my day-to-day life, but kept there to jog my memory if I need to do a certain task.
That adds up to 100%, but it's also worth noting that 27% of that is blank lines and comments.
$ cd bash-it
$ sloccount ./
...SNIP...
SLOC Directory SLOC-by-Language (Sorted)
3198 completion sh=3198
3168 plugins sh=3168
1081 themes sh=1081
748 lib sh=748
242 aliases sh=242
135 top_dir sh=135
16 template sh=16
0 custom (none)
Totals grouped by language (dominant language first):
sh: 8588 (100.00%)
Are there some big bashrc customizations that I might be overlooking?edited to reflect distinction between parent and grandparent comment
A few things stand out to me as huge pluses:
- It has a lot of cool functionality out of the box such as highlighting, smarter autocomplete (type in a partial word at the prompt and hit up instead of the cumbersome bash ctrl r/s history prompt that loves to beep at you), directory history (alt left-arrow and alt right-arrow), and more.
- You don't need a 10k .bashrc or 1k .zshrc to unlock most of that cool functionality, it's just enabled by default. So anywhere you have fishshell installed, you get 95% of what you're used to, no need to git clone or scp over your .bashrc.
- Startup time is _very_ quick compared to bash or zsh with said 10k .bashrc or 1k .zshrc, and is comparable to bash or zdh with no startup file.
The only weird error I ever ran into was with an older version of fish shell complaining about missing directories in your PATH every time there was an automatic completion available. I have not run into that issue with newer releases.
It is not sh-compliant, which will occasionally wreck havoc when you have a program that shells out without explicitly using sh. I remember running into this issue specifically with vim and emacs on more than one occasion, but truth-be-told I consider this a bug with those programs rather than a fault with fish.
There's also the matter of it not being installed on some machines, but I've used bash for so many years now that my brain flips back into bash-mode anytime I see that familiar colorless prompt with a dollar sign at the end.
It's not an essential upgrade. I also wouldn't bother using it for shell scripts either. But I'd say give it a boy scout try for interactive usage and see how you like it.