Como abrir vários arquivos que correspondem a uma expressão curinga?

10

Quero editar vários arquivos correspondentes a uma expressão glob. Por exemplo, para editar todos os arquivos de configuração do git nos diretórios filhos, eu posso fazer isso no shell:

vim */.git/config

Na :linha de comando do Vim , eu esperava :find */.git/configfazer algo semelhante (ou seja, abrir todos os arquivos correspondentes à expressão glob), mas, em vez disso, reclama E77: Too many file names.

Existe o comando Vim ou uma linha para abrir vários arquivos correspondentes a uma expressão curinga / glob (que não envolve a gravação de uma função)?

Justin M. Keyes
fonte

Respostas:

8

Você pode usar :args {glob}. No seu globo, **irá percorrer diretórios recursivamente.

Isso preencherá a lista de argumentos, que é a mesma lista que é preenchida quando você inicia o Vim com um ou mais nomes de arquivos como argumentos.

Depois que sua lista de argumentos for preenchida, você poderá navegar por ela usando :nexte :previous. Você também pode pular para o primeiro e o último item com os comandos :firste :last.

tommcdo
fonte
11
Nice :) também :args */.git/configpreenche a lista de buffers, assim :bnexttambém funciona. Isso parece estranho? (Vim 7.4.52 e Neovim)
Justin M. Keyes
11
Também um lembrete para outras pessoas, ]aalterna a :argslista se o github.com/tpope/vim-unimpaired estiver instalado.
Justin M. Keyes
Também :argadd file*pode fazer.
kenorb
Para usar glob patterns ( **), você precisa ter globstardefinido, consulte: Combine todos os arquivos em todos os diretórios aninhados com o shell globbing .
kenorb
@ JustinM.Keyes A lista de buffers é um superconjunto da lista args, então isso é esperado.
jamessan
3

Para abrir arquivos correspondentes em guias separadas…

:n */.git/config | tab all

Explicação: :n ( :next) define a lista do próximo arquivo para todas as correspondências. tab allabre todos os arquivos na lista do próximo arquivo em novas guias.

... ou ...

for f in glob("*.py", 0, 1) | exe "tabe" f | endfor

Explicação: Em glob(…), 0 significa incluir todos os arquivos correspondentes, mesmo se eles fossem ignorados devido às configurações suffixesou wildignorecase. O 1 significa retornar uma lista, em vez de uma string. exe "tabe" fé uma forma abreviada de execute "tabedit" fe significa abrir o arquivo especificado pela variável fem uma nova guia.

Alex Quinn
fonte
11
Parece :n */.git/config | bufferobras.
Mateen Ulhaq
2

Na linha de comando Vim:, eu esperava :find */.git/configfazer algo semelhante (ou seja, abrir todos os arquivos correspondentes à expressão glob), mas, em vez disso, reclama E77: Too many file names.

Não espere nada antes de ler a documentação.

Além da resposta de Tom, você pode usar diretamente :nextcomo alternativa :args.

romainl
fonte
0

Abrir arquivos vim */.git/configdefinitivamente deve funcionar. Caso contrário, você deve atualizar o seu Vim para 7.4 (a versão anterior era mais com erros).

Como alternativa, tente um dos seguintes (no editor):

:n `find .git/ -name config`
:args `find . -name config`
kenorb
fonte
Você não leu minha pergunta com cuidado. E, a resposta aceita já menciona :args.
Justin M. Keyes
@ JustinM.Keyes Obrigado por seus pontos. O caractere curinga deve funcionar por padrão e esta é a única resposta que diz que deve funcionar na versão 7.4 (pois eu tinha exatamente o mesmo erro antes da atualização). Usar argsé apenas a solução alternativa, mas mostra ainda mais como usar a expansão do shell no vim-se, caso outros usuários desejem usá-lo para soluções mais complexas, usando find, como este . Então, acho que isso dá algum valor adicional à sua pergunta. Então, espero que esteja tudo bem com você.
kenorb
Eu nunca tive um problema com vim */foo, e não há nenhuma maneira que possa estar relacionada à versão Vim, porque esse é um recurso do shell .
Justin M. Keyes
0

Óbvio, mas não listado acima - exemplo encontre todos os arquivos sql com a cadeia create_table em seu nome

:args **/*create_table*sql

e verifique

:ls

e abra o primeiro

:b 1
Yordan Georgiev
fonte