2 pontos por GN⁺ 2025-10-19 | 1 comentários | Compartilhar no WhatsApp
  • ripgrep 15.0 é um grande lançamento que inclui várias atualizações, como correções de bugs, melhorias de desempenho e novos recursos
  • Vários bugs relacionados à aplicação das regras do gitignore foram corrigidos, e houve otimização de memória no processamento de arquivos grandes
  • Foi adicionado suporte à plataforma Windows aarch64, e o suporte a powerpc64 foi descontinuado
  • Entre os novos recursos estão o suporte simultâneo a --json e flags de substituição, além de suporte a chaves aninhadas em globs
  • Com melhorias gerais de desempenho, correções de erros e aprimoramentos de usabilidade, a produtividade dos desenvolvedores aumenta

Visão geral do ripgrep 15.0

ripgrep 15.0 é a versão principal mais recente do ripgrep e inclui principalmente correções de bugs, pequenas melhorias de desempenho e adição de novos recursos de menor porte

ripgrep é uma ferramenta que pesquisa recursivamente padrões de expressão regular no diretório atual, linha por linha
Por padrão, segue as regras do gitignore e ignora automaticamente arquivos/diretórios ocultos e arquivos binários

Principais mudanças

  • Foram corrigidos vários bugs relacionados à correspondência com gitignore
    • Correção de um bug frequentemente relatado relacionado à aplicação das regras de gitignore de diretórios superiores
  • Foi corrigido um bug de aumento no uso de memória ao processar arquivos gitignore muito grandes
  • Em rg -vf file, quando file está vazio, agora tudo passa a corresponder
  • A flag -r/--replace agora funciona corretamente junto com --json
  • Alguns repositórios Jujutsu (jj) também passam a ser reconhecidos como repositórios Git, fazendo com que o ripgrep siga o gitignore do jj
  • Globs agora oferecem suporte a chaves aninhadas

Suporte a plataformas

  • Agora são fornecidos binários de release para aarch64 no Windows
  • Binários de release para powerpc64 não são mais fornecidos
    • A descontinuação ocorreu devido a problemas no workflow de release do CI; caso deseje testes e suporte, isso pode ser solicitado
  • Os binários do ripgrep são compilados com LTO (otimização de tempo de link completa), o que traz pequeno ganho de desempenho e redução de tamanho

Melhorias de desempenho

  • No Windows, quando a opção -z/--search-zip não é usada, houve melhora de desempenho com a desativação da busca por binário auxiliar
  • No Windows, a omissão da normalização de caminhos ao exibir hyperlinks melhora a velocidade
  • Melhor desempenho ao lidar com valores grandes usando -A/--after-context

Correções de bugs

  • Foram corrigidos vários problemas relacionados a gitignore, incluindo a não aplicação do gitignore de diretórios superiores
  • O comando rg -vf file em arquivos vazios foi ajustado para corresponder a tudo
  • Foi adicionado tratamento para ignorar o marcador UTF-8 BOM em .gitignore e afins
  • Otimização do uso de memória ao processar arquivos gitignore grandes
  • Corrigido erro na saída do número de bytes pesquisados ao usar --stats
  • Corrigido erro no processamento de globs terminados em .
  • Resolvido o problema de indicação de excesso de correspondências ao combinar -m/--max-count com -U/--multiline
  • Ao usar a flag -r/--replace, os terminadores de linha agora são preservados
  • Resolvido o erro de inversão do código de saída ao usar a combinação -q --files-without-match
  • Resolvida a inconsistência na documentação entre -c/--count e --files-with-matches
  • Corrigido um problema raro de panic com expressões regulares grandes e entradas grandes
  • Tratamento de escape de hífen em nomes de flags de opções na man page
  • Compilação estática de PCRE2 no release para macOS aarch64
  • Corrigido um bug no filtro de ignorar diretórios superiores ao pesquisar arquivos ocultos colocados em whitelist
  • Corrigido problema de estatísticas resumidas incorretas ao usar a flag --json
  • Corrigido erro no processamento de gitignore ao pesquisar por caminhos absolutos e gitignore global
  • Corrigido o problema de panic que ocorria ao combinar -U/--multiline com -r/--replace

Melhorias de recursos

  • O conjunto padrão de tipos de arquivo foi amplamente expandido e aprimorado
  • -r/--replace foi melhorado para ser compatível com --json
  • O recurso de autocompletar do fish shell foi aprimorado para refletir o arquivo de configuração do ripgrep
  • Foi adicionado italic aos atributos de estilo disponíveis em --color
  • O diretório .jj passa a ser tratado como repositório Git
  • Ao usar multithreading, foi adicionada a capacidade de agendar a busca na ordem dos arquivos especificados na CLI
  • Foram adicionados artefatos de release aarch64 para Windows
  • Foi adicionado o tipo de cor highlight, permitindo estilizar o texto não correspondente em linhas com correspondência
  • Foi adicionada a funcionalidade de alternâncias aninhadas aos crates globs e globset
  • O autocompletar de --hyperlink-format foi melhorado em bash, fish e zsh

