🫥

git をアップデートすると dumb-jump が壊れてしまう

2023/10/23に公開

問題

私は Emacs で dumb-jump というコードジャンプツールを利用しています。ところが、あるときから何を検索してもヒットしないようになってしまいました。メッセージログを見ても下記のように出力されているだけでエラーは発生していません。

No definitions found for: *

解決策

dumb-jump はデフォルトで git grep を使用するのですが git grep 2.39 以上にすると動作しなくなるようです。rip-grep をインストールして、下記の設定を書き込むのが最も簡単な解決策でした。

(setq dumb-jump-force-searcher 'rg)

調査メモ

dumb-jump のドキュメントを見ると debugging a jump というセクションがありました。これによると変数 dumb-jump-debug を t にセットするとデバッグメッセージを出力できるようです。実際に操作してみます。 /Users/project/ で ほげ に対してコードジャンプしてみました。

git grep --color=never --line-number --untracked -E \^\\s\*\(\(\\w\+\[.\]\)\*\\w\+\,\\s\*\)\*ほげ\(\,\\s\*\(\\w\+\[.\]\)\*\\w\+\)\*\\s\*\=\(\[\^\=\>\~\]\|\$\)\|\(\^\|\[\^\\w.\]\)\(\(private\|public\|protected\)\\s\+\)\?def\\s\+\(\\w\+\(\:\:\|\[.\]\)\)\*ほげ\(\$\|\[\^\\w\|\:\]\)\|\(\^\|\\W\)define\(_singleton\|_instance\)\?_method\(\\s\|\[\(\]\)\\s\*\:ほげ\(\$\|\[\^\\w\|\:\]\)\|\(\^\|\[\^\\w.\]\)class\\s\+\(\\w\*\:\:\)\*ほげ\(\$\|\[\^\\w\|\:\]\)\|\(\^\|\[\^\\w.\]\)module\\s\+\(\\w\*\:\:\)\*ほげ\(\$\|\[\^\\w\|\:\]\)\|\(\^\|\\W\)alias\(_method\)\?\\W\+ほげ\(\\W\|\$\) -- /Users/project/\*.rb /Users/project/\*.erb /Users/project/\*.haml /Users/project/\*.rake /Users/project/\*.slim

非常に長いコマンドが実行されました。

ここで私は、つい先日、新機能を試すために git コマンドをアップデートしたことを思い出しました。変更前は mac にビルドインされた git 2.23.0 を使っていました。しかしアップデート後は git 2.42.0 です。それぞれのバージョンの git grep で検索してみたところ、変更前はヒットしていたのに、変更後はヒットしなくなりました。 git grep に互換性を失う変更が入ったことがわかります。

調べてみると dumb-jump の issue に、詳しく調査してくれているコメントがありました。

https://github.com/jacktasia/dumb-jump/issues/428#issuecomment-1483050890

これによると git grep はかつて GNU grep と同じ振る舞いをしていたが、アップデートの際に独自の実装に移り変わったため \b のようなマッチができなくなっており、それによって正常動作しなくなったのではないかとのことでした。

余談ですが、この投稿者 @wrightgardner さんはこの問題にかなり踏み込んでいて git コミュニティまで質問しています。とても私にはできないことなので、すごいことだなと思いました。

Discussion