Migrating from ZSH to Fish

I've always been using ZSH + Oh My Zsh for my shell configuration, which I have been happy with. But I recently got the urge to try out something new, and I decided to try out fish as it includes many useful features without needing extra configuration. It also has a sweet name.
A note on Fish
Fish is not POSIX compliant, meaning you cannot use it to run your regular bash scripts. Fish-programs has to be written using the fish syntax, which seems easy enough to learn. I do little bash scripting for my regular workflow, and I plan on using fish solely as an interactive shell, so I do not think I will notice this very much
Installation
I used homebrew for a quick and easy installation:
<span><span style="color: var(--shiki-token-function)">brew</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">install</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">fish</span></span>
<span></span>
I then added fish to my list of known shells, and used chsh
to set fish as default. After doing these steps, I had to sign out and back in again.
<span><span style="color: var(--shiki-token-function)">sudo</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">bash</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">-c</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'echo $(which fish) >> /etc/shells'</span></span>
<span><span style="color: var(--shiki-token-function)">chsh</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">-s</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">$(</span><span style="color: var(--shiki-token-function)">which</span><span style="color: var(--shiki-token-string-expression)"> </span><span style="color: var(--shiki-token-string)">fish</span><span style="color: var(--shiki-token-string-expression)">)</span></span>
<span></span>
I also had to use the fish_add_path
command for fish to recognize programs installed by homebrew:
<span><span style="color: var(--shiki-token-function)">fish_add_path</span><span style="color: var(--shiki-color-text)"> /opt/homebrew/bin</span></span>
<span></span>
Configuring fish
As I mentioned earlier, fish is very useable without any configuration, which I like. I, therefor, have decided to keep my config as clean as possible, without relying on any plugins.
The first thing I did was to set the fuck
alias, and disable the autosuggestion by default, as I found it distracting. I did this in .config/fish/config.fish
.
<span><span style="color: var(--shiki-token-comment)"># ~/.config/fish/config.fish</span></span>
<span></span>
<span><span style="color: var(--shiki-token-function)">thefuck</span><span style="color: var(--shiki-color-text)"> --alias </span><span style="color: var(--shiki-token-keyword)">|</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">source</span></span>
<span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -g fish_autosuggestion_enabled 0</span></span>
<span></span>
I then found a pretty greeting-function and modified it a bit to only print the greeting for large windows that open in ~
, as I do not want it cluttering the screen while I'm working on something.
<span><span style="color: var(--shiki-token-comment)"># ~/.config/fish/functions/fish_greeting.fish</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">function</span><span style="color: var(--shiki-color-text)"> fish_greeting</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">test</span><span style="color: var(--shiki-color-text)"> $LINES -gt 25; </span><span style="color: var(--shiki-token-keyword)">and</span><span style="color: var(--shiki-color-text)"> [ (</span><span style="color: var(--shiki-token-function)">pwd</span><span style="color: var(--shiki-color-text)">) = $HOME ]</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">' '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'___</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> ___======____='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'-'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'-'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'-='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">')</span></span>
<span><span style="color: var(--shiki-token-string-expression)">/T \_'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'--='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'=='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">') '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> red)(</span><span style="color: var(--shiki-token-function)">whoami</span><span style="color: var(--shiki-color-text)">)</span><span style="color: var(--shiki-token-string-expression)">'@'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">hostname</span><span style="color: var(--shiki-color-text)">)</span><span style="color: var(--shiki-token-string-expression)">'</span></span>
<span><span style="color: var(--shiki-token-string-expression)">[ \ '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'('</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'0'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">') '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'\~ \_'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'-='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">')'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> yellow)</span><span style="color: var(--shiki-token-string-expression)">' Uptime: '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> white)(</span><span style="color: var(--shiki-token-function)">uptime</span><span style="color: var(--shiki-color-text)"> | </span><span style="color: var(--shiki-token-function)">sed</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">'s/.*up \([^,]*\), .*/\1/'</span><span style="color: var(--shiki-color-text)">)(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> red)</span><span style="color: var(--shiki-token-string-expression)">'</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> \ / )J'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'~~ \\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'-='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">') IP Address: '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> white)(</span><span style="color: var(--shiki-token-function)">ipconfig</span><span style="color: var(--shiki-color-text)"> getifaddr en0)(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> red)</span><span style="color: var(--shiki-token-string-expression)">'</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> \\\\___/ )JJ'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'~'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'~~ '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'\) '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> yellow)</span><span style="color: var(--shiki-token-string-expression)">'Version: '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> white)(</span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> $FISH_VERSION)(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> red)</span><span style="color: var(--shiki-token-string-expression)">'</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> \_____/JJJ'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'~~'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'~~ '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'\\</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'/ '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'\ '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">', \\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'J'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'~~~'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'~~ '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'\\</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> (-'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'\)'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'\='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'|'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'\\\\\\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'~~'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'~~ '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'L_'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'_</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'('</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'\\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'\\) ('</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'\\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'\\\)'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'_ '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'\=='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'__</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'\V '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'\\\\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'\) =='</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'=_____ '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'\\\\\\\\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'\\\\</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'\V) \_) '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'\\\\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'\\\\JJ\\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'J\)</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> '</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'/'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'J'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF0)</span><span style="color: var(--shiki-token-string-expression)">'\\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'J'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'T\\'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'JJJ'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'J)</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> (J'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> FF7F00)</span><span style="color: var(--shiki-token-string-expression)">'JJ'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> F00)</span><span style="color: var(--shiki-token-string-expression)">'| \UUU)</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> (UU)'</span><span style="color: var(--shiki-color-text)">(</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> normal)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">end</span></span>
<span><span style="color: var(--shiki-token-keyword)">end</span></span>
<span></span>
I also customized the default prompt. I took inspiration from the prompt I had been using from Oh My Zsh (avit), and created a similar looking one for fish:
<span><span style="color: var(--shiki-token-comment)"># ~/.config/fish/functions/fish_prompt.fish</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">function</span><span style="color: var(--shiki-color-text)"> _git_branch_name</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-function)">command</span><span style="color: var(--shiki-color-text)"> git symbolic-ref HEAD </span><span style="color: var(--shiki-token-keyword)">2></span><span style="color: var(--shiki-color-text)"> /dev/null | </span><span style="color: var(--shiki-token-function)">sed</span><span style="color: var(--shiki-color-text)"> -e </span><span style="color: var(--shiki-token-string-expression)">'s|^refs/heads/||'</span><span style="color: var(--shiki-color-text)">)</span></span>
<span><span style="color: var(--shiki-token-keyword)">end</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">function</span><span style="color: var(--shiki-color-text)"> _git_is_dirty</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-function)">command</span><span style="color: var(--shiki-color-text)"> git status -s --ignore-submodules=dirty </span><span style="color: var(--shiki-token-keyword)">2></span><span style="color: var(--shiki-color-text)"> /dev/null)</span></span>
<span><span style="color: var(--shiki-token-keyword)">end</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">function</span><span style="color: var(--shiki-color-text)"> fish_prompt</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l last_status $status</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l cyan (</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> cyan)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l yellow (</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> yellow)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l red (</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> red)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l blue (</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> blue)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l green (</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> green)</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l normal (</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> normal)</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l cwd $blue(</span><span style="color: var(--shiki-token-function)">pwd</span><span style="color: var(--shiki-color-text)"> | </span><span style="color: var(--shiki-token-function)">sed</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"s:^$HOME:~:"</span><span style="color: var(--shiki-color-text)">)</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-comment)"># Add a newline before new prompts</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> -e </span><span style="color: var(--shiki-token-string-expression)">''</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -q VIRTUAL_ENV</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> -n -s (</span><span style="color: var(--shiki-token-function)">set_color</span><span style="color: var(--shiki-color-text)"> -b cyan black) </span><span style="color: var(--shiki-token-string-expression)">'['</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-function)">basename</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"$VIRTUAL_ENV"</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-string-expression)">']'</span><span style="color: var(--shiki-color-text)"> $normal </span><span style="color: var(--shiki-token-string-expression)">' '</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">end</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> -n -s $cwd $normal</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">[</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-function)">_git_branch_name</span><span style="color: var(--shiki-color-text)">) ]</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l git_branch (</span><span style="color: var(--shiki-token-function)">_git_branch_name</span><span style="color: var(--shiki-color-text)">)</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">[</span><span style="color: var(--shiki-color-text)"> (</span><span style="color: var(--shiki-token-function)">_git_is_dirty</span><span style="color: var(--shiki-color-text)">) ]</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> git_info $green $git_branch $red </span><span style="color: var(--shiki-token-string-expression)">" ✗"</span><span style="color: var(--shiki-color-text)"> $normal</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">else</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> git_info $green $git_branch </span><span style="color: var(--shiki-token-string-expression)">' ✔'</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">end</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> -n -s </span><span style="color: var(--shiki-token-string-expression)">' '</span><span style="color: var(--shiki-color-text)"> $git_info $normal</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">end</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> -l prompt_color $red</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">if</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">test</span><span style="color: var(--shiki-color-text)"> $last_status = 0</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">set</span><span style="color: var(--shiki-color-text)"> prompt_color $normal</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">end</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> -e </span><span style="color: var(--shiki-token-string-expression)">''</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-function)">echo</span><span style="color: var(--shiki-color-text)"> -n -s </span><span style="color: var(--shiki-token-string-expression)">"$normalâ–¶ "</span></span>
<span><span style="color: var(--shiki-token-keyword)">end</span></span>
<span></span>
Neovim configuration
I installed fish grammar for treesitter to get syntax highlighting in Neovim. I also had to install ripgrep from homebrew to get telescope live grep working.
:TSinstall fish
brew install ripgrep
Thoughts
I've been using fish for the past couple of days now, and I have to say that I like it alot. After configuring everything, I've noticed how fast the prompt appears compared to Oh My Zsh. I've also been really impressed with fish_config
, which let's you do some configuration from a web interface. This was really useful when deciding on colors for my prompt. I've also been liking the prevd
and nextd
commands which are mapped to alt + left/right arrow
. I also really like that ctrl+c
is shown after terminating stuff.
If you want to copy my setup, feel free to check out my dotfiles!