Alexander Reelsen

Backend developer, productivity fan, likes distributed systems & the new serverless era

Creating a productive terminal environment
May 28, 2019
11 minutes read

TLDR; I share what CLI tools I use on a daily basis on my terminal to improve my productivity.

First things first, the command line is awesome. It makes me so much more productive by not having to move my hands to the mouse - I don’t have words for it.

This blog post introduces a few tools I use on a daily base, that either replace some more well known and existing tools or a just super useful in general.

If you want to test out all the tools, just run these two lines on osx, they should install all the tools listed here

brew install byobu zsh lsd bat fd ripgrep nvm \ 
     neovim restic topgrade direnv exiftool jq \
     websocat mitmproxy osquery prettyping htop \
     weechat wifi-password coreutils
brew cask install alacritty 

brew tap caskroom/fonts
brew cask install font-hack-nerd-font

alacritty + byobu

The standard terminal emulator under osx seems to be iterm2, which has a great set of features, is easy to configure via its UI. However running htop in a terminal already eats a lot of CPU on my macbook (especially on updates), so I figured it might make sense to switch. Also iterm2 required more memory than alacritty in my tests.

I looked at kitty, but finally settled with alacritty. Alacritty has fewer features that I have been relying on with iterm2 and kitty, most notably the usage of tabs and splits and when I first looked at it, it also lacked scrollback, but that has been added.

So, how can we add back that functionality? By using byobu! Byobu is a terminal multiplexer with great default keybindings for pretty much everything like tabs/spaces management, mouse support and a small status bar. It’s using either screen or tmux as a backend window manager.

One of the best features is just hitting shift+f1 to get all the help you need. Also there is a great youtube video on the byobu homepage, so go check it out.

byobu window

I’m still in the process of switching so I keep changing between byobu and iTerm2 every now and then. One unfortunate thing is the excellent use of f-keys, which is easy with a regular keyboard, but horrible with touch bar under osx.

zsh - my favorite shell

I do not think there is a super big difference using either a recent bash or zsh, but oh-my-zsh makes all the difference to me. oh-my-zsh is an awesome configuration framework for zsh. It is pretty big nowadays, but you can pick what you need and be good with it.

I used the agnoster theme, but we will get to alternatives later.

Another interesting feature of oh-my-zsh is the endless amount of plugins, be keyboard extensions or other functionality. I am not using a lot of them, like the git or warp directory ones, but by far my favorite is the zsh autosuggestions one.

zsh autocomplete in action

If a suggestion is made, you can hit ctrl+e to finish it for you. Super useful and no need to through your history.

Configure your prompt, use GBT

We all love our fancy prompts with lots of colors, a mechanism to show for version control changes plus a nice reduction of long paths, right?

Every shell nowadays features this, be it bash, zsh or the fish shell - where I saw fancy prompts for the first time. However I was always annoyed that I had some wait time, when being in a git repository until my prompt was displayed, when using zsh and oh-my-zsh. Luckily I found gbt, a highly configurable prompt builder for bash and zsh, written in Go and thus being super fast.

This is my setup

export GBT_CARS='Status, Dir, Git, Sign'
export GBT_CAR_DIR_DEPTH='3'
export GBT_CAR_SIGN_FORMAT=' '
export GBT_CAR_DIR_BG='55;55;55'
export GBT_CAR_DIR_FG='cyan'
export GBT_CAR_GIT_BG='80;80;80'
export GBT_CAR_GIT_FG='green'
export GBT_CAR_GIT_DIRTY_FG='light_red'
PROMPT='$(gbt $?)'

resulting in a prompt like

my prompt

Common tools replacements

This section is about replacing a couple of super common command line tools, that are used everyday, yet have very powerful and easier to use replacements.

Using lsd instead of ls

ls has not changed a lot in decades after it got colored output. However, terminals have, being able to display fancy icons. In order to show an icon together with a file in order to represent the file type a small ruby tool called colorls exists since a long time. However I found it to be pretty slow and was waiting for someone to write a replacement in a compiled language. Finally there is a great alternative called lsd which is doing that and some more. I used exa before that, but I find lsd much nicer.

lsd output

See the default output with relative times, and nice color separation, plus icons for file types.

Using bat instead of cat

bat is another great example of a small daily used tool being improved. It’s an improved cat, with a syntax highlighter and line count displayed by default falling back to cat behavior when used with pipes. You can also combine it with tail -f to have continuous syntax highlighting. Also, it has support for themes for the syntax highlighting.

bat output

Using fd instead of find

fd is like find, but better. Again, colorized output, taking .gitignore into account, parallel execution and therefore also faster.

fd output

Using rg instead of grep

And the last of my common shell tool replacements. grep earned a few more features over the last years like colorized output. However there are still reasons to switch to rg aka. ripgrep, also compared to alternatives like ack and the silver searcher aka ag.

You can limit by file types, again .gitignore is taken into account (when working on a big code base, this is invaluable, thus many of the tools presented here take this into account), and being mostly compatible with grep.

rg output

One last piece of advice, always make sure to install the coreutils package, even under osx, this way of have access to the most common gnu utils on the command line, which might come in handy when writing shell scripts that need to be compatible.

Also, it’s nice to see rust replacing those old tools on the command line step by step.

