Cómo generar el resultado de los comandos vim en shell

11

Digamos que estoy en el shell ( bash) y quiero ver la salida que :scriptnamesdaría, pero no quiero iniciar vim o tal vez quiero hacer eco en otro archivo.

Entonces ejecuto

vim +scriptnames

Lo que me muestra todos los scripts, pero ¿cómo hago eco de eso en el stdout del shell?

hgiesel
fuente

Respuestas:

10

Eso sucede, porque generalmente Vim cambia a la pantalla alternativa y trabaja allí. Al salir, Vim volverá a cambiar y, por lo tanto, no verá nada de su sesión de Vim, sino el resultado del comando ejecutado incluso antes de iniciar Vim.

Esta característica se explica en :h xterm-screens (enlace)

Entonces, básicamente, no desea eso y, por lo tanto, desea deshabilitarlo. Puede hacerlo estableciendo :set t_ti= t_te=los códigos de terminal que realizan esto para vaciar.

Poniendo todo junto, querrás iniciar Vim así:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

Estamos restableciendo la 'more'opción, para que no vea el indicador hit-enter-prompt.

Christian Brabandt
fuente
1
Esto es IMPRESIONANTE, muchas gracias! En realidad dudaba que esto fuera posible.
hgiesel
¿Esto hace posible usar VimL como un lenguaje de script de sistema completo al permitir que escriba en stdout (para los particularmente masoquistas)?
shadowtalker
1
Un problema con esto es que no puedo desplazar el terminal. (Si el texto es más largo que la altura de mi terminal, no puedo ver la parte superior) El texto también desaparece si abro vim y salgo.
FDinoff
@FDinoff Para eso están los buscapersonas less. Simplemente póngalo en menos así vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less. El diseño puede estar arruinado al principio (está en mi terminal), pero después de presionar <CL> todo es agradable y elegante.
hgiesel
No veo salida cuando se ejecuta vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!', solo hay un "flash rápido", el comando sale con el código 0, no hay salida. ¿Me estoy perdiendo de algo?
TrungDQ
3

También podemos usar el :redircomando para redirigir los resultados de los comandos vim a un archivo

Por ejemplo,

vim -c "redir! > vimout | scriptnames | redir END | q"

Esto redirige la salida scriptnamesal archivo "vimout"

MS.Kim
fuente
1

Aprecio la respuesta proporcionada por Christian Brabandt, pero creo que una mejor respuesta sería separar el comando de salida usando otro comando -c de esta manera:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

El uso de este método significa que podría unir varios comandos diferentes y luego usar la 'q!' Final salir de vim.

Benjamin Frazier
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 asincrónica, 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