Eu fiz um script para aplicar recursivamente a um padrão, e então eu posso selecionar uma das correspondências para que o vim abra o arquivo naquela linha. Chamo de vgrep
(vim grep, embora também use awk
). O seguinte é o seu código:
#!/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 "$@")
Estou chamando grep
duas vezes apenas para destacar minhas correspondências. Você pode alterá-lo para que seja chamado apenas uma vez, mas perderá o destaque.
Uso:
Suponha que você queira abrir o vim na linha onde há uma palavra "Foo", você pode usá-lo assim: vgrep Foo
Se houver um arquivo foobar como:
a b c
Bar
e f Foo g
h i
vgrep
produzirá isso:
1 ./foobar:3 e f Foo g
Enter index:
Assim, você pode digitar 1
+ enter
e ele abrirá esse arquivo na terceira linha. Ele produzirá uma linha indexada para cada correspondência que encontrar.
Tenho certeza de que esse script pode ser melhorado, mas, para meus usos, ele funciona muito bem.
Além disso, considere o uso de ctags e cscope se você está trabalhando com C/C++
.