Aprire l'output di un comando shell in un riquadro diviso


23

Prendere in considerazione qualsiasi linguaggio di programmazione interpretato.

Posso eseguire lo script attualmente aperto utilizzando ! interpreter %e utilizzare il tasto Invio per tornare a VIM al termine dell'esecuzione.

E 'in qualche modo possibile di non sostituire la finestra corrente con l'output del comando di shell eseguito, ma aprire l'output in un nuovo riquadro di divisione, invece? Mi piacerebbe vedere ancora il mio codice sorgente durante l'esecuzione del mio script.

Ci ho provato :split ! interpreter %, ma non ha funzionato.

C'è un modo? Sto usando vim 7.3.

Risposte:


29

Con :!, il comando esterno viene eseguito in una shell e l'output fugace non viene catturato all'interno di Vim; vedi solo cosa viene stampato sul terminale, quindi il controllo ritorna su Vim al termine del comando esterno.

Per mantenere l'output, è necessario leggerlo in un Vim tampone . Per questo, c'è il :read!comando. Per aprire un nuovo scratch di buffer, combinare questo con :new:

:new | 0read ! <command>

Se si desidera passare il nome del file del buffer corrente ( %) per il comando esterno, è necessario l'uso :execute, in modo che sia già valutato nel buffer corrente:

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

Oppure, è possibile utilizzare il fatto che con un nuovo buffer, il precedente diventa l' alternativa uno, e di utilizzare #invece di %:

:new | 0read ! interpreter #

Sbarazzarsi del buffer di memoria virtuale con :bdelete!.

Se si desidera visualizzare l'output in modo asincrono mentre si esegue, è necessario un multiplexer esterno, o un plugin, come accennato in @chaos risposta.


Il comando ": execute ..." sopra funziona per me, ma quando provo a collegarlo alla sequenza di tasti F9, usando questa voce .vimrc [nnoremap <buffer> <F9>: esegui 'nuovo | 0read! / Usr / bin / env python3 'expand ('% ')], ottengo il seguente errore: [/ bin / bash: -c: line 0: EOF imprevisto durante la ricerca della corrispondenza' '' expand ('%' )]. Ho provato diverse sequenze di escape, ma immagino non quella giusta. = :). Qualche idea? Grazie.
NYCeyes

2

Per quanto ne so, non è possibile farlo in vim. Ma usa un multiplexer terminale come screenper questo. Prima di aprire un vim avviare il multiplexer:

screen

Quindi premere ctrl- a Sper l'orizzontale e ctrl- a |per uno schermo rovesciato verticale.

Ora apri un file in vimuna delle schermate divise. E passa all'altra schermata usando ctrl- a tab. Si noti che, nella seconda schermata dovete prima aprire una nuova schermata ( ctrl- a c) prima di poterlo utilizzare.

Nella schermata con vim è possibile modificare il file e nell'altra schermata è possibile eseguirlo e visualizzare i messaggi e il codice in modo permanente.

Ecco un riferimento rapido per screen.


In alternativa, è possibile utilizzare tmuxmultiplexer e vim-dispatchplugin per automatizzare la divisione e il salto tra i riquadri.
Taketwo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.