Terminal Productivity: tmux, fzf, and Shell Aliases That Save Hours

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 path
  • Alt-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.