I have been meaning to write this post for quite a while now but have always managed to forget. I have been piecing together useful terminal shortcuts, commands and productivity tools since I started using Linux back in the day. If you spend any amount of time in the terminal you should hopefully know about some of these tricks already but more importantly, if you’re like me, are always looking for ways to improve the efficiency of your bash workflow and making your life easier.
There are a few things that I would quickly like to note. If you use tmux as your CLI session manager you may not be able to use some of the mentioned hotkeys to get around by default if you don’t have some settings turned on in your configuration file.
You can take a look at my custom .tmux.conf file if you’re interested in screen style bindings plus configuration for hotkeys. If you simply want to add the option that turns on the correct hotkey bindings for your terminal, add this line to your ~/.tmux.conf file
set-window-option -g xterm-keys on
Also, if you are a Mac user, and don’t already know about it, I highly recommend checking out iTerm2. Coming primarily from a Linux background the hotkey bindings in Mac OS X are a little bit different than what I am used to and were initially a challenge for me to get accustomed to. The transition for me took a little bit but iTerm has definitely helped me out immensely, as well as a few other ticks learned along the way. I really haven’t dug through all the options in iTerm but there are a huge number of options and customizations that can made.
The only thing I have been interested in so far is the navigation which I will highlight below.
Adjust iTerm keybindings – As I mentioned, I am used to using Linux keybinding so a natural fit for my purposes is the option key. The first step is to disable the custom binding in the iTerm preferences. To do this, click iTerm -> Preferences -> Profiles -> Keys and find the binding for option left arrow and option right arrow and remove them from the default profile.
Next, add the following to your global key bindings, iTerm -> Preferences -> Keys.
Move left one word
- Keyboard shortcut: ??
- Action: Send Escape Sequence
- Escape: b
Move right one word
- Keyboard shortcut: ??
- Action: Send Escape Sequence
- Escape: f
Finally, it is also worth pointing out that I use zsh for my default shell. There are some really nice additions that zsh offers over vanilla bash. I recently ran across this blog post which has some awesome tips. I have also written about switching to zsh here. Anyway, here is the lis. It will grow as I find more tips.
Basic navigation:
- Ctrl-left/right arrow – Jump between words quickly.
- Opt-left/right arrow – Custom iTerm binding for jumping between words quickly.
- Alt-left/right arrow – Linux only. Jump between words quickly.
- Esc-b/f – Mac OS. Similar to arrow keys, move between words quickly.
- Alt-b – Linux only. Jump back one word. Handy with other hotkeys overridden.
- Ctrl-a – Jump to the beginning of a line (doesn’t work with tmux mappings).
- Ctrl-e – Jump to the end of a line.
- End – SImilar to ctrl-e this will send your cursor to the end of the line.
- Home – Similar to End, except jumps to the beginning of the line.
Intermediate navigation:
- Ctrl-u – Copy entire command to clipboard.
- Ctrl-y – Paste previously copied ctrl-u command in to the terminal.
- Ctrl-w – Cut a word to the left of the cursor.
- Alt-d – Cut after word after the cursor position
Advanced use:
- Ctrl-x Ctrl-e – Zsh command. Edit the current command in your $EDITOR, which for me is vim
- Ctrl-r – Everybody hopefully should know this one. It is basically recursive search history
- Ctrl-k – Erase everything after the current cursor position. Handy for long commands
- !<command>:p – Print the last command
- cd … – Zsh command. This can be easily aliased but will jump up two directories
- !$ – Quickly access the last argument of the last command.
Zsh tab completion
Tab completion with Zsh is awesome, it’s like bash completion on steroids. I will attempt to highlight some of my favorite tab completion tricks with Zsh.
Directory shorthand – Say you need to get to a directory that is nested deeply. You can use the first few characters that will uniquely match to that directory to navigate instead of typing out the whole command. So for example, cd /u/lo/b will expand out to /usr/local/bin.
command specific history – This one comes in handy all the time. If you need to grab a command that you don’t use very often you can user Ctrl-r to match the first part of the command and from there you can up arrow to locate the command you typed.
Spelling and case correction – Bash by default can get annoying if you have a long command typed out but somehow managed to typo part of the command. In zsh this is (sometimes) corrected for you automatically when you <tab> to complete the command. For example if you are changing dirs in to the ‘Documents’ directory you can type ‘cd ~/doc/’ and the correct location will be expanded for you.
This list will continue to grow as I find more handy shortcuts, hotkeys or generally other useful tips and tricks that I find in my day to day command line work. I really want to build a similar list for things in Vim but my Vim skills are unfortunately lacking plus there is already some really nice documentation and guidance out there already. If you are interested in writing up a Vim productivity post I would love to post it. Likewise, if you have any other nice shortcuts or tips you think are worth mentioning, post them in the comments and I will try to get them added to the list.