ripgrep 15.0
(github.com/BurntSushi)- ripgrep 15.0 は、バグ修正、性能改善、新機能の追加など、さまざまな更新を含むメジャーリリース
- gitignore ルールの適用に関するバグが多数修正され、大容量ファイル処理時の メモリ最適化 も行われた
- Windows aarch64 プラットフォームのサポートが追加され、powerpc64 のサポートは終了
- 新機能として、
--jsonと置換フラグの同時サポート、glob のネストした波括弧サポート などがある - 全体的な 性能改善、バグ修正、使い勝手の向上により、開発者の生産性が高まる
ripgrep 15.0 概要
ripgrep 15.0 は ripgrep の最新メジャーバージョンリリースで、主に バグ修正、軽微な 性能向上、小規模な 新機能 の追加を含む
ripgrep は、現在のディレクトリから正規表現パターンを再帰的に行単位で検索するツール
デフォルトで gitignore ルールに従い、隠しファイル/ディレクトリおよびバイナリファイルを自動的にスキップする
主な変更点
- 複数の gitignore マッチング関連のバグ を修正
- 親ディレクトリの gitignore ルール適用に関して頻繁に報告されていたバグを解消
- 非常に大きな gitignore ファイル処理時に発生していた メモリ使用量増加バグ を修正
rg -vf fileで file が空のとき、すべてにマッチするように変更-r/--replaceフラグが--jsonと一緒に正しく動作するようになった- 一部の Jujutsu(jj) リポジトリ も git リポジトリのように認識し、ripgrep で jj の gitignore に従う
- glob が ネストした波括弧 をサポート
プラットフォームサポート
- Windows 向け aarch64 のリリースバイナリを新たに提供
- powerpc64 向けリリースバイナリの提供は終了
- CI リリースワークフローの問題による中止であり、テストやサポートを希望する場合は要望可能
- ripgrep バイナリは LTO(リンク時最適化) でコンパイルされており、わずかな性能向上とサイズ削減の効果がある
性能向上
- Windows で
-z/--search-zipオプション未使用時、helper バイナリ探索を無効化 して性能を改善 - Windows で ハイパーリンク出力時のパス正規化を省略 して高速化
-A/--after-context使用時の 大きな値 の処理性能を改善
バグ修正
- 親ディレクトリの gitignore 適用漏れ など、複数の gitignore 関連問題を修正
- 空ファイルを対象にした
rg -vf fileコマンドがすべてにマッチするよう修正 .gitignoreなどで UTF-8 BOM マーカーを無視 する処理を追加- 大容量 gitignore ファイル処理時の メモリ使用を最適化
--stats使用時の 検索済みバイト数の出力エラー を修正.で終わる glob の処理エラーを修正-m/--max-countと-U/--multilineの組み合わせ使用時の マッチ数超過表示 の問題を解決-r/--replaceフラグ使用時に 行終端を保持 するよう変更-q --files-without-matchの組み合わせ使用時の 終了コード反転 バグを解決-c/--countと--files-with-matchesのドキュメント不一致を解消- 大規模な正規表現および入力時にまれに発生していた panic 問題を修正
- man page のオプションフラグ名におけるハイフンのエスケープを処理
- macOS aarch64 リリースで PCRE2 を静的コンパイル
- ホワイトリスト化された隠しファイル検索時の 親ディレクトリ無視フィルタ のバグを修正
--jsonフラグ使用時の 誤った要約統計 の問題を解決- 絶対パスおよびグローバル gitignore 検索時の gitignore 処理エラーを修正
-U/--multilineと-r/--replaceの組み合わせ使用時に発生していた panic 問題を修正
機能改善
- デフォルトのファイルタイプセットを大幅に 拡張・改善
-r/--replaceが--jsonと互換になるよう改善- fish shell の補完機能が ripgrep の 設定ファイル を反映するよう改善
--colorで使えるスタイル属性に italic を追加.jjディレクトリを git リポジトリとして扱う- マルチスレッド使用時、CLI で指定したファイル順 に検索をスケジュールする機能を追加
- Windows 向け
aarch64リリースアーティファクトを追加 - highlight カラータイプ を追加し、マッチした行の非マッチテキストもスタイリング可能に
- globs および globset crate に ネストした alternates 機能を追加
--hyperlink-formatの自動補完機能を bash、fish、zsh で改善
1件のコメント
Hacker Newsのコメント
ripgrepはここ数年で本当に大量の時間を節約してくれたツールです。新しいシステムを始めるたびに最初にインストールする必須ツールで、特に古いコードベースを探索するときには欠かせません。ひとつだけ残念なのは、
-F(リテラル扱い)オプションを使うときでも、いくつかの文字が依然としてエスケープが必要な特殊文字として扱われる場合があることです。正確にどの文字だったかは覚えていません。それでも、ripgrepが更新され続けているのを見るたびにうれしくなります-F/--fixed-stringsはパターン内の正規表現機能を100%無効にして、リテラルとしてのみ扱います。エスケープが必要だとすれば、それはおそらくシェル側で要求されているのが原因ですrgはまるで魔法のように感じられるツールです。実際には、卓越したエンジニアリングと継続的な改善、そして私たち全員が毎日使っている驚くべきハードウェア性能を最大限活用した結果です。また、lspのような標準を別途作らなくても、開発者がより速くコードを探索し理解できるようにした革新でもあります
ripgrepのコードベースは、「飲み物を用意していちばん快適な椅子に座り、高品質なソフトウェアを読みふける」最高の例です。あちこちコードの隅々をクリックしながら感嘆してしまいます
fdと同じように、rgも本当に使っていて楽しいコマンドラインツールです。こういう新しいコマンドベースのツールが好きです
rg <string>やfd <string>と入力するだけで十分です個人的に追加されてほしい機能は「拡張子」フラグです。
-gのように動作しつつ、入力引数を拡張子として扱う機能です(例:rg -e c,hのように)。globパターンを使う目的の大半は拡張子マッチングだからです-t/--typeフラグを見たことがあるか聞きたいです。例のように-tcと書けます。ripgrepに存在しない拡張子なら、自分でtypeを定義することもできますripgrepは、私がrustに興味を持ち始めた主なきっかけです。あまりにも完成度高く動くので、rustで書かれていると知ってさらに興味が湧きました。何年も経った今でも毎日
rgを使っています最近
--replaceオプションを見つけて、かなり感心しました。--typeと一緒に使いながら、以前はこんなに便利な機能があると知らなかったのが惜しいです。これからはリリースノートをきちんと読んで、新機能にもっと敏感に対応しようと思います。jjとの連携機能が改善されたのもうれしいです素晴らしいツールでありながら、とても使いやすいです。最初はLinuxで使い始めましたが、今ではWindowsでも使っています。このツールのおかげで、今ではwildcardの代わりに正規表現をそのまま検索に使うようになりました
rg --filesコマンドも便利です今週、gitが追跡しているファイルだけに対してripgrepを実行するbash関数を作りました
バイナリファイルやdotファイルが多いディレクトリでは、かなり速く検索できます。dotファイルを検索するには
-uuオプションが必要ですが、このオプションはバイナリファイルまで検索してしまいます。ファイル数が数百個になると、git ls-files自体が遅くなります-uuオプションは、ripgrepにgitignoreとhiddenファイルを無視するよう指示するもので、それでもバイナリファイルはスキップされます。バイナリファイルまで含めるには-uuuが必要です。関数の最大の問題は、Linuxカーネルのリポジトリで使うとargument list too longエラーが出ることです。なのでxargsに変えてみました このような状況で、git ls-files -z | xargs -0 rg ...が単なるrg ...より速い例があれば共有してほしいです-uuの代わりに-.フラグ(隠しファイル検索専用)を使えることを知りました。gitが追跡している隠しファイルを検索できると良いのですが、ファイル一覧を問い合わせるときのオーバーヘッドは、Rustで書いても無視できないほどですgit grepより速いのか気になります毎日の仕事でripgrepを使っています。コマンドラインでも、VSCodeで検索するときでも、いつも使っています。burntsushiに感謝します