はじめに

この資料は Rust 製のコマンドラインツール ripgrep-all について紹介するものです。

Rustの環境構築やツールのインストール方法については以下を参照してください

Rust開発環境を整える

ripgrep-all について

ripgrep-allはzip, tar.gz, pdf, sqlite3などもripgrepで検索できるツールです。コマンドは rga となります。

GitHub - phiresky/ripgrep-all: rga: ripgrep, but also search in PDFs, E-Books, Office documents, zip, tar.gz, etc.

rga は指定したディレクトリ以下を再起的に探索してサポートしているファイルタイプに対して rg を実行した結果を表示してくれます。

これには pandoc などのツールを使用するため、追加でインストールする必要があります。

% sudo apt install pandoc poppler-utils ffmpeg

使用方法

例えば、次のようなディレクトリ demo があるとします。(実際のディレクトリはリポジトリを参照)

demo
├── greeting.mkv
├── hello.odt
├── hello.sqlite3
└── somearchive.zip
    ├── dir
    │   ├── greeting.docx
    │   └── inner.tar.gz
    │       └── greeting.pdf
    └── greeting.epub

rga_demo.png

制約

macOSでは内部で呼び出すpandoc でワーニングが出力されます。この問題は Issue に上がっていますが、pandoc側の問題であるためかまだ解決されていません。

fzf との連携

https://github.com/phiresky/ripgrep-all/raw/master/doc/rga-fzf.gif

rgaはfzfを介して対話的に使用することができます。以下を ~/.{bash,zsh}rc に追加してください。

rga-fzf() {
	RG_PREFIX="rga --files-with-matches"
	local file
	file="$(
		FZF_DEFAULT_COMMAND="$RG_PREFIX '$1'" \\
			fzf --sort --preview="[[ ! -z {} ]] && rga --pretty --context 5 {q} {}" \\
				--phony -q "$1" \\
				--bind "change:reload:$RG_PREFIX {q}" \\
				--preview-window="70%:wrap"
	)" &&
	echo "opening $file" &&
	xdg-open "$file"
}