世界を動かす技術を、日本語で。

Ripgrep 15.0.0

概要

  • ripgrep 15の主な内容は バグ修正パフォーマンス改善小規模な新機能追加
  • gitignore関連の問題大規模gitignoreファイルのメモリ使用量 のバグ修正。
  • 新たに Windows aarch64対応jjリポジトリ対応 などのプラットフォーム強化。
  • -r/--replaceと--jsonの併用ネストした中括弧のglob など機能拡張。
  • CIやリリースアーティファクト の変更、 LTO有効化 による軽量化。

ripgrep 15の新機能と改善点

  • ripgrep 15 は主に バグ修正軽微な機能追加パフォーマンス向上 が中心
  • ripgrep は正規表現でディレクトリを再帰的に検索する 高速検索ツール
  • デフォルトで gitignoreルール を尊重し、 隠しファイルやバイナリファイル を自動的にスキップ
  • jjリポジトリ(Jujutsu) もgitリポジトリ同様に扱い、gitignoreを適用
  • Windows aarch64 向けリリースアーティファクト追加、 powerpc64 向けは生成停止

パフォーマンス改善

  • LTO(Link Time Optimization) をフル有効化し、 バイナリサイズ削減性能向上
  • -z/--search-zip 未使用時、Windowsで 補助バイナリ解決処理 をスキップ
  • Windows環境で ハイパーリンク出力時のパス正規化 を回避し高速化
  • -A/--after-context オプション使用時の大規模値でのパフォーマンス向上

バグ修正

  • gitignoreの親ディレクトリ適用バグ大規模gitignoreファイルのメモリ問題 など解消
  • rg -vf file でfileが空の場合、全件一致するよう修正
  • .gitignore先頭のUTF-8 BOM を無視する処理追加
  • --stats出力の検索バイト数誤表示globパターンの誤動作 など細かな不具合修正
  • -m/--max-countと-U/--multiline 併用時の一致数過多問題を修正
  • -r/--replaceフラグ使用時 の行終端記号保持など細部を改善
  • --json 利用時の統計値誤りや 絶対パス検索時のgitignoreバグ も修正

新機能・拡張

  • -r/--replace--json の併用をサポート
  • fishシェル補完 がripgrep設定ファイルを考慮
  • --color のstyle属性にitalic追加、 --hyperlink-format の補完強化
  • .jjディレクトリ を含むディレクトリをgitリポジトリとして扱う機能
  • マルチスレッド時 にCLIで指定した順番でファイルを検索する仕様
  • ハイライトカラータイプ 追加、マッチしないテキストの装飾が可能に
  • globパターン入れ子の中括弧(ネストしたalternates) をサポート

プラットフォーム・リリース関連

  • Windows aarch64 用バイナリ配布開始
  • powerpc64 向けアーティファクト生成は停止(CI問題のため、要望があれば再検討)
  • macOS aarch64 向けリリースで PCRE2の静的リンク を実施

まとめ

  • ripgrep 15は 安定性使い勝手 の向上を目指したアップデート
  • バグ修正細かな機能追加 が中心で、既存ユーザーも安心して移行可能
  • パフォーマンス改善新プラットフォーム対応 で、より広範な環境で利用可能

Hackerたちの意見

ripgrepのコードベースは、まさに「飲み物を pourして、最高に居心地のいい椅子に座って、高品質なソフトウェアを読む」ためのものだよ。ちょっとクリックしてみて、その素晴らしさに驚いてみて。

fdと同じように、rgを使うのが楽しいし、この新しいコマンドラインツールのセットも好きだな。

ripgrepとfdの両方の作者がAstralで働いてるって知ったんだけど、Astralがこんなに素晴らしいソフトウェアを作るのも納得だね。

両方とも、パラメータなしのデフォルトが99%の時に必要なものになってるのが好き。時間の節約になるよ。rgとfd。

すごく便利なツールで、使いやすい。最初はLinuxで使い始めて、今はWindowsでも使ってる。多分、これのおかげで正規表現を最初の検索オプションとして使うようになったんだ。標準のワイルドカードで検索してから正規表現に頼ることがなくなった。

普通のgrepよりも優れてるし、便利なrg --filesもあるよ。

ripgrepは毎日仕事で使ってる。コマンドラインでも、vscodeで検索する時でもね。ありがとう、burntsushi!

追加してほしい機能は「拡張子」フラグだな。-gに相当するけど、指定した引数を拡張子として扱うやつ(だから、rg -e c,hの代わりにrg -g '*.{c,h}')。99%の時、グロブパターンを使うのは拡張子にマッチさせるためなんだ。

-t/--typeフラグ見たことある?君の例は-tcって書けるよ。それに、ripgrepにまだない一般的なタイプは自分で定義できるからね。

ripgrepは、僕がRustに興味を持った主な理由の一つなんだ。めっちゃうまく動いて、Rustで書かれてるってことに興味が湧いたんだよね。何年も経った今、ほんとに良かったと思ってる。以来、毎日rgを使ってるよ!

