¿Cómo puedo ejecutar una función o macro en una carpeta de archivos?


12

Digamos que tengo una función, llamada StripWhitespace.

Puedo ejecutarlo en un solo archivo abriendo el archivo y ejecutándolo :StripWhitespace.

¿Cómo puedo ejecutar automáticamente esa función en una carpeta de archivos y guardar los resultados a medida que avanzo?


3
Detalles, por favor!
200_success

Respuestas:


10

Puede usar el -cargumento para ejecutar un comando al inicio, desde vim(1):

   -c {command}
               {command} will be executed after the first  file  has  been
               read.   {command}  is interpreted as an Ex command.  If the
               {command} contains spaces it must  be  enclosed  in  double
               quotes  (this depends on the shell that is used).  Example:
               Vim "+set si" main.c
               Note: You can use up to 10 "+" or "-c" commands.

Ejemplo:

vim -c ':call StripWhitespace()' file1 file2

Para salir después, agregue | :wqa:

vim -c ':call StripWhitespace() | :wqa' file1 file2

1
Desea un: argdo, si ejecuta esto para un par de archivos en la línea de comandos
Christian Brabandt

19

Si ya está en Vim, puede usar los comandos :argdoo :bufdopara ejecutar un comando en cada elemento de la lista de argumentos o la lista de búfer, respectivamente.

Por ejemplo, para ejecutar un :comando en cada archivo en la lista de argumentos:

:argdo StripWhitespace

O para invocar una función de cada archivo en la lista de búfer:

:bufdo call StripWhitespace()

O para ejecutar macro qen cada archivo en la lista de argumentos:

:argdo normal @q

A continuación, puede guardar todos los búferes modificados con :wall, o guardar todos y salir de Vim con :wqall.

Si desea escribir los archivos a medida que avanza, puede agregar una llamada a :update:

:argdo s/foo/bar/ge | update

En primer lugar, hay varias formas de obtener los archivos en Vim, que incluyen:

  • Proporcione parámetros a la línea de comando vim: vim *(esto agrega todos los archivos a la lista de argumentos),
  • Use el :argscomando (que admite comodines y expresiones de retroceso) para completar la lista de argumentos o el :argaddcomando para agregarle archivos,
  • Sólo tiene que abrir a todos ellos de forma manual con :e, :Exo un plugin para abrir ficheros.

1
Me gusta esta respuesta porque no requiere abandonar Vim, que en mi opinión es demasiado costoso (¡mi preciosa lista de búfer!). Tengo algunas notas: (1) dejar buffers sin escribir requiere 'hidden'ser configurado; (2) el : updateorden es una ligera mejora respecto :w, ya que sólo escribe si se ha realizado un cambio, por lo que :bufdo updateo :argdo updateescribirá todos los tampones o argumentos modificados.
tommcdo

Buen punto adelante update. Pensé en mencionar hiddencuando estaba escribiendo la respuesta, pero decidí no hacerlo porque no quería complicarla demasiado. Sin embargo, en la reflexión, debería estar allí. Actualizaré la respuesta para incluir ambas sugerencias actualmente.
Rico

@tommcdo Acabo de comprobar la documentación de: wall, y solo escribe buffers modificados, por lo que: la actualización de bufdo no es necesaria después de todo.
Rico

Una buena captura con respecto :wall, que también tiene la ventaja de no recorrer los buffers y alejarte de donde empezaste. Supongo :argdo updateque todavía es una historia diferente, tal vez no quieras escribir en buffers que no están en tu lista de argumentos.
tommcdo

@tommcdo Buen punto.
Rico
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.