grep出力で自動完成

grep出力で自動完成

grep見つかったファイル名をパラメータとして使いやすくするにはどうすればよいですかvim

$ grep -r foo *
lib/beatles/john.c
lib/pantera/phil.c
lib/pinkfloyd/roger.c
lib/pinkfloyd/richard.c
lib/whitestripes/elephant/jack.c

$ vim lib/pinkfloyd/roger.c

Bashオートコンプリートを使用するには、次のように入力する必要があります。疲労\t\t\t\t\t 他の多くのファイルが一致するためです。「発見された3番目のファイルを教えてください」と言う簡単な方法はありますか?たぶん、次のようなものがあります。

$ vim $3        // Third line
$ vim 'roger'   // Only line with string 'roger'
$ vim TabTabTab // Each Tab completes a different filename from grep

私はTmuxを使用しており、ファイル名を選択して貼り付けることができることを知っています。しかし、VIMユーザーとしても、これはまだ少し不満です。もっと良い方法があるでしょう!

私が解決策を見つけるのではないことに注意してください。スクリプト grep 出力、代わりにVIMを使用してファイルをgrepし、開くときに手動で使用することです。

編集する:私はいつも「roger」をターゲットにしたり、常に3番目のアイテムをターゲットにしたソリューションではなく、一般的なソリューションを探しています。

ベストアンサー1

私はパターンを再帰的に見つけるスクリプトを書いて、vimがその行でファイルを開くことができるように一致するものの1つを選ぶことができました。私はそれをvgrep(vim grep、awkそこでも使用されますが)と呼びます。コードは次のとおりです。

#!/bin/bash
my_grep() {
        grep -Rn -I --color=auto --exclude-dir={.svn,.git} --exclude={tags,cscope.out} "$@" . 2>/dev/null
}
my_grep_color() {
        grep -Rn -I --color=always --exclude-dir={.svn,.git} --exclude={tags,cscope.out} "$@" . 2>/dev/null
}

awk '{
    print NR, $0
}' <(my_grep_color "$@")

awk '{
    lines[NR]=$1;
}

END{
    printf "Enter index: "
    getline num < "-";
    split(lines[num], s, ":")
    system("vim "s[1]" +"s[2])
}' <(my_grep "$@")

一致を強調表示するために2回呼び出しましたgrep。一度だけ呼び出すように変更できますが、強調表示は失われます。

使用法:

「Foo」という単語を含む行でvimを開きたい場合は、次のように使用できます。vgrep Foo

foob​​arのようなファイルがある場合:

a b c
Bar
e f Foo g
h i

vgrep以下を出力します。

1 ./foobar:3 e f Foo g
Enter index: 

したがって1、+を入力すると、enter3行目のファイルが開きます。見つかった各一致のインデックス行を出力します。

私はこのスクリプトが改善されると確信していますが、私が使用するのにうまくいきます。


また、以下を使用することを検討してください。商標そして範囲C/C++.

おすすめ記事