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