¿Cómo abrir varios archivos que coinciden con una expresión comodín?

10

Quiero editar varios archivos que coinciden con una expresión global. Por ejemplo, para editar todos los archivos de configuración de git en directorios secundarios, puedo hacer esto en el shell:

vim */.git/config

En la :línea de comando de Vim , esperaba :find */.git/confighacer algo similar (es decir, abrir todos los archivos que coinciden con la expresión global), pero en cambio se queja E77: Too many file names.

¿Hay un comando Vim o una línea para abrir varios archivos que coinciden con una expresión comodín / glob (que no implica escribir una función)?

Justin M. Keyes
fuente

Respuestas:

8

Puedes usar :args {glob}. En su glob, **atravesará directorios recursivamente.

Esto completará la lista de argumentos, que es la misma lista que se completa cuando inicia Vim con uno o más nombres de archivo como argumentos.

Una vez que haya completado su lista de argumentos, puede navegar a través de ella usando :nexty :previous. También puede saltar al primer y último elemento con los comandos :firsty :last.

tommcdo
fuente
1
Agradable :) :args */.git/configtambién llena la lista de búfer, por lo que :bnexttambién funciona. ¿Te parece extraño? (Vim 7.4.52 y Neovim)
Justin M. Keyes
1
También un recordatorio para los demás, alterna]a la :argslista si está instalado github.com/tpope/vim-unimpaired .
Justin M. Keyes
También se :argadd file*puede hacer.
kenorb
Para usar patrones glob ( **), debe haber globstarconfigurado, vea: Haga coincidir todos los archivos en todos los directorios anidados con el globing de shell .
kenorb
@ JustinM.Keyes La lista de búfer es un superconjunto de la lista de argumentos, por lo que es de esperar.
jamessan
3

Para abrir archivos coincidentes en pestañas separadas ...

:n */.git/config | tab all

Explicación: :n ( :next) establece la lista del siguiente archivo en todas las coincidencias. tab allabre todos los archivos en la lista del siguiente archivo en pestañas nuevas.

... o ...

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

Explicación: En glob(…), el 0 significa incluir todos los archivos coincidentes, incluso si de otro modo se ignorarían debido a la configuración suffixeso wildignorecase. El 1 significa devolver una lista, en lugar de una cadena. exe "tabe" fes una forma abreviada de execute "tabedit" fy significa abrir el archivo especificado por la variable fen una nueva pestaña.

Alex Quinn
fuente
1
Parece que :n */.git/config | bufferfunciona.
Mateen Ulhaq
2

En la línea de comando Vim: esperaba :find */.git/confighacer algo similar (es decir, abrir todos los archivos que coinciden con la expresión global), pero en cambio se queja E77: Too many file names.

No esperes nada antes de leer la documentación.

Además de la respuesta de Tom, puede usar directamente :nextcomo alternativa a :args.

romainl
fuente
0

Abrir archivos vim */.git/configdefinitivamente debería funcionar. Si no es así, debe actualizar su Vim a 7.4 (la versión anterior tenía más errores).

Alternativamente, pruebe uno de los siguientes (dentro del editor):

:n `find .git/ -name config`
:args `find . -name config`
kenorb
fuente
No leíste mi pregunta con cuidado. Y, la respuesta aceptada ya menciona :args.
Justin M. Keyes
@ JustinM.Keyes Gracias por sus puntos. El comodín debería funcionar de manera predeterminada y esta es la única respuesta que dice que debería funcionar en 7.4 (ya que tuve exactamente el mismo error antes de la actualización). El uso argses solo la solución, pero además le muestra cómo usar la expansión de shell dentro de vim it-self en caso de que otros usuarios quieran usarlo para soluciones más complejas, mediante el uso find, como este . Así que creo que le da un valor adicional a su pregunta. Así que espero que esté bien contigo.
kenorb
Nunca tuve un problema con vim */foo, y no hay forma de que pueda estar relacionado con la versión de Vim, porque esa es una función de shell .
Justin M. Keyes
0

Obvio, pero no mencionado anteriormente: por ejemplo, busque todos los archivos sql que tengan la cadena create_table en su nombre

:args **/*create_table*sql

y verifícalos

:ls

y abra el primero

:b 1
Yordan Georgiev
fuente