Truques para navegar em projetos grandes com fzf e ripgrep
1. Por que fzf e ripgrep são indispensáveis em projetos grandes
Navegar em projetos com milhares de arquivos usando ferramentas tradicionais como grep, cd e find rapidamente se torna inviável. O grep convencional é lento em bases grandes, find não oferece filtros inteligentes e a navegação manual com cd exige memorizar caminhos complexos.
O ripgrep (rg) resolve esses problemas com busca ultrarrápida usando regex, ignorando automaticamente diretórios listados no .gitignore. Já o fzf (fzf) é um filtro fuzzy interativo que permite buscar e selecionar arquivos, comandos e histórico com apenas alguns caracteres.
Juntos, eles formam uma dupla imbatível: em milhares de arquivos, você encontra qualquer método, classe ou definição em segundos.
2. Instalação e configuração básica
Instalação nos principais sistemas:
# Linux (Debian/Ubuntu)
sudo apt install ripgrep fzf
# macOS
brew install ripgrep fzf
# WSL2 (Windows)
sudo apt install ripgrep fzf
Configure variáveis de ambiente no seu .bashrc ou .zshrc:
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'
export FZF_DEFAULT_COMMAND='rg --files --hidden --follow'
# Ativar atalhos de teclado
source /usr/share/fzf/key-bindings.zsh # ou .bash
Verifique a instalação:
rg --version
fzf --version
3. Navegação de arquivos com fzf + ripgrep
Substitua o Ctrl+T padrão para buscar arquivos com ripgrep:
# No .bashrc/.zshrc
export FZF_DEFAULT_COMMAND='rg --files --hidden --follow'
Comando customizado com preview:
fzf --preview 'bat --color=always {}'
Buscando ignorando diretórios específicos:
rg --files --glob '!node_modules' --glob '!vendor' | fzf
Exemplo prático para abrir arquivo:
vim $(rg --files | fzf)
code $(rg --files | fzf)
4. Busca de texto e navegação por conteúdo
Use rg como fonte para fzf e encontre linhas específicas:
rg --line-number --no-heading . | fzf
Preview avançado com contexto:
fzf --preview 'rg --color=always --context=3 {q} {}'
Navegando para a linha exata no editor:
# Extrair linha e arquivo
rg -n "minha_funcao" | fzf | awk -F: '{print $1, $2}' | while read -r arquivo linha; do
vim +$linha "$arquivo"
done
Exemplo prático: encontre todas as chamadas de validateUser e pule para a definição:
rg -n "validateUser" | fzf | awk -F: '{printf "%s +%s\n", $1, $2}' | xargs vim
5. Integração com editores e IDEs
No Vim/Neovim, instale o plugin fzf.vim:
" No init.vim/init.lua
Plug 'junegunn/fzf.vim'
" Comandos disponíveis
:Rg " busca por texto
:Files " busca por arquivos
:Buffers " navega entre buffers
No VS Code, use a extensão "fzf" ou configure atalhos customizados:
// settings.json
{
"fzf.keyboardShortcut": "ctrl+shift+p",
"fzf.useRipgrep": true
}
Navegação entre branches no Git:
git log --oneline | fzf | awk '{print $1}' | xargs git checkout
Atalho Ctrl+R no terminal para buscar histórico de comandos:
# Já vem ativado por padrão após source do fzf
# Digite Ctrl+R e comece a digitar
6. Automação com scripts e aliases
Crie aliases no .bashrc/.zshrc:
alias f='fzf --preview "bat --color=always {}"'
alias fvim='vim $(fzf)'
alias fcode='code $(fzf)'
Script para buscar e abrir arquivo:
fopen() {
local arquivo=$(rg --files | fzf)
[ -n "$arquivo" ] && vim "$arquivo"
}
Busca recursiva com contexto:
fsearch() {
rg -n . | fzf | awk -F: '{print $1, $2}' | while read -r arquivo linha; do
vim +$linha "$arquivo"
done
}
Combinando com xargs para ações em lote:
# Abrir todos os arquivos com TODO selecionados
rg -l "TODO" | fzf -m | xargs vim
# Copiar arquivos selecionados para diretório
rg -l "bug" | fzf -m | xargs -I {} cp {} /tmp/analise/
7. Truques avançados para projetos gigantes
Use fd como alternativa ao find para listagem mais rápida:
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow'
Cache de resultados com reload:
fzf --bind 'ctrl-r:reload(rg --files)' --preview 'bat --color=always {}'
Busca em múltiplos repositórios:
# Crie um script buscar_repos.sh
for repo in ~/projetos/*/; do
rg -n "TODO" "$repo"
done | fzf
Filtros por tipo de arquivo:
rg --type py "def " | fzf
rg --type js "export " | fzf
rg --type md "## " | fzf
Preview com delta para visualizar diffs:
git log --oneline | fzf --preview 'git show --format="" {1} | delta'
8. Boas práticas e manutenção
Mantenha o .gitignore sempre atualizado:
# Exemplo de .gitignore eficiente
node_modules/
vendor/
dist/
build/
*.log
Evite fzf em diretórios com muitos binários:
# Use --type ou --glob para filtrar
rg --files --glob '!*.bin' --glob '!*.so'
Personalize atalhos de teclado:
fzf --bind 'ctrl-y:accept,ctrl-n:next,ctrl-p:prev'
Teste a performance regularmente:
time rg --files | wc -l
time find . -type f | wc -l
Documente seus truques e compartilhe com o time:
# Crie um arquivo .fzf_tricks no repositório
# Exemplo:
# alias ftodo='rg -l "TODO" | fzf -m | xargs vim'
# alias fgit='git log --oneline | fzf | awk "{print \$1}" | xargs git show'
Com esses truques, você navegará em projetos grandes com a agilidade de quem conhece cada arquivo. O segredo está em combinar a velocidade do ripgrep com a flexibilidade do fzf, criando um fluxo de trabalho que economiza horas por semana.
Referências
- Documentação oficial do ripgrep — Guia completo com todas as opções de busca, flags e exemplos de uso avançado
- Documentação oficial do fzf — Repositório com exemplos de configuração, key-bindings e integração com shell
- Tutorial de fzf no Vim/Neovim — Plugin oficial com comandos :Rg, :Files e integração completa com ripgrep
- Guia de fd (alternativa rápida ao find) — Ferramenta complementar ao ripgrep para listagem ultrarrápida de arquivos
- Tutorial de bat (preview com syntax highlight) — Utilitário para preview de código com cores, usado com fzf
- Guia de delta para diffs — Visualizador de diffs que pode ser integrado ao fzf para preview de commits