Ejecutar comando para varios archivos

Sep 17 2020

A menudo me encuentro en la situación en la que quiero ejecutar varios vimcomandos en varios archivos.

Considere file1.txt, file2.txt, file3.txt que necesitaría ejecutar :retaby luego algunos, :%s/ /, /por ejemplo.

¿Cómo puedo pipesuperar esto vim?

Respuestas

4 Quasímodo Sep 17 2020 at 23:17

Primero, está ejecutando Vim, no Vi, porque este último no ofrece el retabcomando.

Suponiendo que el archivo debe modificarse (eso es lo que se xhace a continuación), puede canalizar los comandos al modo mejorado Ex de esta manera:

printf '%s\n' 'retab' '%s/ /, /' 'x' | vim -E file1.txt

Ahora, tenga en cuenta que su ex saltará .vimrc, por lo que retabno va a tomar tabstopy expandtablos valores de ese archivo. Por supuesto, puede proporcionarlos manualmente, por ejemplo,

printf '%s\n' 'set expandtab' 'retab' '%s/ /, /' 'x' | vim -E file1.txt

Para operar en varios archivos (coincidentes file[digit].txt), simplemente envuélvalo en un bucle de shell,

for file in file[0-9].txt; do
    printf '%s\n' 'set expandtab' 'retab' '%s/ /, /' 'x' | vim -E "$file"
done
2 filbranden Sep 18 2020 at 00:21

Puede usar el -cargumento en la línea de comandos para ejecutar comandos en Vim después de abrir un archivo. Puede pasarlo varias veces para ejecutar varios comandos separados. Una vez que ejecute los comandos de edición, probablemente querrá incluir un :wqpara que Vim guarde sus cambios y salga.

$ vim -c 'retab' -c '%s/ /, /' -c 'wq' file1.txt

Por supuesto, puede usar eso dentro de un forbucle para ejecutarlo en cada uno de sus archivos de texto.

Otra opción es abrir todos los archivos en Vim y luego usar :argdopara ejecutar una secuencia de comandos en todos los archivos en la lista de argumentos. En ese caso, debe unir todos sus comandos usando |(que es el separador de comandos en Vim) y debe terminar cada uno :argdocon un :updatepara que guarde el archivo (si es necesario) antes de pasar al siguiente. Esto es importante, de lo contrario, Vim podría negarse a alejarse del búfer actual, lo que interrumpiría su :argdoejecución.

$ vim file*.txt

Luego, dentro de Vim:

:argdo retab | %s/ /, / | update

Todos sus archivos se habrán actualizado y estará en el último archivo de su lista de argumentos. En este punto, simplemente puede salir de Vim con :q.

WW00WW Sep 20 2020 at 09:56

Con el siguiente código, abra todos los archivos en vim y luego ejecute :Bufdo retab

function! Bufdo(command)
  let curbuf=bufnr("%")
  execute 'bufdo ' . a:command
  execute 'buffer ' . curbuf
endfunction
command! -nargs=+ -complete=command Bufdo call Bufdo(<q-args>)