What fzf Does
- Interactive filter — pipe any list, select one or many
- Fuzzy matching — type partial letters to narrow down
- Preview window — show file contents, git diff, commit message
- Multi-select —
--multifor selecting multiple items - Key bindings — Ctrl+T (files), Ctrl+R (history), Alt+C (dirs)
- Shell integrations — bash, zsh, fish auto-completions
- Composable — works with any
find,ls,git,ps,history
Architecture
Reads stdin, renders interactive TUI via termios. On Enter, writes selection to stdout. Matching algorithm combines substring match, camelCase boundaries, and path components for intelligent ranking.
Self-Hosting
CLI tool, zero runtime deps.
Key Features
- Super fast (Go + optimized matcher)
- Fuzzy matching with smart ranking
- Preview window
- Multi-select mode
- Shell key bindings
- Works with any input stream
- Customizable colors and layout
- Can trigger actions on selection
Comparison
| Tool | Matching | Preview | Speed |
|---|---|---|---|
| fzf | Fuzzy | Yes | Fastest |
| skim (sk) | Fuzzy | Yes | Fast (Rust) |
| peco | Fuzzy | No | Medium |
| fzy | Fuzzy | No | Fast (small) |
| percol | Fuzzy | Limited | Python |
FAQ
Q: Can fzf and ripgrep be used together?
A: A perfect match. rg --files | fzf fuzzy-matches over a gitignore-aware file list.
Q: How do I pair it with tmux?
A: fzf supports a --tmux option that displays it in a floating pane.
Q: How do I define a preview?
A: fzf --preview "bat --color=always {}" --preview-window=right:60%
Sources & Credits
- Docs: https://junegunn.github.io/fzf/
- GitHub: https://github.com/junegunn/fzf
- License: MIT