¿Cómo ejecutar el comando Vim desde el shell?

12

Esta podría ser una pregunta tonta, pero tengan paciencia conmigo.

Estoy automatizando algunas de las cosas habituales que hago cuando configuro un nuevo entorno de trabajo, y me gustaría automatizar el comando Vim :BundleInstall(para instalar todos mis complementos Vim).

¿Es posible ejecutar esto desde el shell?

Alternativamente, ¿es posible hacer que el script ejecute Vim, ejecute :BundleInstall, espere hasta que termine y salga?

Gracias.

imiric
fuente

Respuestas:

14

Desde la vim(1)página del manual:

+ {comando}

-c {comando}

{comando} se ejecutará después de que se haya leído el primer archivo. {comando} se interpreta como un comando Ex. Si el {comando} contiene espacios, debe estar entre comillas dobles (esto depende del shell que se use). Ejemplo: Vim "+ set si" main.c

Nota: Puede usar hasta 10 comandos "+" o "-c".

Ignacio Vazquez-Abrams
fuente
3
¡Gracias! Sabía que me sentiría tonto ...: - / Me sirve bien por no leer la página de manual a fondo. Terminé usando vim +BundleInstall +qall!.
Imiric
4

Puede ejecutar su comando de esta manera:

vim -E -c BundleInstall -c q

lo que evitará abrir una ventana Vim en su terminal.

Nota: Mi primera respuesta incluyó la -sopción que necesitaba para otra aplicación, pero fue incorrecta aquí porque evitó gran parte de la inicialización de Vim, incluido el suministro del complemento que definió el BundleInstallcomando.

garyjohn
fuente
1
Gracias, pero por alguna razón no me funcionará.
imiric
1
Ahora veo por qué. Olvidé que -shace más que inhibir ciertos mensajes, también inhibe las inicializaciones, por lo que no se obtuvo la definición de BundleInstall. Una forma de arreglar eso sería añadir una opción como esta antes de la primera -c: --cmd 'runtime plugin/bundle.vim'. Edite ese nombre de archivo para adaptarlo. Ver :help -s-ex.
garyjohn
2

Si bien la receta específica de vim anterior es la forma correcta de hacerlo, siempre puede usar un enfoque más general como autoexpect .

AnonymousLurker
fuente
0

Para situaciones en las que necesita que vim se haya cargado completamente como si lo hubiera iniciado manualmente, esto funciona:

vim -c "autocmd! CursorHold * <commands to run>"

Por ejemplo, quería redirigir la salida :mapa un archivo desde el shell, pero quería capturar el mapeo que vim-airline crea solo después de que se muestre su tabulación (la línea en la parte superior muestra todos los nombres de búfer abiertos). esto de forma asíncrona, simplemente ejecutar una -credirección a un archivo no le daba tiempo para hacer las asignaciones. Podría haber una mejor manera, pero esto funciona para mí, especialmente porque ya lo updatetimeconfiguré en 100(0.1 segundos), lo que afecta el tiempo hasta CursorHoldque se dispara el evento. Por defecto, vim lo establece en 4 segundos.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
user1902689
fuente