Skip to main content

Productivity tools for power users of command line interfaces

A comprehensive guide to essential command-line productivity tools that can dramatically improve your workflow efficiency in terminal environments.

Introduction

The command line remains one of the most powerful interfaces for system interaction, offering unparalleled efficiency and control for those willing to master it. This guide explores essential tools that transform ordinary terminal usage into a seamless, productive experience. Whether you're a developer, system administrator, or enthusiast, these utilities will help you navigate, manipulate, and interact with your system more effectively.

Having the right tools at your disposal can dramatically speed up your workflow. Unix-like systems offer a vast ecosystem of purpose-built utilities that enhance terminal productivity. This article explores both foundational tools and lesser-known gems that deserve a place in every power user's toolkit.

General purpose productivity enhancers

The following tools enhance your general terminal experience, making everyday tasks faster and more intuitive.

Command execution and navigation

eg provides example usage for common commands, serving as an interactive cheat sheet right in your terminal. When you can't quite remember the syntax for a particular command:

# Show examples for the tar command
eg tar

# Display examples for working with grep
eg grep

fzy is a fuzzy finder that transforms how you select from lists in your terminal. Unlike more complex alternatives, fzy offers simplicity with powerful matching algorithms:

# Find and open a file using fzy and vim
vim $(find . -type f | fzy)

# Select and kill a process
ps aux | fzy | awk '{print $2}' | xargs kill

fzf offers a more feature-rich alternative to fzy, providing advanced features like multi-selection, preview windows, and key bindings:

# Search through your shell history
CTRL+R

# Search for files in current directory and below
CTRL+T

# Jump to directories with cd
ALT+C

Tip

Configure your `.bashrc` or `.zshrc` to integrate fzf with commands you frequently use. For example:
# Add this to your shell configuration file
alias preview='fzf --preview "cat {}"'

This creates a preview command that allows you to interactively search files and preview their contents simultaneously.

History and context management

mcfly replaces your shell's default history search with an intelligent search engine that takes into account your working directory and usage patterns:

# Install mcfly
curl -LSfs https://raw.githubusercontent.com/cantino/mcfly/master/install.sh | sh

# Add to your shell configuration
eval "$(mcfly init zsh)"

direnv creates environment-specific settings that automatically activate when you enter a directory:

# Create a .envrc file in your project directory
echo 'export DATABASE_URL="postgresql://user:pass@localhost/mydb"' > .envrc
direnv allow

File management utilities

These tools modernise how you search, find, and manipulate files on your system.

Finding and searching files

fd serves as a faster, user-friendly alternative to the classic find command. It offers sensible defaults like ignoring patterns from .gitignore and colorised output:

# Find all Python files in current directory and subdirectories
fd '.py$'

# Find files matching "document" in the Documents directory
fd document ~/Documents

# Find all executable files
fd -t x

While fd isn't a complete replacement for find, it handles most daily use cases more elegantly. The traditional find command remains useful when:

  • fd's feature set doesn't cover a specific use case
  • Executing fd encounters problems (such as argument lists that are too long)
  • Writing scripts where portability is a concern

ripgrep (rg) searches file contents with impressive speed, automatically respecting .gitignore rules and using smart filtering:

# Search for "function" in all files
rg function

# Search for "error" only in Python files
rg -t py error

# Search for "config" in files, showing 2 lines of context
rg -C 2 config

Note

Both `fd` and `ripgrep` respect `.gitignore` files by default, making them particularly useful in codebases. Use the `-u` flag to ignore these rules when needed.

File manipulation

rename provides powerful batch renaming capabilities using Perl regular expressions:

# Add a prefix to all text files
rename 's/^/prefix_/' *.txt

# Change file extension from .txt to .md
rename 's/\.txt$/.md/' *.txt

# Convert filenames to lowercase
rename 'y/A-Z/a-z/' *

mmv (multiple move) allows for sophisticated batch renaming with a different syntax that some find more intuitive:

# Add a timestamp prefix to all log files
mmv "*.log" "#1.$(date +%Y%m%d).log"

# Organise photos into date-based directories
mmv "*.jpg" "dates/#1.jpg"

Shell enhancements

The Z shell (zsh) offers significant improvements over bash for interactive use. These enhancements make it even more powerful.

Z shell customisation

Completion system provides context-aware tab completion that goes well beyond basic filename completion:

# Configure advanced completion in .zshrc
autoload -Uz compinit
compinit

# Enable menu selection for completion
zstyle ':completion:*' menu select

Syntax highlighting helps prevent errors by providing visual feedback as you type:

# With syntax highlighting, your command line shows:
# - Existing commands or aliases in green
# - Valid paths in orange
# - Errors in red before you execute

# Install zsh-syntax-highlighting and add to .zshrc
source /path/to/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

Vim mode allows using familiar vim keybindings in your shell:

# Enable vim mode in .zshrc
bindkey -v

# Add useful keybindings in vim mode
bindkey '^P' up-history
bindkey '^N' down-history

Important

When setting up vim mode, remember to configure a visual indicator for the current mode (normal/insert). This prevents confusion when switching between modes:
# Add to .zshrc
function zle-line-init zle-keymap-select {
    VIM_PROMPT="%{$fg_bold[yellow]%} [% NORMAL]%  %{$reset_color%}"
    RPS1="${${KEYMAP/vicmd/$VIM_PROMPT}/(main|viins)/} $EPS1"
    zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select
</div>

Directory navigation

z plugin transforms directory navigation by learning your most frequently used directories:

# Navigate to your most frequently used code directory
z code

# Jump to a directory containing "project" in its path
z project

autojump offers similar functionality with a slightly different approach:

# Jump to previously visited directory
j project

# Open the top directory in your file manager
jo documents

Development tools

These utilities specialise in making code-related tasks more efficient.

Version control

lazygit provides an intuitive terminal UI for Git operations:

# Launch lazygit in current repository
lazygit

# Common operations within lazygit:
# - Space: Stage/unstage file
# - c: Commit changes
# - P: Push changes
# - p: Pull changes

tig offers a text-mode interface for Git with a minimalist approach:

# View commit history
tig

# View specific file history
tig path/to/file

# Browse branches
tig refs

Data processing

jq makes working with JSON data in the terminal straightforward:

# Pretty-print JSON
cat data.json | jq

# Extract specific fields
cat users.json | jq '.[] | {name: .name, email: .email}'

# Filter based on conditions
cat data.json | jq '.items[] | select(.price > 10)'

httpie simplifies HTTP requests with intuitive syntax and colorised output:

# Make a simple GET request
http example.com

# POST JSON data
http POST api.example.com/users name=John age:=30

# Send form data
http -f POST example.com/submit name=John

Conclusion

The command line remains an unmatched environment for productivity once you have the right tools configured. The utilities covered in this guide represent a starting point for building a personalised, efficient terminal workflow. Consider exploring each tool individually, gradually incorporating those that align with your specific needs and working style.

For continued learning and exploration of terminal productivity:

  • Experiment with combining these tools using pipes and redirections
  • Create aliases and functions for your most common workflows
  • Regularly review your shell configuration to refine and optimise
  • Explore dotfiles repositories on GitHub for inspiration

The perfect terminal setup is highly personal—these tools provide building blocks for crafting an environment that feels like a natural extension of your thought process.