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