Your Terminal Is an IDE
I spend about 70% of my working day in a terminal. Not because I'm trying to look cool — because it's genuinely faster for most tasks once you've built up muscle memory. The key tools that make this work: tmux for session management, fzf for finding anything, and a curated set of shell aliases.
tmux: Terminal Sessions That Survive SSH Drops
If you SSH into servers without tmux, you're one network hiccup away from losing your running processes. But tmux is useful even locally — it lets you split your terminal into panes, switch between named sessions, and keep processes running when you close the terminal.
The essential commands:
# Start a named session
tmux new -s project
# Detach: Ctrl-b d
# Reattach
tmux attach -t project
# Split horizontally: Ctrl-b "
# Split vertically: Ctrl-b %
# Switch panes: Ctrl-b arrow-key
# Resize pane: Ctrl-b Ctrl-arrow-key
# Create a new window: Ctrl-b c
# Switch windows: Ctrl-b 0-9
# Rename window: Ctrl-b ,
My typical tmux layout for a project:
- Window 0: Editor (neovim)
- Window 1: Two panes — dev server on top, logs/tests on bottom
- Window 2: Git operations and general shell
- Window 3: Database CLI
Add this to ~/.tmux.conf for a better experience:
# Use Ctrl-a instead of Ctrl-b (easier to reach)
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# Mouse support (scrolling, pane selection)
set -g mouse on
# Start window numbering at 1
set -g base-index 1
set -g pane-base-index 1
# Faster key repetition
set -sg escape-time 0
# Increase scrollback
set -g history-limit 50000
# Better split shortcuts
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
fzf: Fuzzy Find Everything
fzf is a fuzzy finder that connects to anything that produces lines of text. It changed how I interact with the command line more than any other tool.
After installing fzf, you get three killer keybindings:
Ctrl-R— Fuzzy search through shell history (replaces the terrible default reverse-search)Ctrl-T— Fuzzy search files in the current directory tree and insert the selected pathAlt-C— Fuzzy search directories and cd into the selected one
But the real power is piping anything through it:
# Find and open a file
vim $(fzf)
# Find a process and kill it
kill $(ps aux | fzf | awk '{print $2}')
# Checkout a git branch
git checkout $(git branch | fzf)
# Search git log and show the selected commit
git show $(git log --oneline | fzf | awk '{print $1}')
# SSH to a host from your config
ssh $(grep "^Host " ~/.ssh/config | awk '{print $2}' | fzf)
Pair fzf with ripgrep (rg) for searching file contents, and fd as a faster alternative to find:
# Set fd as fzf's default file finder
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
# Preview files while fuzzy finding
export FZF_CTRL_T_OPTS="--preview 'bat --color=always --line-range :500 {}'"
Shell Aliases and Functions
Don't alias everything — alias the things you type multiple times per day. Here are the ones I actually use:
# Git shortcuts (the most common ones)
alias gs='git status'
alias gd='git diff'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline -20'
alias gco='git checkout'
# Docker
alias dc='docker compose'
alias dps='docker ps --format "table {{.Names}} {{.Status}} {{.Ports}}"'
alias dlogs='docker compose logs -f'
# Navigation
alias ..='cd ..'
alias ...='cd ../..'
alias ll='ls -alh'
# Functions for things that need arguments
mkcd() { mkdir -p "$1" && cd "$1"; }
port() { lsof -i :"$1"; }
weather() { curl "wttr.in/$1"; }
# Quick HTTP server in current directory
serve() { python3 -m http.server "${1:-8000}"; }
Other Tools Worth Installing
bat — cat with syntax highlighting and line numbers. Drop-in replacement.
ripgrep (rg) — grep that's 10-100x faster, respects .gitignore by default, and has better output formatting.
jq — JSON processing on the command line. Invaluable for working with API responses.
# Pretty-print JSON
curl -s api.example.com/users | jq '.'
# Extract specific fields
curl -s api.example.com/users | jq '.[] | {name: .name, email: .email}'
# Filter
curl -s api.example.com/users | jq '[.[] | select(.active == true)]'
htop/btop — Better process viewers than top. btop has nice graphs and is keyboard-friendly.
tldr — Community-maintained simplified man pages. tldr tar gives you the 5 commands you actually use instead of 4,000 lines of documentation.
Invest an afternoon setting up your terminal. The compound time savings over the next year will be substantial.