Migrating from ZSH to Fish

Fish greeting

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)">&#39;echo $(which fish) &gt;&gt; /etc/shells&#39;</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)">&#39;                 &#39;</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)">&#39;___</span></span>
<span><span style="color: var(--shiki-token-string-expression)">  ___======____=&#39;</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)">&#39;-&#39;</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)">&#39;-&#39;</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)">&#39;-=&#39;</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)">&#39;)</span></span>
<span><span style="color: var(--shiki-token-string-expression)">/T            \_&#39;</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)">&#39;--=&#39;</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)">&#39;==&#39;</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)">&#39;)    &#39;</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)">&#39;@&#39;</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)">&#39;</span></span>
<span><span style="color: var(--shiki-token-string-expression)">[ \ &#39;</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)">&#39;(&#39;</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)">&#39;0&#39;</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)">&#39;)   &#39;</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)">&#39;\~    \_&#39;</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)">&#39;-=&#39;</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)">&#39;=&#39;</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)">&#39;)&#39;</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)">&#39;    Uptime: &#39;</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)">&#39;s/.*up \([^,]*\), .*/\1/&#39;</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)">&#39;</span></span>
<span><span style="color: var(--shiki-token-string-expression)"> \      / )J&#39;</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)">&#39;~~    \\&#39;</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)">&#39;-=&#39;</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)">&#39;)    IP Address: &#39;</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)">&#39;</span></span>
<span><span style="color: var(--shiki-token-string-expression)">  \\\\___/  )JJ&#39;</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)">&#39;~&#39;</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)">&#39;~~   &#39;</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)">&#39;\)     &#39;</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)">&#39;Version: &#39;</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)">&#39;</span></span>
<span><span style="color: var(--shiki-token-string-expression)">   \_____/JJJ&#39;</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)">&#39;~~&#39;</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)">&#39;~~    &#39;</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)">&#39;\\</span></span>
<span><span style="color: var(--shiki-token-string-expression)">   &#39;</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)">&#39;/ &#39;</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)">&#39;\  &#39;</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)">&#39;, \\&#39;</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)">&#39;J&#39;</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)">&#39;~~~&#39;</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)">&#39;~~     &#39;</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)">&#39;\\</span></span>
<span><span style="color: var(--shiki-token-string-expression)">  (-&#39;</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)">&#39;\)&#39;</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)">&#39;\=&#39;</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)">&#39;|&#39;</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)">&#39;\\\\\\&#39;</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)">&#39;~~&#39;</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)">&#39;~~       &#39;</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)">&#39;L_&#39;</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)">&#39;_</span></span>
<span><span style="color: var(--shiki-token-string-expression)">  &#39;</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)">&#39;(&#39;</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)">&#39;\\&#39;</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)">&#39;\\)  (&#39;</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)">&#39;\\&#39;</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)">&#39;\\\)&#39;</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)">&#39;_           &#39;</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)">&#39;\==&#39;</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)">&#39;__</span></span>
<span><span style="color: var(--shiki-token-string-expression)">   &#39;</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)">&#39;\V    &#39;</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)">&#39;\\\\&#39;</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)">&#39;\) ==&#39;</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)">&#39;=_____   &#39;</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)">&#39;\\\\\\\\&#39;</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)">&#39;\\\\</span></span>
<span><span style="color: var(--shiki-token-string-expression)">          &#39;</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)">&#39;\V)     \_) &#39;</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)">&#39;\\\\&#39;</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)">&#39;\\\\JJ\\&#39;</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)">&#39;J\)</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                      &#39;</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)">&#39;/&#39;</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)">&#39;J&#39;</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)">&#39;\\&#39;</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)">&#39;J&#39;</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)">&#39;T\\&#39;</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)">&#39;JJJ&#39;</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)">&#39;J)</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                      (J&#39;</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)">&#39;JJ&#39;</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)">&#39;| \UUU)</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                       (UU)&#39;</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&gt;</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)">&#39;s|^refs/heads/||&#39;</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&gt;</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)">&quot;s:^$HOME:~:&quot;</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)">&#39;&#39;</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)">&#39;[&#39;</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)">&quot;$VIRTUAL_ENV&quot;</span><span style="color: var(--shiki-color-text)">) </span><span style="color: var(--shiki-token-string-expression)">&#39;]&#39;</span><span style="color: var(--shiki-color-text)"> $normal </span><span style="color: var(--shiki-token-string-expression)">&#39; &#39;</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)">&quot; ✗&quot;</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)">&#39; ✔&#39;</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)">&#39;  &#39;</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)">&#39;&#39;</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)">&quot;$normalâ–¶ &quot;</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!