Abra la salida de un comando de shell en un panel dividido

23

Considere cualquier lenguaje de programación interpretado.

Puedo ejecutar el script abierto actualmente usando ! interpreter %y usar la tecla de retorno para volver a vim después de que finalice la ejecución.

¿De alguna manera es posible no reemplazar la ventana actual con la salida del comando shell ejecutado, sino abrir la salida en un nuevo panel dividido? Todavía me gustaría ver mi código fuente durante la ejecución de mi script.

Lo intenté :split ! interpreter %, pero no funcionó.

¿Hay alguna manera? Estoy usando vim 7.3.

muffel
fuente

Respuestas:

29

Con :!, el comando externo se ejecuta en un shell, y la salida fugaz no se captura dentro de Vim; solo ve lo que se imprime en el terminal, luego el control vuelve a Vim después de que finaliza el comando externo.

Para mantener la salida, debe leerla en un búfer de Vim . Para eso, está el :read!comando. Para abrir un nuevo buffer de scratch , combine esto con :new:

:new | 0read ! <command>

Si desea pasar el nombre de archivo del búfer actual ( %) al comando externo, debe usarlo :execute, para que ya esté evaluado en el búfer actual:

:execute 'new | 0read ! interpreter' expand('%')

O bien, utiliza el hecho de que con un nuevo búfer, el anterior se convierte en el alternativo , y usa en #lugar de %:

:new | 0read ! interpreter #

Deshágase del búfer de cero con :bdelete!.

Si desea ver la salida de forma asincrónica mientras se ejecuta, necesita un multiplexor externo, o un complemento, como se menciona en la respuesta @chaos.

Ingo Karkat
fuente
El comando ": execute ..." anterior funciona para mí, pero cuando trato de vincularlo a la combinación de teclas F9, usando esta entrada .vimrc [nnoremap <buffer> <F9>: execute 'new | 0read! / Usr / bin / env python3 'expand ('% ')], recibo el siguiente error: [/ bin / bash: -c: línea 0: EOF inesperado mientras busco' '' expandir ('%' )]. Intenté varias secuencias de escape, pero supongo que no es la correcta. = :). ¿Algunas ideas? Gracias.
NYCeyes
2

Por lo que sé, no puedes hacer eso vim. Pero use un multiplexor de terminal como screenpara eso. Antes de abrir un vim, inicie el multiplexor:

screen

Luego presione ctrl- a Spara horitzontal y ctrl- a |para una pantalla vertical derramada.

Ahora abra un archivo en vimuna de las pantallas divididas. Y salta a la otra pantalla usando ctrl- a tab. Tenga en cuenta que, en la segunda pantalla, primero debe abrir una nueva pantalla ( ctrl- a c) antes de poder usarla.

En la pantalla con vim puede editar el archivo y en la otra pantalla puede ejecutarlo y ver los mensajes y el código de forma permanente.

Aquí una referencia rápida para screen.

caos
fuente
Alternativamente, puede usar el tmuxmultiplexor y el vim-dispatchcomplemento para automatizar la división y el salto entre paneles.
Taketwo