tutorial salir comandos borrar shell vim command-prompt

shell - comandos - salir de vi linux



Cómo ejecutar una serie de comandos vim desde el símbolo del sistema (5)

Tengo cuatro archivos de texto A.txt, B.txt, C.txt y D.txt. Tengo que realizar una serie de edición vim en todos estos archivos. Actualmente, lo que estoy haciendo es abrir cada archivo y hacer los mismos comandos vim uno por uno.

¿Es posible crear un archivo de secuencia de comandos que pueda ejecutarse desde el símbolo del sistema, sin abrir el archivo real para la edición vim?

por ejemplo, si tengo que ejecutar los siguientes comandos vim después de abrir el archivo A.txt en el editor vim:

:g/^/s*$/d :%s/^/[/ :%s//(.*/)/(/s/+/)/(.*/)//3/2/1 :%s/$/]/ :%s/design/test/

¿Es posible crear un archivo de script y colocar todos estos comandos, incluido gvim A.txt (primer comando en el archivo)? y editar ejecutar el archivo de script desde el símbolo del sistema.

Si es posible, hágamelo saber cómo hacerlo, también hágame saber cómo se puede hacer con un solo archivo a la vez y varios archivos a la vez.


Con todos los comandos que desea ejecutar en cada archivo guardado en un script, diga "script.vim", puede ejecutar ese script en un archivo como este (como han mencionado otros):

vim -c "source script.vim" A.txt

Avanzando un paso más, puede guardar su archivo al final de la secuencia de comandos, ya sea poniendo un comando :w dentro de la secuencia de comandos, o pasándolo desde la línea de comandos:

vim -c "source script.vim | w" A.txt

Ahora, puede ejecutar cualquier comando en Vim en varios archivos, usando el comando argdo . Entonces tu orden se convierte en:

vim -c "argdo source script.vim | w" A.txt B.txt C.txt D.txt

Finalmente, si desea salir de Vim después de ejecutar su script en cada archivo, simplemente agregue otro comando para salir:

vim -c "argdo source script.vim | w" -c "qa" A.txt B.txt C.txt D.txt


JimR e Ingo han proporcionado excelentes respuestas para su caso de uso.

Sin embargo, solo para agregar una forma más de hacerlo, puede usar mi complemento vimrunner para escribir la interacción en ruby: https://github.com/AndrewRadev/vimrunner .

Ejemplo:

vim = Vimrunner.start vim.edit "file.txt" vim.insert "Hello" vim.write vim.kill

Esto puede ser útil para interacciones más complicadas, ya que obtiene toda la potencia de un lenguaje de programación.


La cantidad de comandos -c pasados ​​directamente a Vim en la línea de comandos está limitada a 10, y esto no es muy legible. Alternativamente, puede poner los comandos en un script separado y pasarlo a Vim. Así es cómo:

Modo por lotes silencioso

Para un procesamiento de texto muy simple (es decir, usar Vim como un ''sed'' o ''awk'' mejorado, tal vez solo beneficiándose de las expresiones regulares mejoradas en un comando de :substitute ), use el modo Ex .

REM Windows call vim -N -u NONE -n -es -S "commands.ex" "filespec"

Nota: el modo por lotes silencioso ( :help -s-ex ) confunde la consola de Windows, por lo que es posible que tenga que hacer un cls para limpiar después de la ejecución de Vim.

# Unix vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"

Atención: Vim se bloqueará esperando la entrada si el archivo "commands.ex" no existe; ¡Mejor comprobar de antemano por su existencia! Alternativamente, Vim puede leer los comandos desde stdin. También puede llenar un nuevo búfer con texto leído desde stdin, y leer comandos desde stderr si usa el argumento - .

Automatización completa

Para un procesamiento más avanzado que involucre múltiples ventanas y la automatización real de Vim (donde puede interactuar con el usuario o dejar que Vim se ejecute para permitir que el usuario asuma el control), use:

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"

Aquí hay un resumen de los argumentos utilizados:

-T dumb Avoids errors in case the terminal detection goes wrong. -N -u NONE Do not load vimrc and plugins, alternatively: --noplugin Do not load plugins. -n No swapfile. -es Ex mode + silent batch mode -s-ex Attention: Must be given in that order! -S ... Source script. -c ''set nomore'' Suppress the more-prompt when the screen is filled with messages or output to avoid blocking.


Pruebe la siguiente sintaxis:

ex foo.txt <<-EOF g/^/s*$/d %s/^/[/ %s//(.*/)/(/s/+/)/(.*/)//3/2/1 %s/$/]/ %s/design/test/ wq " Update changes and quit. EOF

El comando ex es equivalente a vim -E . Agregue -V1 para una salida detallada.

La sintaxis alternativa de una línea es, por ejemplo:

ex +"g/^/s*$/d" +"%s/^/[/" +"%s/design/test/" -cwq foo.txt

Para cargar comandos desde el archivo, use -s cmds.vim .

También puede usar shebang para que Vim analice el archivo del argumento .

Para más ejemplos, ver:


vim -c <command> Execute <command> after loading the first file

Hace lo que describe, pero tendrá que hacerlo un archivo a la vez.

Entonces, en una cáscara de Windows ...

for %a in (A,B,C,D) do vim -c ":g/^/s*$/d" -c "<another command>" %a.txt

Las carcasas POSIX son similares, pero no tengo una máquina delante de mí en este momento.

Imagino que podría cargar todos los archivos a la vez y hacerlo, pero requeriría repetir los comandos en la línea de comandos vim para cada archivo, similar a

vim -c "<command>" -c "<command>" -c ":n" (repeat the previous -c commands for each file.) <filenames go here>

EDITAR: 08 de junio de 2014: Sólo un FYI, descubrí esto hace unos minutos.

vim tiene el comando bufdo para hacer cosas a cada búfer (archivo) cargado en el editor. Mira los documentos para el comando bufdo. En vim :help bufdo