ZSH power tips

Originally published Jun 18, 2020

Heads up!

This is a work-in-progress; I'll add to it over time.

As a web developer, I spend a large portion of my day in the shell. I even use the shell for some commands that my IDE offers, such as Git, since my muscle memory is strong after years of use. Here are a few of my favorite pieces of my ZSH configuration.

Antigen

Antigen is a plugin manager for ZSH, and it's the one I set up on all of my machines. With a few lines of code in my ~/.zshrc, I can install my most commonly-used utilities.

The following headings correspond to bundles; add antigen bundle ${PACKAGE_TITLE} to your ~/.zshrc to install.

git

I use a few custom git aliases, but most of my commonly-used commands are provided by the git bundle (antigen bundle git). I've grown accustomed to the short aliases (e.g. gc = git commit) as well as the longer ones (glgga = git log --graph --decorate --all; shows an ASCII graphic of all git branches).

knu/manydots-magic

This little tool allows you to traverse directories with repeated periods. Instead of cd ../.., I can type ... and jump up two levels. This is particularly useful in monorepos.

Also part of this tool: type - to jump to the most recent directory in your history.

zsh-users/zsh-autosuggestions

Finds the most recent command matching the start of the current entered command, and suggests it. You can either press ctrl- to complete the next word, or to complete to the end of the line. Alternatively, you can use bindkey to change the bindings.

Tarrasch/zsh-autoenv

Powerful tool that allows you to customize your environment based on which directory you're in. You can add .autoenv.zsh and .autoenv_leave.zsh to a directory to run commands when you enter or leave the directory, respectively. Autoenv comes with the commands autostash and autounstash to restore variables to their previous values when traversing directories, and stash and unstash for more manual control.

Autoenv keeps track of edits to these files and prompts you if they change. This helps keep things more secure; any program can write to these files, so you could end up auto-executing something malicious without this check.

Here are a few of my favorite command sets:

Setting AWS_PROFILE

Assuming you have a profile myproject set up using aws configure --profile myproject:

# .autoenv.zsh
autostash AWS_PROFILE=myproject

Setting npm configuration

Similarly to my AWS_PROFILE, I also use different npm configurations based on the directory. This is mostly for my work laptop, and I usually only use this when I'm generating a lockfile for a project I'm about to open source (to make sure the hostname of our internal registry doesn't leak).

I used to set my ~/.npmrc file as a symlink, but I've since learned about npmrc config env vars, and the following Autoenv file handles this automatically:

# .autoenv.zsh
autostash NPM_CONFIG_USERCONFIG=$HOME/.npmrc-foss

Changing command history file

I'm experimenting with live coding, and I don't want a command containing secrets to be autosuggested while my screen is visible. To work around this, I have a ~/Projects/Streaming directory with this configuration:

# .autoenv.zsh
autostash HISTFILE=$HOME/.streaming_zsh_history
fc -p $HISTFILE
# .autoenv_leave.zsh
unstash HISTFILE
fc -P

This way, I can still keep a useful command history that's separate from my normal work.