Productivity
fzf-fuzzy-finder
Command-line fuzzy finder for interactive filtering
---
name: fzf-fuzzy-finder
description: Command-line fuzzy finder for interactive filtering and selection - integrates with shell, vim, and other tools.
homepage: https://github.com/junegunn/fzf
metadata: {"clawdbot":{"emoji":"🔮","requires":{"bins":["fzf"]},"install":[{"id":"brew","kind":"brew","formula":"fzf","bins":["fzf"],"label":"Install fzf (brew)"},{"id":"apt","kind":"apt","package":"fzf","bins":["fzf"],"label":"Install fzf (apt)"}]}}
---
# fzf - Fuzzy Finder
Interactive command-line fuzzy finder with powerful integration capabilities.
## Basic Usage
### Simple filtering
```bash
# Pipe list to fzf
ls | fzf
# Select file
find . -type f | fzf
# Multi-select (Tab to select, Shift+Tab to deselect)
ls | fzf -m
# Preview files while selecting
ls | fzf --preview 'cat {}'
# With bat for syntax highlighting
ls | fzf --preview 'bat --color=always {}'
```
### Shell integration
```bash
# After installing, add to ~/.bashrc or ~/.zshrc:
# source /path/to/fzf/shell/completion.bash
# source /path/to/fzf/shell/key-bindings.bash
# Key bindings:
# Ctrl+R - Command history
# Ctrl+T - File search
# Alt+C - Directory navigation
# Use in command line
vim **<TAB> # File completion
cd **<TAB> # Directory completion
kill -9 **<TAB> # Process completion
```
## Common Patterns
### File selection
```bash
# Open file in vim
vim $(fzf)
# Edit with preview
vim $(fzf --preview 'bat --color=always --line-range :500 {}')
# Select and copy
fzf | xargs -I {} cp {} /destination/
# Delete selected files
fzf -m | xargs rm
```
### Directory navigation
```bash
# CD to selected directory
cd $(find . -type d | fzf)
# Alias for quick nav
alias cdf='cd $(find . -type d | fzf)'
# Or use Alt+C keybinding
```
### Git integration
```bash
# Checkout branch
git branch | fzf | xargs git checkout
# Show commit
git log --oneline | fzf | awk '{print $1}' | xargs git show
# Add files interactively
git status -s | fzf -m | awk '{print $2}' | xargs git add
# Fuzzy git log browser
alias gll='git log --oneline | fzf --preview "git show {1}"'
```
### Process management
```bash
# Kill process
ps aux | fzf | awk '{print $2}' | xargs kill
# Kill multiple processes
ps aux | fzf -m | awk '{print $2}' | xargs kill -9
```
## Advanced Features
### Preview window
```bash
# Preview on the right
fzf --preview 'cat {}'
# Preview position and size
fzf --preview 'cat {}' --preview-window=right:50%
# Preview with bat
fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'
# Toggle preview with Ctrl+/
fzf --preview 'cat {}' --bind 'ctrl-/:toggle-preview'
# Preview directory contents
find . -type d | fzf --preview 'ls -la {}'
```
### Custom key bindings
```bash
# Execute action on selection
fzf --bind 'enter:execute(vim {})'
# Multiple bindings
fzf --bind 'ctrl-e:execute(vim {})' \
--bind 'ctrl-o:execute(open {})'
# Reload on key press
fzf --bind 'ctrl-r:reload(find . -type f)'
# Accept non-matching input
fzf --print0 --bind 'enter:print-query'
```
### Filtering options
```bash
# Case-insensitive (default)
fzf -i
# Case-sensitive
fzf +i
# Exact match
fzf -e
# Inverse match (exclude)
fzf --query='!pattern'
# OR operator
fzf --query='py$ | js$' # .py or .js files
# AND operator
fzf --query='test .py' # Contains both 'test' and '.py'
```
## Integration Examples
### With ripgrep
```bash
# Search content and open in vim
rg --line-number . | fzf | awk -F: '{print "+"$2, $1}' | xargs vim
# Search and preview matches
rg --line-number . | fzf --delimiter : \
--preview 'bat --color=always {1} --highlight-line {2}' \
--preview-window +{2}-/2
```
### With fd
```bash
# Find and preview files
fd --type f | fzf --preview 'bat --color=always {}'
# Find files modified today
fd --changed-within 1d | fzf --preview 'bat {}'
```
### With docker
```bash
# Select and enter container
docker ps | fzf | awk '{print $1}' | xargs -I {} docker exec -it {} bash
# Remove selected images
docker images | fzf -m | awk '{print $3}' | xargs docker rmi
# View logs
docker ps | fzf | awk '{print $1}' | xargs docker logs -f
```
### With kubectl
```bash
# Select pod
kubectl get pods | fzf | awk '{print $1}' | xargs kubectl describe pod
# Get logs
kubectl get pods | fzf | awk '{print $1}' | xargs kubectl logs -f
# Delete pods
kubectl get pods | fzf -m | awk '{print $1}' | xargs kubectl delete pod
```
## Useful Aliases
Add to your shell config:
```bash
# Fuzzy file search and open in vim
alias fv='vim $(fzf --preview "bat --color=always --style=numbers {}")'
# Fuzzy directory change
alias fcd='cd $(find . -type d | fzf)'
# Fuzzy git checkout
alias gco='git branch | fzf | xargs git checkout'
# Fuzzy process kill
alias fkill='ps aux | fzf | awk "{print \$2}" | xargs kill -9'
# Fuzzy history search (Ctrl+R is built-in)
alias fh='history | fzf | awk "{print \$2}" | xargs -I {} sh -c "{}"'
# Find and edit
alias fe='fd --type f | fzf --preview "bat --color=always --style=numbers {}" | xargs -r $EDITOR'
```
## Configuration
### Environment variables
```bash
# Default options
export FZF_DEFAULT_OPTS='
--height 40%
--layout=reverse
--border
--inline-info
--preview "bat --style=numbers --color=always --line-range :500 {}"
'
# Use fd instead of find
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
# For Ctrl+T
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
# For Alt+C
export FZF_ALT_C_COMMAND='fd --type d --hidden --follow --exclude .git'
```
### Color scheme
```bash
export FZF_DEFAULT_OPTS='
--color=bg+:#313244,bg:#1e1e2e,spinner:#f5e0dc,hl:#f38ba8
--color=fg:#cdd6f4,header:#f38ba8,info:#cba6f7,pointer:#f5e0dc
--color=marker:#f5e0dc,fg+:#cdd6f4,prompt:#cba6f7,hl+:#f38ba8
'
```
## Advanced Workflows
### Project file browser
```bash
# Smart file browser with preview
fzf \
--preview 'bat --color=always --style=numbers --line-range=:500 {}' \
--preview-window='right:60%:wrap' \
--bind 'enter:execute(vim {})' \
--bind 'ctrl-y:execute-silent(echo {} | pbcopy)+abort' \
--header 'Enter: edit | Ctrl+Y: copy path'
```
### Multi-purpose search
```bash
# Search in files and navigate to line
rg --line-number --no-heading . | \
fzf --delimiter=: \
--preview 'bat --color=always --style=numbers --highlight-line {2} {1}' \
--preview-window='+{2}-/2' \
--bind 'enter:execute(vim {1} +{2})'
```
### Docker container manager
```bash
#!/bin/bash
# docker-fzf.sh
container=$(docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" | fzf --header-lines=1 | awk '{print $1}')
if [ -n "$container" ]; then
docker exec -it "$container" bash
fi
```
## Tips
- Use `--preview` for visual context
- Combine with `bat`, `rg`, `fd` for powerful workflows
- Press `?` in fzf to see keybindings
- Use `Tab` for multi-select
- `Ctrl+/` to toggle preview (if bound)
- `Ctrl+K` / `Ctrl+J` to navigate
- Start query with `'` for exact match
- Start with `!` to exclude
- Use `|` for OR, space for AND
- Set `FZF_DEFAULT_OPTS` for persistent config
## Performance
```bash
# For large file lists, use fd or rg
export FZF_DEFAULT_COMMAND='fd --type f'
# Limit depth for faster results
export FZF_DEFAULT_COMMAND='fd --type f --max-depth 5'
# Use parallel preview
fzf --preview 'bat {}' --preview-window 'hidden'
```
## Documentation
GitHub: https://github.com/junegunn/fzf
Wiki: https://github.com/junegunn/fzf/wiki
Examples: https://github.com/junegunn/fzf/wiki/examples
productivity
By
Comments
Sign in to leave a comment