1 comentários

 
GN⁺ 2025-10-19
Comentários do Hacker News
  • O ripgrep é uma ferramenta que realmente me economizou muito tempo ao longo dos últimos anos; é indispensável e a primeira coisa que instalo sempre que começo em um sistema novo, especialmente ao explorar codebases antigas. Uma pequena frustração é que, ao usar a opção -F (tratar como literal), ainda há casos em que alguns caracteres continuam sendo tratados como especiais e exigem escape. Não lembro exatamente quais caracteres eram, mas ainda assim fico feliz toda vez que vejo o ripgrep continuar sendo atualizado.

    • Se você der um exemplo de qual caractere causou problema, dá para explicar em detalhes. -F/--fixed-strings desativa 100% dos recursos de expressão regular no padrão e trata tudo apenas como literal; se algum escape for necessário, provavelmente é algo exigido pelo shell.
  • O rg parece uma ferramenta mágica, mas na prática é o resultado de engenharia excepcional, melhorias constantes e do aproveitamento máximo do incrível desempenho do hardware que todos nós usamos diariamente. Também foi uma inovação que abriu caminho para que desenvolvedores naveguem e entendam código mais rápido, sem precisar criar padrões separados como LSP.

    • Fiquei realmente curioso sobre o que "smithing" quer dizer nesse contexto.
  • A codebase do ripgrep é um dos melhores exemplos de "preparar uma bebida, sentar na cadeira mais confortável e mergulhar em um software de alta qualidade". Você vai clicando aqui e ali pelos cantos do código e só admirando.

  • Assim como o fd, o rg é uma ferramenta de linha de comando que dá prazer de usar de verdade. Adoro essas ferramentas novas baseadas em comandos.

    • Descobri recentemente que os autores do ripgrep e do fd trabalham na Astral. Aí fez sentido por que o software da Astral é tão bom.
    • As duas ferramentas funcionam, sem praticamente nenhuma opção, exatamente do jeito que eu quero em 99% dos casos. É uma enorme economia de tempo. Por exemplo, basta digitar rg <string> ou fd <string>.
  • Um recurso que eu gostaria de ver adicionado pessoalmente é uma flag de "extensão", que funcionasse como -g, mas tratando o argumento de entrada como extensão (por exemplo: rg -e c,h). Na maioria das vezes, quando uso um padrão glob, meu objetivo é combinar extensão.

    • Queria perguntar se você já viu a flag -t/--type; dá para usar como -tc, como no seu exemplo. Se for uma extensão que não existe no ripgrep, também dá para definir um type manualmente.
  • O ripgrep foi o principal motivo de eu começar a me interessar por Rust. Ele funcionava de forma tão polida que o fato de ter sido escrito em Rust me deixou ainda mais curioso. Mesmo vários anos depois, ainda uso rg todos os dias.

    • O nibbles foi o principal motivo de eu me interessar por QBasic. Era tão bem-feito que achei interessante o fato de ter sido escrito em QBasic, e desde então passei a usar nibbles todos os dias.
  • Recentemente descobri a opção --replace e fiquei bastante impressionado. Passei a usá-la junto com --type, e foi meio frustrante perceber que eu não sabia que esses recursos tão legais existiam. Daqui para frente pretendo ler as release notes com atenção e ficar mais atento a novidades. Também gostei das melhorias de integração com o jj.

  • É uma ótima ferramenta e muito fácil de usar. Comecei usando no Linux, mas hoje também uso no Windows. Graças a ela, agora passei a usar expressões regulares diretamente na busca em vez de wildcards.

    • É melhor que o grep padrão, e o comando rg --files também é útil.
  • Nesta semana fiz uma função bash para executar o ripgrep apenas em arquivos rastreados pelo git.

      rgg() {
        readarray -d '' -t FILES < <(git ls-files -z)
        rg "${@}" "${FILES[@]}"
      }
    

    Dá para pesquisar muito mais rápido em diretórios com muitos arquivos binários ou arquivos ocultos. Para pesquisar arquivos ocultos é preciso usar a opção -uu, mas essa opção também faz a busca em arquivos binários. Quando o número de arquivos chega às centenas, o próprio git ls-files já fica lento.

    • Fiquei curioso para ver um exemplo concreto em que isso fique mais rápido. Em geral, o ripgrep já respeita as regras do gitignore, então se comporta de forma parecida com git ls-files. Só para esclarecer: a opção -uu diz ao ripgrep para ignorar gitignore e arquivos ocultos, mas ele ainda pula arquivos binários. Para incluir binários também, é preciso -uuu. O maior problema da função é que, se você usar no repositório do kernel Linux, aparece o erro de argument list too long, então eu troquei por xargs.
        $ git ls-files -z | time xargs -0 rg APM_RESUME
        ...
      
        real  0.638
        user  0.741
        sys   1.441
        maxmem 29 MB
        faults 0
        $ time rg APM_RESUME
        ...
      
        real  0.097
        user  0.399
        sys   0.588
        maxmem 29 MB
        faults 0
      
      Se alguém tiver um exemplo em que git ls-files -z | xargs -0 rg ... seja mais rápido do que simplesmente rg ..., por favor compartilhe.
    • Depois de escrever isso, reli o manual e descobri que, em vez de -uu, dá para usar a flag -. (apenas pesquisar arquivos ocultos). Seria bom poder pesquisar arquivos ocultos rastreados pelo git, mas o overhead de consultar a lista de arquivos não é algo desprezível, mesmo se for feito em Rust.
    • Talvez eu esteja deixando passar alguma coisa, mas o ripgrep não ignora por padrão arquivos não rastreados pelo git?
    • Fico curioso para saber se essa abordagem é mais rápida do que git grep.
  • Uso o ripgrep todos os dias no trabalho, tanto na linha de comando quanto nas buscas do VSCode. Meus agradecimentos ao burntsushi.