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)?

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.


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.


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.


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`

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.