Using prettyping instead of ping

prettyping is basically a wrapper around the ping output with some nice formatting to indicate the latency of a ping, so that it’s easier to see changes over time. The picture below shows some problem in my local guest network that I have not been able to track down yet, very nice visualized.

prettyping

Version your programming languages

Whatever programming language you are writing code in, make sure you can switch the runtime version of your programming language anytime as fast as possible. When debugging customer issues or even because you want to make sure your tool is working everywhere, this will be a live safer.

I am regularly using nvm for node and sdk for java, kotlin and micronaut. I am missing a good version manager for crystal, anyenv/crenv did not work properly when tested some time ago. I do not do any ruby, so there is no need for rvm.

One thing to pay attention to is, that you usually but some piece of code in your .bashrc/.zshrc and that slows down your start up time. There are some hacks for nvm to only get called when node or nvm are actually typed in by the user - this is something you should look out for and play around with, otherwise initializing lazily might make sense.

neovim

I never used a lot of vim plugins, but I wanted to develop crystal code within vim and enjoy syntax completion, so I installed neovim for that - which indeed is super interesting. If you have been a long time vim user, I highly recommend to take a look at neovim.

A lot of the internal design has been rethought, a fair share of cruft removed and it is more of a community driven project and on top of that, it makes it super simple to have UIs on top of neovim by having proper boundaries.

Easy upgrades, topgrade

Upgrades, always forgotten. When did you upgrade oh-my-zsh the last time, do you remember? Well, you do not have to, when you use topgrade. Topgrade upgrades a bunch of things, with brew and osx system upgrades already being a great helper, but having two dozen more upgrade mechanisms for certain tools is nice to know.

Backups, baby!

Nasty topic, I know. I do not want to use time machine, as this forces you to have another osx system available if you need to restore. Also I would like to be able to run this on several operating systems and from the command line . So I opted for restic, allowing you to back up to disk or into the cloud. The latter has finally become an option in 2019 in Germany as my internet upstream speed allows for this.

In general, all restic needs is a configuration file (including directories to exclude for example, like downloaded dependencies), an endpoint and all you need to provide is a password for every operation, as the repository is encrypted.

I do not know of any better backup tool. And yes, I restored already :-)

Others

These just get a small mention, but they are nonetheless super useful to me, again some of them just supersede or extend an existing useful tool.

direnv

When entering a directory, direnv reads the .envrc file and executes it if trusted previously. Also direnv unloads when leaving the directory.

direnv

htop

This is already quite an old tool, but still a nice replacement for top. Easier to check load with multiple CPUs and a couple of easy to use administrative functions.

htop

exiftool

A small CLI tool to I mainly use to clean exif data from images, i.e. the location and date photos were taken.

The easiest call is to remove all metadata via exiftool -all= img.jpg.

jq

I am dealing with a lot of JSON. The swiss army knife for parsing and mutating JSON is definitely jq. It is super powerful and I may have only mastered one percent of its actual functionality, and still I love it. You can modify JSON, execute calculations, or just filter down huge responses (that can happen often in sizable Elasticsearch cluster, in which context I am using this tool the most), pretty much anything you want.

Also, colorizing is supported, which again is super useful for human parsing. I have always set this alias an alias for prettyprinting, so I can do

pp='jq -C . | less -FX'
cat foo.json | pp

jq

websocat

A client for websocket communication, again written in Rust. Very useful for demos, when you need to consume a websocket stream like this one.

mitmproxy

An interactive HTTPS proxy, quite useful for debugging. Another proxy I use for testing is tinyproxy.

osquery

This turns operating system and device stats into objects that can be queried via SQL, even things like open file handles or TCP connections. It’s a common admin tool nowadays, so common it even got its own conference.

weechat

IRC is still alive after all! However I have a hard time finding proper clients that are still in development. weechat was one of the few that looked nice and are still in development. weechat also features a slack plugin, however that was not super usable. weechat is pretty configurable, but most of all features really nice keyboard shortcuts.

wifi-password

Sometimes all you need to know is the current wifi password, as you might want to share it with your neighbor. This is all the tiny tool is doing.

wifi password

Non cli apps

I know, this is a CLI post, but there are few apps, which I really need to survive under osx. If you know proper and awesome alternatives for the command line please let me know!

I use simplenote for note taking, sharing across devices and persons (like our grocery list). The apps feels sluggish everynow and then and there is no proper integration for storing documents (images, pdfs), but it is good enough for now.

My biggest productivity apps under osx are possibly alfred (with workflows) and hammerspoon. I blogged about hammerspoon last year. Two tools helping me to use my mouse less under osx.

My current browser is Brave.

Whenever I mistype on the touchbar, haptickey will give some feedback. The touchbar is one of the worst inventions for keyboard heavy people and I am very happy with my regular keyboard, when not travelling.

I use sloth for checking open sockets and file handles.

And lastly I use menubar-stats to monitor load, network traffic and available memory.

Missing

So, what am I really missing? I usually check what eats a lot of memory and then check if there is a CLI tool available on osx. Two excellent candidates to me are a spotify client and a slack client. For spotify I am not aware any such tool exists, where as for slack there is the weechat extension as well as slack-term and sclack, which I have not yet tested properly.


Back to posts