9 Enhancements to Shell and Vim Productivity

If you enjoy the command line then you don’t need to be sold on efficiency or purity of action. But even those who grok CLI are unaware of a number of ways to be more elegant accomplishing their tasks. Here are a few of my favorites.

When was the last time you used your CAPSLOCK key? Yeah, me too. It’s a relic, and it’s right there on the home line wasting useful real estate. Let’s make it functional by remapping it to the Control key! Here‘s how to do it in various operating systems.

Now you can stay on your home keys and hit ctrl-whatever with your pinky to the left the ‘a’ key.

Many know about using the arrow keys to invoke previous commands from history, but relatively few know that you can invoke ctrl-r to be brought to a history auto-complete prompt.

Once you find what you were looking for you can hit enter and execute it or you can modify it before doing so. And now that your CAPSLOCK key is remapped, it’s easy to get in the habit.

iTerm isn’t necessarily an efficiency, but it’s definitely an improvement. Some features:

  • Split panes

  • Mouseless copy

  • Paste history

  • Full screen

  • Unixyness

  • Expose tabs

  • Tagged profiles

I’ve never known anyone to switch to iTerm and then switch back. Definitely give it a go.

Most come up using Bash as I did, and have to be shown the merits of another shell. After having multiple people rave about it I gave it a chance and haven’t gone back. Some features:

  • Expand [remote] paths ve/pl/re --> vendor/plugins/redmine

  • Expand variables: $PATH --> /your/full/path

  • Intelligent correction: /pbulic/html becomes /public/html

  • Spelling correction

  • Shared command history across running shells

  • Highly themable prompts

  • Most of your Bash configuration will work seamlessly

  • Can emulate Bash when run as /bin/sh

  • Supports vim mode commands

  • OhMyZsh support

The last one is critical, as ohmyzsh makes using the shell an absolute pleasure by including a massive number of plugins (rails, git, OS X, brew, etc.), over 80 terminal themes, and an auto-updater. Definitely give it a try.

Having multiple modes in vim isn’t so much of an issue; it’s more that it sucks to move between them. The ESC key is a bit out of the way, and it doesn’t need to be. The first thing I do when I stand up a new vim environment is add some mappings to my .vimrc.

inoremap jj <ESC>

If you’re not familiar with the leader key and what it can do for you, you should start there. It basically serves as the activation key for shortcuts you can define. So you can say:

nnoremap j VipJ

This will make it so that pressing your leader key combined with the letter ‘j’ will visually select the entire paragraph and then join the lines in it.

I personally use the comma key ‘,’ as my leader since the concept is barely moving off of my home keys. So here I can activate all my shortcuts by using ‘,’, and leave insert mode by pressing ‘jj’. You can map it like so in your .vimrc:

let mapleader = “,”

Whether you’re using zsh or bash you want to be using the same muscle memory as much as possible, and if you’re a vim user that means switching your shell from Emacs mode (default) to vi mode.

This means you edit your shell commands the same way you edit inside vim:

Unsupervised Learning — Security, Tech, and AI in 10 minutes…

Get a weekly breakdown of what's happening in security and tech—and why it matters.

  • b to go back a word

  • dd to delete the entire line

  • 0, $ to move to the line ends

  • …etc.

You do this by adding the following line to your .zshrc or .bashrc file:

bindkey -v

You can also map your alternate escape key just as you do in vim (shown for zsh):

bindkey -M viins ‘jj’ vi-cmd-mode

Another added bonus here is that you navigate your history via j,k as will come natural, and you can even have your ctrl-r functionality as well by adding this to your .zshrc file:

bindkey ‘^R’ history-incremental-search-backward

tmux is a terminal multiplexer, which allows you to connect to and manage multiple server-side terminal sessions. You can spin them up, connect to them, disconnect from them, and then connect to them another time or from somewhere else.

You may be familiar with a similar solution, GNU Screen, but tmux has a number of advantages over screen:

  • screen is a largely dead project, and its code has significant issues

  • tmux is an active project with a modern, efficient codebase

  • tmux is completely client/server based whereas screen tries to emulate this behavior

  • tmux supports both vim and emacs key layouts

  • tmux supports autorenaming windows based on what’s running

  • tmux is easily scriptable from the shell

  • vertical window splitting is native in tmux, as opposed to being bolted on and buggy in screen

If you’re not using terminal multiplexing, give tmux a try and enjoy the benefits. [ UPDATE: I now have a full primer on tmux here. ]

It’s quite annoying to have a brilliant shell and vim experience on your MBP, only to have it look and feel completely different when you SSH into your Linux boxes. Fix that by syncing up.

  1. Create a git repository for all your customization files, e.g., Bash, Zsh, Vim, etc. and keep it updated.

  2. Go to each of your systems that you use and clone that directory so that you’re working with one set of files across your environments.

  3. A commenter mentioned using Dropbox for synchronization as well, which seems attractive, but I’m not sure how clean that would be on headless Linux servers.

Ping me with similar tips so I can incorporate them into my workflow and add them here for others.

Related posts: