Uma Lição de VIM #8: Procurar em Vários Arquivos

(Essa é a parte em que mais uma vez você vai ter que pesquisar sobre expressões regulares.)

Já vimos o comando de pesquisa, que tem um modo inteiro só pra si[1].

Mas como fazer para encontrar ocorrências de uma palavra em mais de um arquivo? Para isto, existe o comando :grep.

O grep é uma ferramente comum em Unixes (e Linux) em geral, mas o VIM tem scripts que fazem a mesma coisa em outros sistemas operacionais (por exemplo, Windows). Assim, o mesmo comando vai funcionar da mesma forma não importando qual sistema você esteja utilizando.

Como o :grep usa outras funcionalidades existentes no VIM, iremos ver um pouco mais do que simplesmente “Procurar”, mas isso é necessário.

Como o modo de pesquisa, :grep precisa de uma expressão regular. Ao contrário do modo de pesquisa, o :grep também precisa de uma lista de arquivos a serem pesquisados. Por baixo dos panos, o que o VIM faz é chamar o comando “grep” (do Unix), verifica o resultado e permite pular facilmente entre os elementos encontrados (então todas as opções disponíveis para o grep podem ser passadas diretamente de dentro do VIM).

Por exemplo, para pesquisar por arquivos que contém a palavra “void”, você só precisa executar o comando :grep void * (onde :grep é o comando, void é a expressão a ser pesquisada e * é a lista de arquivos a serem pesquisados). Como o grep (o aplicativo do Unix) somente pesquisa arquivos no diretório especificado (no nosso caso anterior, como não foi passado diretório algum, será considerado o diretório atual), o :grep (o comando do VIM) também não vai entrar em nenhum subdiretório (de novo, porque o VIM simplesmente chama o grep [aplicativo do Unix] e facilita pular entre os elementos encontrados). Para fazer uma procura que encontre a expressão além do diretório atual, basta adicionar a opção -r para o grep (grep void -r *).

Ok, agora que você sabe usar o :grep… Como é que você vê os resultados?

Primeira informação periférica: O VIM tem um tipo de “janela” especial, chamada “Quickfix”. Essa “janela” é, na verdade, um “split” da tela (e mais a frente veremos como trabalhar com “splits” e abas). Para exibir o Quickfix, é usado o comando :copen; para fechar o Quickfix, basta usar :copen de novo. Para passar para o próximo elemento existente no Quickfix, use :cnext (ou simplesmente :cn); para passar para o elemento anterior, use :cprevious (ou simplesmente :cp); para mover o cursor para a posição do elemento atual do Quickfix, use :cc (que é simplesmente :cc mesmo).

A segunda informação periférica: Como eu falei, usar :grep {expressão} * irá procurar {expressão} a partir do diretório atual. Para descobrir qual é o “diretório atual” para o VIM, use :pwd (de “print working directory”, que também é um comando Unix); para mudar para outro diretório, utilize o comando :cd {diretório}, como você faria num shell normal.

(E antes que alguém pergunte: Sim, você pode fazer um grep fora do diretório atual passando o diretório em questão no próprio comando do grep: :grep void /tmp -r irá procurar por “void” em todos os arquivos existentes no diretório /tmp.)

[1] Apenas para lembrar, / entra no modo de pesquisa, onde só é preciso entrar a expressão regular a ser encontrada; para passar para a próxima ocorrência, use n em modo normal; para passar para a ocorrência anterior, use N também em modo normal; para remover o realce das palavras encontradas, use :noh em modo de comando.

Windows shell utilities are another victory for Cygwin

C:\Symbian\UIQ3.1SDK\epoc32>find --help
FIND: Parameter format not correct

C:\Symbian\UIQ3.1SDK\epoc32>find -h
FIND: Parameter format not correct

C:\Symbian\UIQ3.1SDK\epoc32>find /h
FIND: Invalid switch

C:\Symbian\UIQ3.1SDK\epoc32>find
FIND: Parameter format not correct

C:\Symbian\UIQ3.1SDK\epoc32>find /?
Searches for a text string in a file or files.

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

/V Displays all lines NOT containing the specified string.
/C Displays only the count of lines containing the string.
/N Displays line numbers with the displayed lines.
/I Ignores the case of characters when searching for the string.
/OFF[LINE] Do not skip files with offline attribute set.
"string" Specifies the text string to find.
[drive:][path]filename
Specifies a file or files to search.

If a path is not specified, FIND searches the text typed at the prompt
or piped from another command.

C:\Symbian\UIQ3.1SDK\epoc32>grep
'grep' is not recognized as an internal or external command,
operable program or batch file.

And that’s why I’m installing Cygwin on my computer now…