¿Es posible ejecutar un script VIM en un modo no interactivo?

8

El rastreador de errores de Gnats tiene un comando (edit-pr) que abre un ticket en $ EDITOR. Mi $ EDITOR es VIM, y cuando este comando abre el ticket en $ EDITOR, me gustaría realizar automáticamente algunas ediciones con secuencia de comandos sin tener que presionar teclas adicionales.

¿Hay alguna manera de escribir un script VIM que se pueda ejecutar de manera no interactiva como esta?

Matt Pfefferle
fuente

Respuestas:

3

Nunca he usado mosquitos, así que es difícil decir qué edit-pres exactamente lo que se espera hacer. Pero por lo que nos ha dado, puede intentar cambiar la variable EDITOR env a un script de shell personalizado, o tal vez incluso un script de Python o algo así.

EDITOR=/path/to/script.(sh|py) edit-pr <args>

Pero, como dije, no sé qué tipo de ediciones quiere, o qué hay que hacer en el editor. ¿Tal vez si nos dieras un ejemplo de lo que te gustaría automatizar?

Falmarri
fuente
El comando gnats fue solo un ejemplo. Estaba buscando una solución general y creo que su respuesta es el camino a seguir. ¡Gracias!
Matt Pfefferle 01 de
20

Aunque ya haya recibido una respuesta a su pregunta, otros pueden encontrar esto útil.

Los comandos Vim también se pueden especificar en un archivo que se ejecuta con la -sopción:

    vim -s commands.txt file

Ejemplo:

    echo 'gg=G' > indent.txt
    echo ':wq' >> indent.txt
    vim -s indent.txt file

Esto usará Vim para sangrar el contenido del archivo, guardar y salir.

S. Christoffer Eliesen
fuente
14

Los comandos de Vim se pueden especificar en la línea de comandos cuando ejecuta el programa de esta manera:

vim file.txt "+:s/foo/bar/g"

Puede seguir agregando comandos agregando "+[cmd]"argumentos. Puede terminar allí y el editor se abrirá, ejecutará esos comandos y esperará o usted, o puede agregar un "+:wq"para guardar y cerrar el archivo.

También puede escribir un script usando la sintaxis vimscript y envolverlo en una función para llamar cuando se abra el archivo o en un script separado para importar y aplicar al búfer usando la sintaxis anterior.

Caleb
fuente
5

Para ejecutar vim modo no interactivo, puede utilizar cualquiera +{command}/ -c {command}o -sparámetro que le permitirá ejecutar los comandos de vim después de que el primer archivo que se ha leído.

Verifique algunos ejemplos a continuación.

El comando puede lograr una entrada y salida estándar simple mediante tuberías:

$ echo Example | vim -es '+:wq! /dev/stdout' /dev/stdin | cat

Para editar un archivo y guardar los cambios en otro:

$ vim -es '+:0,$s/127/128/g' '+:wq! new_file' /etc/hosts
$ cat file1 file2 | vim - -es '+:0,$s/foo/test/g' '+:wq! file3'

Para editar el archivo en el lugar, puede usarlo -s {scriptin}para leer el archivo de script, por ejemplo:

$ echo ':0,$s/foo/test/ge' > cmds.txt
$ echo ':wq' >> cmds.txt
$ vim -s cmds.txt -es file

Para analizar el archivo y enviarlo a la salida de la canalización, puede intentar lo siguiente:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+%print' '+:q!' /dev/stdin | cat

o:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+:wq! /dev/stdout' /dev/stdin | cat

Ver más: ¿Cómo editar archivos de forma no interactiva (p. Ej. En canalización)? en Vim SE

kenorb
fuente
¡Muy útil! ¿Alguna idea de qué recurso respalda el localizador de Vim, por ejemplo, dónde :hise puede desplazar y mostrar -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit? No aparece en la lista de búfer, y escribir con :wescribe un archivo vacío (y la pulsación de tecla 'enter' hace que el buscapersonas se desplace o salga). Puedo usar :redir! >file | :hi | :redir END , lo que captura tanto como me desplazo. Creo que puede funcionar mecánicamente como un bidireccional more. Tengo que preguntarme por qué :helpy :hino están ambos localizados o ambos almacenados en RO ...
John P