概要
grep
して引っかかったファイルをコピーしてペーストしてvim
を開くことが多かったので、これってもしかしてめっちゃ時間を無駄にしているのでは、と思いました。
ということで専用のコマンドを書いてみました。
コマンドの実装
実行環境
zsh
派なので、.zshrc
で動作確認していますが、多分bash
でも動くと思います。
実装
~/.zshrc
function svim(){if["$1"=""]then
echo'no arguments';return;fi
vim -p`grep-lr$1$2 | perl -pe's/\n/ /g'`;}
使い方
svim {引数}
で、カレントディレクトリは以下のファイルを引数の文字列で検索し、ヒットしたファイルを全てvim
で開きます。第2引数にフォルダを指定すると、そのフォルダの中で検索します。
$ svim HOGEHOGE
または
$ svim HOGEHOGE src/components
解説
せっかくなのでちょっとした解説も書きます。
引数チェック
最初に、引数が0、つまり$1 = ""
のときはreturn
します。
grep
-lr
オプションで、ファイル名だけを羅列し、かつ配下のディレクトリを再帰的に検索します。
例
$ grep-lr hoge *
Resources/views/base.html.twig
Resources/data/page.yml
perl
次に、perl
を使って改行を全て空白に置換することで、検索結果のファイル名を横並びにします。-pe
オプションを付けることで、sed
コマンドのようにs/hoge/fuga/g
の書式を使った検索ができます。
例
$ cat sample.txt
hoge
fuga
foo
bar
$ cat sample.txt | perl -pe's/\n/ /g'
hoge fuga foo bar %
vim
最後にvim
ですが、vim
は-p
オプションを付けて開くことで、複数ファイルをタブで一度に開くことができます。
例
$ vim -p sample.txt sample2.txt
2 files to edit
僕はvim
のショートカットをいろいろ変えていて、sn
とかsp
でタブを前後移動できるため、タブで開くほうが都合が良かったのです。
余談
以上になりますが、理想を言えばgrep
した検索結果があまりにも多いとvim
がパンクしてしまうので、grep
結果の件数を見てフィルタリングしたいなと思います。