Command-Line Productivity: fzf, ripgrep, jq, bat, tmux, zoxide, and lazygit


Introduction





The command line remains the most powerful interface for development, operations, and data processing. Modern command-line tools have transformed the terminal experience, providing capabilities that rival graphical interfaces for many tasks. Mastering these tools significantly reduces friction in daily workflows.





This article covers seven essential CLI productivity tools: fzf, ripgrep, jq, bat, tmux, zoxide, and lazygit.





fzf: Fuzzy Finder





fzf is a general-purpose fuzzy finder that pipes any list of items into an interactive search interface. It can search files, command history, processes, git branches, and virtually any text stream.






# Search files recursively with preview


vim $(fzf --preview 'bat --color=always {}')




# Search and kill processes


kill -9 $(ps aux | fzf --header-lines=1 | awk '{print $2}')




# Interactive git branch checkout


git checkout $(git branch -a | fzf --height=40%)







fzf's key bindings enhance shell navigation: `Ctrl+T` pastes selected file paths, `Ctrl+R` searches command history, and `Alt+C` changes to selected directories. Custom preview windows using bat, head, or tree provide context before selection.





ripgrep (rg): Blazingly Fast Code Search





ripgrep recursively searches through files with regex patterns, respecting .gitignore and hidden files by default. It is significantly faster than grep, ack, or ag due to its use of SIMD instructions and optimized search algorithms.






# Search for pattern in current directory


rg "function getUsers" --type ts




# Search with context lines


rg "TODO" --context 3




# Search but exclude specific files


rg "password" --glob '!*.lock'







ripgrep output integrates with editors through the `--json` flag and supports PCRE2 regex features including lookaheads and backreferences. Combined with fzf, it provides instant code search across large repositories.





jq: JSON Processor





jq is a lightweight and flexible command-line JSON processor. It filters, transforms, and formats JSON data with a powerful expression language.






# Pretty-print JSON


cat data.json | jq '.'




# Extract specific fields


curl -s https://api.github.com/repos/jqlang/jq | jq '{name, description, stars: .stargazers_count}'




# Filter array items


cat logs.json | jq '.[] | select(.severity == "ERROR") | {timestamp, message}'







jq expressions range from simple field access to complex transformations with map, reduce, group_by, and custom functions. The `-c` flag produces compact output for streaming. Combined with `--stream`, jq processes JSON files larger than available memory.





bat: cat with Syntax Highlighting





bat is a clone of cat with syntax highlighting, Git integration, and automatic paging. It supports hundreds of languages with theme customization.






bat --paging=never file.json


bat --style=plain file.py


bat --language=yaml config.yaml







bat integrates with other tools as a pager. Setting `BAT_THEME` in shell configuration provides consistent color schemes. The `bat cache --build` command regenerates the syntax cache after installing new language definitions.





tmux: Terminal Multiplexer





tmux enables multiple terminal sessions within a single window, session persistence across disconnections, and split-pane layouts.






tmux new -s project


tmux attach -t project







Essential tmux key bindings:


* `Ctrl+B %` — Split pane vertically.

* `Ctrl+B "` — Split pane horizontally.

* `Ctrl+B c` — Create new window.

* `Ctrl+B ,` — Rename current window.

* `Ctrl+B [` — Enter scroll/copy mode.




tmux configuration in `~/.tmux.conf` customizes key bindings, status bar, colors, and mouse support. Plugins via tpm (tmux plugin manager) add features like persistent sessions, save/restore, and CPU monitoring.





zoxide: Smarter Directory Navigation





zoxide learns your directory usage patterns and allows jumping to frequently accessed directories with partial names.






z proj # Jump to ~/projects/my-project


z proj/src # Jump to subdirectory


zi # Interactive selection with fzf







zoxide replaces cd with a learning database: `z foo` navigates to the most relevant directory containing "foo" based on frequency and recency. The `zi` command opens an interactive fzf selector for ambiguous matches.





lazygit: Terminal Git Interface





lazygit provides a terminal-based Git interface with vim-like keybindings. It visualizes the staging area, commit graph, branch tree, and file changes in split-pane views.






lazygit







Essential operations:


* Arrow keys navigate files and commits.

* Space to stage/unstage files.

* `c` to commit, `p` to push.

* `m` to merge, `r` to rebase.

* `d` to view diff of selected file.

* `:` for custom commands.




lazygit significantly reduces Git command memorization while providing visual feedback for complex operations like interactive rebase, conflict resolution, and cherry-picking.





Conclusion





Modern CLI tools dramatically improve terminal productivity. fzf provides instant interactive filtering. ripgrep replaces slow grep with millisecond code search. jq transforms JSON manipulation on the command line. bat enhances file viewing. tmux enables persistent, multi-window terminal sessions. zoxide eliminates directory navigation friction. lazygit provides visual Git operations without leaving the terminal. Investing time to learn these tools pays dividends in daily efficiency.