Existem várias maneiras de fazer isso.
Diretório atual interno
Se você deseja executar a pesquisa / substituição em uma árvore de projeto, pode usar a lista de argumentos do Vim .
Simplesmente abra o Vim e use o :args
comando para preencher a lista de argumentos. Você pode passar vários nomes de arquivos ou até globs.
Por exemplo, :args **/*.rb
procurará recursivamente no diretório atual por arquivos ruby. Observe que isso também é como abrir o Vim com vim **/*.rb
. Você pode até usar o find
comando do shell para obter uma lista de todos os arquivos no diretório atual executando:
:args `find . -type f`
Você pode visualizar a lista de argumentos atual executando :args
por si só. Se você deseja adicionar ou excluir arquivos da lista, pode usar :argadd
os :argdelete
comandos ou, respectivamente.
Quando estiver satisfeito com a lista, agora você poderá usar o poderoso :argdo
comando do Vim, que executa um comando para todos os arquivos da lista de argumentos::argdo %s/search/replace/g
Aqui estão algumas dicas para pesquisar (com base em alguns dos comentários):
- Use um limite de palavras se quiser pesquisar "foo", mas não "foo_bar". Use as construções
\<
e \>
ao redor do padrão de pesquisa da seguinte maneira::argdo %s/\<search\>/foobar/g
- Use um
/c
sinalizador de pesquisa se desejar que o Vim peça confirmação antes de substituir um termo de pesquisa.
- Use um
/e
sinalizador de pesquisa se desejar ignorar os erros "padrão não encontrado".
- Você também pode optar por salvar o arquivo depois de executar a pesquisa:
:argdo %s/search/replace/g | update
. Aqui, :update
é usado porque ele só salvará o arquivo se ele tiver sido alterado.
Buffers abertos
Se você já possui buffers abertos, deseja fazer a pesquisa / substituição, pode usar :bufdo
, o que executa um comando para cada arquivo em sua lista de buffers ( :ls
).
O comando é muito semelhante a :argdo
: :bufdo %s/search/replace/g
Similar ao :argdo
e :bufdo
, há :windo
e :tabdo
que atuam em janelas e abas, respectivamente. Eles são usados com menos frequência, mas ainda são úteis para saber.
/c
bandeira para confirmar substituições.\<
e\>
ao redor dosearch
para evitar substituições parciais de palavras.:cd %:p:h
. Outras opções de diretório de trabalho estão listadas em vim.wikia.com/wiki/Set_working_directory_to_the_current_file .Digamos que temos uma estrutura de projeto simples como esta:
greeting.txt parece
e info / age.txt parece
Digamos que queremos substituir todas as ocorrências de Sam por Bob. Aqui está o que faríamos:
Definir diretório de trabalho
Verifique se o diretório de trabalho atual do Vim é a raiz do projeto (não mostrará como fazer isso aqui).
Encontre arquivos que contenham 'Sam'
Use o comando vimgrep do Vim para procurar todas as ocorrências de Sam no projeto (nota: as
**/*
pesquisas em todos os arquivos recursivamente)Isso preencherá a lista de correções rápidas com todas as instâncias do Sam. Se você deseja visualizar a lista de correções rápidas, pode usar o comando Vim
:copen
Substitua em todos os arquivos que contêm 'Sam'
Agora, queremos executar o comando substituto do Vim dentro de cada arquivo na lista de correções rápidas. Podemos fazer isso usando o
:cfdo {cmd}
comando que executa {cmd} em cada arquivo na lista de correções rápidas. O {cmd} específico que queremos usar ésubstitute
ous
abreviado. A linha completa seria semelhante a:Você pode adicionar o sinalizador c para confirmar todas as substituições, se desejar:
Salve todos os arquivos
fonte
cfdo %s/Sam/Bob/g | update
fixo que para mimhidden
opção:set hidden
se você ainda não o fez.Embora não seja uma solução VIM, se você estiver usando VI / VIM, poderá achar mais fácil usar uma solução CLI. Para alterar todos os arquivos no diretório atual, use
perl
como foi criado para situações como esta:Se você precisar fazer isso também em subdiretórios, costumo emparelhar
perl
comfind
:O bom disso é que você pode refinar facilmente a lista para tipos de arquivos específicos. Por exemplo, para restringir a arquivos python:
fonte
Para substituir a frase por outra, você pode usar o modo Vim Ex.
Por exemplo (
ex
é alias paravim -E
):Recursivamente em bash / zsh (com
globstar
conjunto, por exemploshopt -s globstar
):Recursivamente (usando
find
e ignorando arquivos ocultos, como.git
arquivos):Nota: O
:bufdo
comando não é POSIX .Nota: A sintaxe
-not -path '*/\.*'
é usada para ignorar arquivos ocultos (como.git
).fonte
Aqui está o comando shell usando
find
eex
editor (sem usar:bufdo
):Isso editará todos os
*.rb
arquivos na pasta atual (recursivamente) e será substituídofoo
porbar
.fonte