今週、gitで管理されているファイルだけにripgrepをかける小さなbash関数を書いたんだ:rgg() { readarray -d '' -t FILES これ、バイナリファイルやコミットされたドットファイルがたくさんあるディレクトリではかなり速くなるよ。ドットファイルを検索するには-uuが必要だけど、それだとバイナリファイルも検索しちゃうんだ。数百のファイルがあるリポジトリでは、git ls-filesのオーバーヘッドがちょっと大きいね。

このコメントを書いた後、もう一度manページを読んでみたら、-uuの代わりに使える-.フラグを見つけたよ。gitで管理されている隠しファイルを検索できたらいいけど、全ての管理ファイルをリストするためにgitに問い合わせるオーバーヘッドは、Rustでもかなり大きいかもね。

もしかしたら見落としてるかもしれないけど、ripgrepってデフォルトでgitの未追跡ファイルを無視してるんじゃないの?

それが速い具体例を教えてもらえる?ripgrepは一般的にgitignoreを尊重してgit ls-filesに近い動作をしてるはずだよ。それに、-uuはgitignoreを無視して隠しファイルを検索するようにripgrepに指示するんだ。でも、ripgrepはバイナリファイルはスキップするよ。バイナリファイルも無視したいなら-uuuが必要だね。君のrgg関数をいじってみたけど、最初の問題はLinuxカーネルをチェックアウトしたときに起きたよ:$ rgg APM_RESUME bash: /home/andrew/rust/ripgrep/target/release/rg: Argument list too long じゃあ、xargsを使おう:$ git ls-files -z | time xargs -0 rg APM_RESUME arch/x86/kernel/apm_32.c 473: { APM_RESUME_DISABLED, "Resume timer disabled" }, include/uapi/linux/apm_bios.h 89:#define APM_RESUME_DISABLED 0x0d real 0.638 user 0.741 sys 1.441 maxmem 29 MB faults 0 それと、ただのrg APM_RESUMEと比べると:$ time rg APM_RESUME arch/x86/kernel/apm_32.c 473: { APM_RESUME_DISABLED, "Resume timer disabled" }, include/uapi/linux/apm_bios.h 89:#define APM_RESUME_DISABLED 0x0d real 0.097 user 0.399 sys 0.588 maxmem 29 MB faults 0 だから、git ls-files -z | xargs -0 rg ...rg ...より速い例ってある?

ripgrepにはほんとに助けられてるよ。何年も使ってきて、なくてはならないツールになった。新しいシステムを立ち上げたときにはすぐにインストールするし、古いコードベースをナビゲートするのにも欠かせない。唯一の不満は、-F(リテラルとして扱う)オプションがまだエスケープが必要な特別な文字を扱うみたいなんだ。どの文字かは今は覚えてないけどね。いつも更新されるのを見るのは嬉しい!

唯一の不満は、-F(リテラルとして扱う)オプションがまだエスケープが必要な特別な文字を扱うみたいなんだ。どの文字かは今は覚えてないけどね。もし具体例があれば、そのケースについて説明できるよ。でも、-F/--fixed-stringsはパターン内の正規表現機能を100%オフにして、単純なリテラルとして扱われるからね。エスケープが必要なのは、シェルがそれを要求する場合だよ。

rgは魔法のようなツールだよね。でも実際は、魔法のように感じるものの多くがそうであるように、優れたエンジニアリングと改善への dedication の結果なんだ。私たちが日常的に使っている素晴らしいハードウェアを活かしているんだよ。さらに、エージェントがコードを探索したり推論したりする能力を引き出すための鍛冶でもある。待っているだけの「lspのような」標準を時間をかけて作る必要がなくなったんだ。

ripgrepをgit grepに近づけるにはどうすればいい?普通のrg.githubのような隠しフォルダ内のファイルを無視するし、rg --hiddenだと.githubは検索するけど、.gitの中も検索しちゃうんだよね。今は、どこで見つけたか覚えてないエイリアスを使ってる:rg --hidden --glob '!*/.git/*'。もっといい方法ある?gitリポジトリの外から使える解決策がいいな。だから、git ls-filesをrgにパイプするのは無しで。

これが役立つかもね:https://news.ycombinator.com/item?id=45629497 つまり、特定の隠しファイルやディレクトリをホワイトリストに登録できるんだ。ripgrepに「gitで追跡されているファイルのセットを正確に検索する」ように指示する方法はないよ。ripgrepはgitリポジトリの状態を読み取らないから。gitignoreファイルを見て、隠しファイルやバイナリファイルを自動的に無視するだけなんだ。だから、gitのように動かしたいなら、検索したい隠しファイルをホワイトリストに登録することを考えてみて。gitと全く同じように動かすには、git ls-files -z | xargs -0 rg ...のダンスをしなきゃいけないよ。