DEV Community

Cover image for Command line productivity with Fish shell
Yankee Maharjan
Yankee Maharjan

Posted on • Edited on • Originally published at Medium

Command line productivity with Fish shell

There is more than one way to get around things from the terminal. Thatโ€™s the beauty of it; endless customization and tweaks to get things done faster and more efficiently.

In my journey of using WSL, I bumped into performance issues with the beloved zsh and oh-my-zsh combo. Wandering around for an hour, I stumbled upon fish shell, which was 10x faster in WSL compared to zsh (no real metrics here, but felt really really fast ๐Ÿ˜…๐Ÿš€). But it comes with its own set of quirks which weโ€™ll see later.

Install Fish Shell ๐ŸŸ

If you are on Debian-based distros:

$ sudo apt-get install fish 
Enter fullscreen mode Exit fullscreen mode

If you are on other platform, follow the instructions here.

Fish Shell Intro

Fish shell out of the box is lightweight, performant โšก and full of features. Meaning you donโ€™t have to do much to make yourself productive in the terminal. Some of the native functionalities include:

  • syntax highlighting,

  • autosuggestion

  • tab completion and

  • auto loading functions.

The documentation is rich and elaborative, and you can get the documentation hosted locally in the browser by writing help in the fish shell. For most people a fresh install would be enough to get going. But we want to tweak and make it more functional with plugins, themes and what not. Like other shells, fish comes with a lot of plugin framework , but we will be using called oh-my-fish (omf).

Intro omf

omf is a thin layer on top of fish shell, so you are not compromising on speed and performance. Install it with a single command:

$ curl -L https://get.oh-my.fish | fish
Enter fullscreen mode Exit fullscreen mode

With this done you will have the omf command on your shell to install themes and other useful plugins. It is really intuitive and if you have used nvm or pip you will feel right at home.

You can get the basic run down of the commands here.

themes with omf ๐ŸŽจ

There are a variety of themes you can choose from. You can find the themes hosted here, or you can use the command omf theme to list all of them and also view the installed and default theme.

Installing a new theme will directly apply that theme.

$ omf install <theme-name>
$ omf install bira
Enter fullscreen mode Exit fullscreen mode

Listing themes and changing between installed ones. ๐ŸŽจListing themes and changing between installed ones. ๐ŸŽจ

If you have multiple themes installed, you can change between them using:

$ omf theme <theme-name>
Enter fullscreen mode Exit fullscreen mode

aliases with omf ๐Ÿฆ

aliases are handy when you want do complete repeated tasks with as few keystrokes as possible. Fish shell has a command named alias to define your aliases. You can simply do it from the command line.

$ alias <alias> '<command>' -s
$ alias install 'sudo apt-get install' -s
$ alias remove 'sudo apt-get remove --purge' -s
Enter fullscreen mode Exit fullscreen mode

You can install any packages with the install alias or uninstall it completely using the remove alias.

$ install vim 
$ remove python2.7
Enter fullscreen mode Exit fullscreen mode

Creating alias  raw `install` endraw  โœCreating alias install โœ

Aliases you create using the alias command only lasts for a session, meaning if you spawn a new terminal instance they wonโ€™t work. To make it work, we have to pass the -s flag. This will run funcsave behind the scene.

Now it is permanently set and can be used in any instance. In case you forget your aliases, you can summon them using alias command.

Listing all aliases. ๐Ÿ“ƒListing all aliases. ๐Ÿ“ƒ

working with nvm ๐Ÿ”ง

One of the quirks of fish shell is that it cannot run few bash utilities natively like nvm . For this you need a package named bassto expose nvm to fish shell.

basscreates a framework to support other bash utility packages, like the one we will be using called fish-nvm . There are other packages for nvm but fish-nvm doesnโ€™t bottleneck the performance.

$ omf install bass
$ omf install https://github.com/FabioAntunes/fish-nvm
Enter fullscreen mode Exit fullscreen mode

working with virtualenv ๐Ÿ

This is just one of the gotchas of working with fish shell. When you are working with the Python virtual environment , you cannot activate is the normal way.

$ python -m venv venv
$ source venv/bin/activate
Enter fullscreen mode Exit fullscreen mode

Instead, fish shell adds a script called activate.fish to enable the shell.

$ source venv/bin/activate.fish
Enter fullscreen mode Exit fullscreen mode

Essential Packages ๐Ÿ“ฆ

pj

pj allows you to easily jump between your favorite directories in a predictable manner. You tell pj where to look for your projects/folders, and it will allow you to jump there easily with tab completion.

$ omf install pj
Enter fullscreen mode Exit fullscreen mode

For example: I have a folder called test in my home directory with a bunch of other folders.

To mark the test folder as jump target we need to set the project path:

$ set -Ux PROJECT_PATHS ~/test
Enter fullscreen mode Exit fullscreen mode

Now I can jump between the folders inside the test directory from any location in my terminal.

pj in action! โšกpj in action! โšก

z

z is similar to pj but it is intelligent in a sense that it keeps track of your most visited folders so you can jump in that location easily.

$ omf install z
Enter fullscreen mode Exit fullscreen mode

Like I said, z is an intelligent tool, even if I make a typo that may closely resonate to your most visited folder name, it will try to resolve it navigate to that folder.

z in action! โšกz in action! โšก

plugin-git

Like the git plugin in zsh, the plugin-git package gives you the standard set of git aliases to accelerate your git workflow.

$ omf install https://github.com/jhillyerd/plugin-git
Enter fullscreen mode Exit fullscreen mode

plugin-git in action! โšกplugin-git in action! โšก

Not only that, to make sure you are using the right alias, it also expands the alias to form the complete command. Explore the complete list of aliases here.

fzf

Fuzzy Finder or fzf is a general purpose command line tool to find anything faster, be it your files or the command history.

$ omf install https://github.com/jethrokuan/fzf
Enter fullscreen mode Exit fullscreen mode

To search through your command history, you can use the combo ctrl + r or write some part of the command and hit the combo to find only the commands that match your query.

fzf in action! ๐Ÿ”fzf in action! ๐Ÿ”

If you want to search for files in the current directory then you can hit ctrl + o and browse through them. You can do much more with this tool, checkout the usage section here.

Conclusion ๐Ÿ™

I hope this article has been a good hands on guide on installing fish shell and making your workflow productive. If you have suggestions or queries, feel free to comment down below.

Top comments (4)

Collapse
 
maciekgrzybek profile image
Maciek Grzybek

I'll definitely check this :)

Collapse
 
yankee profile image
Yankee Maharjan

:)

Collapse
 
spiritupbro profile image
spiritupbro

i use fish too and using theme agnoster and powerline font

Collapse
 
bithst profile image
Bishal Thapa Shrestha

There's virtualfish for managing python virtual environments.