エンジニアをリングする

プログラをミングしたり。

my web site twitter

git grepでソースコード内検索のあれこれ

FOLIOアドベントカレンダー 21日目です。
12月は読み応えのある記事が多いので、わたしからはさくっとしたTipsを。

いま作業してるリポジトリのファイル群から、目当ての文字列を1秒でも早く見つけるための話。

おすすめのコマンド

grep だと対象指定が面倒だったり、カレントディレクトリ以下を指定すると巨大なnode_modules以下のファイルも対象になってしまったりするので、git管理下のファイルのみを対象に検索できて高速な git grep がおすすめ。
git grep 検索したい文字列 だけで検索できる。

~/.bashrc~/.zshrcなどに以下のエイリアスを書いておくと、 gg hoge だけでgit管理下のファイルにあるhogeをハイライトつきでリストアップしてくれてめちゃ手軽。

alias gg='git grep'

もちろん日本語も gg ほげほげ でいける。 gg hoge src/js のようにさらにディレクトリを絞ることも。

単語検索

これめっちゃ便利なやつ。

gg -w user で、 users でもなく userData でもないただの userhoge.user だけを検索できる。
探したい文字列が関連メソッドや別の変数名に頻出しているときにもかなり絞り込めて助かる。

大文字小文字を無視して検索

gg -i hogehogeisHogeHOGE もひっかかる。

正規表現

'' で囲うと gg '\(hoge\|fuga\)' のように正規表現も使える。エスケープはがんばる。

検索した中から別のワードを除外

まれにライブラリのコードがgit管理対象になっちゃってて引っかかってくるときとかにディレクトリ名で除外したり。

gg 検索したい文字列 | grep -v 除外したい文字列

ただ結果からハイライトが消えちゃいます。 git grep だけでこれやる方法あったら知りたいなあ。

[12/21 15:30追記] 情報もらえました!

gg -e 検索したい文字列 --and --not -e 除外したい文字列 で!
--and とか使うときは -e がないとダメだったんですね。感謝 🙏


これぐらいですが、以降はわたしが普段よくやることとか。

使われ方で検索

  • 代入: gg 'hoge ='
  • 関数実行: gg 'hoge('
  • プロパティ: gg '\.hoge'
  • Viewコンポーネントgg '<Hoge

分解して検索

CSSでありがちなことなのですが。

.alert--warning みたいなスタイル定義やclass属性を消していいか調べるとき、 gg alert--warning して引っかからないから大丈夫そう〜とか思っていると

className={`alert--${data.status}`}

みたいなViewとか逆に

.alert {
  ...
  &--warinig {
    ...
  }
}

みたいなAltCSSとかがあったりして無事死亡するので、BEMとかバリエーションがあるっぽいクラス名は分割して 'alert--' とか '--warning' とかで検索してみるのがおすすめ。

というか、そういう苦労を強いられてしまうので自分が書くときはクラス名を動的に組み立てるの極力避けてます。 grepビリティ大事!