aqua経由でripgrepをインストールしているとClaude Codeのファイルパス補完が動かない
この記事ではCalude Code
のファイルパス補完が動かなかったときのメモです。
TL;DR
-
Calude Code
のファイルパス補完が動かない -
aqua
を使ってripgrep
(rg
コマンド)をインストールしていたのが原因だった -
USE_BUILTIN_RIPGREP
環境変数を設定すると動くようになる-
~/.claude/settings.json
にenv
として書くと良さそう
-
{
"permissions": {
"allow": ["Read(~/.zshrc)"],
"deny": ["Bash(curl:*)"]
},
"env": {
"USE_BUILTIN_RIPGREP": 1
}
}
環境
$ claude -v
1.0.17 (Claude Code)
$ aqua -v
aqua version 2.50.0
Claude Code
を使い始めた
Claude Maxプランを使えることになったのでClaude Code
を使い始めました。
何が要因でこの性能が出ているのか私はよくわかっていないのですが、プロンプトやルールを頑張らなくてもかなり精度がよいので今週はAI系のコーディングツールとしてはClaude Code
しか使いませんでした。
個人的に感じたのは以下です。
- 定額なので「とりあえずやらせてみる」みたいな使い方ができる
- 「こんな雑な依頼の仕方では伝わらないな…(少なくても人間には)」みたいな指示でも自力で調べて対応してくれる
- なので複数ターミナルで雑に指示を出しながら並列で作業を進めることが可能
ライブラリのバージョンアップ的な「やらなきゃいけないけど直接的な顧客価値が薄いから優先度上がらないタスク」もガシガシ潰せてよいです。
ccusage
で確認するとかなりの額になっていたので、従量課金では躊躇していたトークン量と上級モデルの使用が功を奏しているのかもしれません。
…というのは前置き(余談)なのですが、Claude Code
を使っていて1つ困っていたのがファイルパス補完が動かないことでした。
Claude Code
のファイルパス補完が動かない
Claude Code
は@
を入力するか、文字入力に続けてTAB
キーを入力するとファイル名を補完してくれる機能があります。
╭─────────────────────────────────────────────────────────────────────────╮
│ > Try "write a test for <filepath>" │
╰-────────────────────────────────────────────────────────────────────────╯
! for bash mode double tap esc to undo
/ for commands shift + tab to auto-accept edits
@ for file paths ctrl + r for verbose output
# to memorize backslash (\) + return (⏎) for newline
この機能が私の環境では動きませんでした。
同僚に聞いても「デフォルトで動いているよ」と言われるし、他に同様の現象に悩んでいたのが周りには一人だけで、よくわからないままとりあえずIDE連携なので誤魔化していました。
aqua
を使ってripgrep
(rg
コマンド)をインストールしていたのが原因だった
会社PC、私物PCで再現したので、自分の設定ファイルが問題だと思い、~.zshrc
を一部ずつコメントアウトしながら検証したところ、ripgrep
のインストール方法が原因でした。
Calude Code
はファイルパス補完にripgrep
を利用しています。
私はripgrep
をCLIツールのバージョン管理を行えるaqua
を使ってグローバルインストールして使っていました。
aqua
に定義したripgrep
をアンインストールするとファイルパス補完が正しく動くのを確認しました。
Calude Code
にUSE_BUILTIN_RIPGREP
環境変数を設定する
ドキュメントには載っておらず、以下のissueにしか言及されていないのですが、Calude Code
にはUSE_BUILTIN_RIPGREP
という環境変数が存在します。
これを有効にすると、vendoer
ディレクトリ以下にビルドインされているripgrep
を使うようになります。
$ ls ~/.claude/local/node_modules/@anthropic-ai/claude-code/vendor/ripgrep
arm64-darwin arm64-linux COPYING x64-darwin x64-linux x64-win32
環境変数名が"グローバル"すぎるのが気になるので、~/.calude/settings.json
に指定して解決しました。
{
"permissions": {
"allow": ["Read(~/.zshrc)"],
"deny": ["Bash(curl:*)"]
},
"env": {
"USE_BUILTIN_RIPGREP": 1
}
}
おわりに
やっと他のみなさんと同じようにClaude Code
でファイルパス補完もできるようになりました。
IDE連携機能を使ってCursor
からファイルパスをClaude Code
に送っていたのですが、これでClaude Code
に完結しそうです。
2025年になってからGoLand
からCursor
に移行し、Roo Code
も使っていたのですが、これならGoLand
に戻れる[1]気がしますし、ターミナルで完結するならばNeovim
まで戻っていいのでは?という気持ちになってます。
-
有償ツールなので当然と言えば当然なのかもしれませんが、JetBrainsIDEのファイル探索系のパフォーマンスはVSCode系ツールより圧倒的に高速です ↩︎
Discussion
こんにちは。 aqua の作者です。
aqua をご利用いただきありがとうございます。
など詳細が読み取れないのでなんとも言えませんが、もしかするとこちらの記事が参考になるかもしれません。
https://zenn.dev/shunsuke_suzuki/scraps/73914f56f3f860Claude Code は使ったことがないのでよくわかっていませんが、 ripgrep を AQUA_GLOBAL_CONFIG でインストールしているとしたら、
USE_BUILTIN_RIPGREP
をenv
で設定しているようにAQUA_GLOBAL_CONFIG
をenv
で設定すると解決するかもしれません。aqua大変便利に使わせていただいております。ありがとうございます!
ご助言ありがとうございます!ご推測の通り
ripgrep
コマンドをAQUA_GLOBAL_CONFIG
でインストールしていました。早速試してみたのですが、うまくいきませんでした…。
設定しなくても
AQUA_GLOBAL_CONFIG
も見えているようなのですが 😢(問題自体は記事のやり方で解決できていて、どちらもちゃんと使えているので今後もaqua使わせていただきます!!)
お返事ありがとうございます。なるほど。そうなんですね。
自分の方でも時間あるときに Claude Code 試して再現するか確認してみます。
追記: 再現しました。
原因は分かりました。
$(aqua root-dir)/bin/rg
が$(aqua root-dir)/aqua-proxy
への symbolic link なんですが、それを hard link にしてみたら解決しました。
根本解決策は検討中です。
詳細: https://zenn.dev/link/comments/6526d99cd4756f
ありがとうございます!!
同じsymbolic linkなHomebrewの
ripgrep
だと動くのでこのへんが理由なんですかね 🤔もし問題ないなら https://github.com/anthropics/claude-code にも「こういうことがあるよ」とreportだけissueとして立ち上げてもいいでしょうか。
原因がaquaであることを知っていると、作ってもらったaquaのissueを見てわかるのですが、「
Claude Code
のファイルパス補完が動かない」しか知らない状態で調べると( https://github.com/anthropics/claude-code のissueしか調べないと)全然なぜなのかわからないので 😇そうだと思います。
ありがとうございます。助かります。
ただ aqua とその仕組みを知らないと理解が難しいかもしれませんね。
通常、 aqua は以下のようにツールをインストール・実行します。
$(aqua root-dir)/pkgs
配下にインストールされ、$(aqua root-dir)/bin/rg
に symbolic link が作られる$(aqua root-dir)/bin/rg
が実行され、それが aqua-proxy への symbolic になっているので、 aqua-proxy が実行される。このとき $0 はrg
aqua exec -- $0 "$@"
を実行し、 aqua が実行される$0
のバージョンを動的に決定し、実行するあとは説明した通り。
symbolic link を解決しつつコマンドのパスを取得してから絶対パスを指定してコマンドを実行すると aqua は現状動きません ($0 が期待されたものではないので)。
「対応策の共有[1]」という意味でissueは書いておきました。調査・検討ありがとうございました!
まず
USE_BUILTIN_RIPGREP
が公式ページやclaude -h
でも出てこない隠し環境変数だったりするので… ↩︎