After eleven years of zsh, I have switched to fish as my default shell. I dig its friendliness; this one just feels alive at the prompt. Everything is a function, and it seems elegant. The
abbr feature of fish works for me like
alias from traditional shells, except
abbr auto-expands, which can be startling — I’m still getting used to.
Some caveats: (a) fish shell does not seem to play well for type-setting via LaTeX. I can get by fine on macOS, but not on Ubuntu via WSL; (b) same for running any shell commands from within Vim. If you use these two extensively, then fish may not yet be ready for you.
Below are a few lines from my
config.fish as simple examples:
if status is-interactive # abbreviations abbr ds 'date +"%Y-%m-%d %H:%M" | pbcopy' abbr df 'df -h' abbr du 'du -h' abbr fl 'rg --files | fzf' abbr hk 'make --file=~/scripts/hkp/hkp.make' abbr mv 'mv -i' abbr rm 'rm -i' abbr sp 'make --file=~/Sites/sp.make' abbr week 'date +%V' # functions function subl /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl $argv end function smerge /Applications/Sublime\ Merge.app/Contents/SharedSupport/bin/smerge $argv end function spm if test -z "$argv" echo "Please provide a search term." return 1 end set result (grep -A 3 "$argv" /Volumes/spm/spm.md) if test -z "$result" echo "No matching results found." return 1 end grep -A 3 "$argv" /Volumes/spm/spm.md end end
The script below automates the transition from zsh to fish in macOS.
#!/usr/bin/env zsh # 2023 ckunte # install fish shell (check for brew; install if not) if test ! $(which brew); then echo "Installing Homebrew..." /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" else echo "Installing fish shell..." brew install fish fi # add fish shell to /etc/shells echo -n "Adding fish shell path to /etc/shells..." sudo sh -c 'echo $(which fish) >> /etc/shells' echo "done." # restart terminal echo -n "Restart terminal..." exec zsh echo "done." # make fish shell default echo -n "Making fish shell default..." chsh -s 'echo $(which fish)' echo "done." # restart terminal exec fish # add brew binaries in fish path # ref: https://fishshell.com/docs/current/cmds/fish_add_path.html fish_add_path /opt/homebrew/bin # collect command completions for all commands fish_update_completions