LoginSignup
5
7

More than 3 years have passed since last update.

カレントディレクトリ配下をfzf+grep(rg)でインクリメンタルに全文検索したあとにvimで開く

Last updated at Posted at 2020-07-10

もうそういうツールが絶対あると思って探したんだけどなぜか見つからなかった。(きっとある)

grepとfzfの組み合わせだと再帰的にgrepしたあとにファイル名でフィルタリングする方法はたくさんあったんだけど、そうじゃなくてカレントディレクトリ配下の全ファイルをfzfを使ってインクリメンタルに全文検索したい。

Laravelをvendor含めて検索するとこういう感じ。

tmp.gif

コード

#!/bin/bash

grep_cmd="grep --recursive --line-number --invert-match --regexp '^\s*$' * 2>/dev/null"

if type "rg" >/dev/null 2>&1; then
    grep_cmd="rg --hidden --no-ignore --line-number --no-heading --invert-match '^\s*$' 2>/dev/null"
fi

read -r file line <<<"$(eval $grep_cmd | fzf --select-1 --exit-0 | awk -F: '{print $1, $2}')"
( [[ -z "$file" ]] || [[ -z "$line" ]] ) && exit
$EDITOR $file +$line

おまけ

一応grepでも動くと思うけど、rgの方が30%くらい早い。

# grepで全文走査
masakuni@mi-air % grep_cmd="grep --recursive --line-number --invert-match --regexp '^\s*$' * 2>/dev/null"
masakuni@mi-air % time (eval $grep_cmd | wc)
  769816 4200126 84045096
( eval $grep_cmd | wc; )  1.91s user 0.42s system 124% cpu 1.874 total

# rgで全文走査
masakuni@mi-air % grep_cmd="rg --hidden --no-ignore --line-number --no-heading --invert-match '^\s*$' 2>/dev/null"
masakuni@mi-air % time (eval $grep_cmd | wc)
  769987 4201356 84059315
( eval $grep_cmd | wc; )  1.33s user 0.79s system 339% cpu 0.624 total
5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7