April 16, 2019
workflow

Migrating from ZSH to Fish

One of the main reason I switched from ZSH to Fish is the ability of highlighting command output and the relative small autocomplete, which don’t lag your computer down when you have a few hundreds results like zsh.

But what I didn’t expect is to rewrite my whole .bash_profile in Fish (Fish is not bash, so it doesn’t use Bash syntax, that’s why you can’t source your .bash_profile file), well, that’s not a hard thing. Just need to read the documentation and learn some changes, such as:

export ABC="abc"
# now becomes
set -x ABC abc

If you execute a command during setting value, you need to change the syntax as well:

export RUST_SRC_PATH="$(rustc --print sysroot)/lib/rustlib/src/rust/src"
# now becomes
set -x RUST_SRC_PATH (rustc --print sysroot)/lib/rustlib/src/rust/src

For $PATH, I prefer to use export command separately from set -x, for whatever reason, I like it:

export PATH=new/path:$PATH
# now becomes
set PATH new/path $PATH
export PATH

For aliases, it’s almost the same:

alias vim="emacs"
# now becomes
alias vim "emacs"

If you use tmux, you probably have this in your .bash_profile or .bashrc:

if [ -z "$TMUX" ]; then
  if [ -z "$EMACS" ] && [ -z "$VSCODE" ]; then
    tmux new
  fi
fi

Then you need to convert it to Fish, mostly remove the brackets [] and add a test command:

if test -z "$TMUX";
  if test -z "$EMACS"; and test -z "$VSCODE";
    tmux new
  end
end

And if you use nvm, you hit the wall, since it’s heavily rely on Bash, there are some solutions such as installing bass to be able to run Bash scripts in your Fish config, but even if you go that route, initializing nvm still slowing down your shell startup time.

A better solution is using fash-nvm-fish, it’s a wrapper around nvm, which doesn’t required to parse the env config everytime you start your shell, so it’s fast. The installing process is simple, you can just follow the instruction on the Github repo. I’ll not copy it here.

If your nvm isn’t in the default directory, which is /root/.nvm/, you need to set the NVM_DIR variable, before calling nvm, in my case, it is:

set -gx NVM_DIR /usr/local/opt/nvm/
nvm use 9 --default

That’s it, just a few steps. Happy fishing.

@this-is-a-tag
Waiting
* Work in progress
Done
Flagged
Hey! Have you tried Pomoday?
It's a keyboard-oriented, very easy to use and very powerful web-based task management software.
Powered by a lot of ☕