Posso emettere una shell interattiva nella finestra di Vim?


16

So che posso :!o :r!eseguire un comando esterno e, facoltativamente, inserire il suo output nel testo. Posso persino esibirmi :!she genererò una shell che vivrà fino all'uscita da essa - ma mentre la shell è attiva, Vim è "addormentato" e inaccessibile. Devo chiudere la shell e generarne una nuova se voglio tornare su Vim per un momento - non molto utile.

Posso accedere alla shell dall'altra parte, sospendendo Vim con ^Ze gestendo il lavoro Vim attraverso bg, fge jobs. Questo ha più senso, ma è molto ingombrante nel lungo periodo. Posso usare Screense è disponibile (spesso non lo è), o aprire diverse finestre del mio gestore delle finestre (e ssh per indirizzare l'host da ciascuno di essi in sequenza, per avere sia vim che shell sull'host remoto, di nuovo ingombranti.)

Sarebbe più pulito se Vim mi consentisse di aprire una sessione di shell e di mantenerla, diciamo, in una delle sue finestre (interne), o di permettermi di passare ad essa e viceversa. È possibile qualcosa del genere?


1
Quindi, fondamentalmente, vuoi aprire una shell in a :split, mantenendo il file nell'altra finestra? ... Mi sembra un lavoro per tmux o schermo ...
Martin Tournoij,

1
@Carpetsmoker: spesso non ho il controllo su ciò che è installato sul sistema remoto, e il più delle volte nessuno dei due lo è, mentre Vim è sempre lì.
SF.

Valuta di passare a Neovim. Ora ha un emulatore di terminale integrato che funziona abbastanza bene e può essere aperto in un buffer vim.
Zach,

Risposte:


16

Ci sono un paio di plugin per Vim che lo consentono. Uso Conque ( Github ).

Dopo averlo inserito nella directory dei plugin, tutto ciò che devi fare è:

:ConqueTermSplit bash

E avrai una shell bash interattiva in vim. È quindi possibile utilizzare i normali gesti di VIM per fare qualsiasi altra cosa si possa desiderare di fare nella finestra.

Anche l'altro plugin è vimshell .


1
Non c'è modo di fare nulla del genere senza un plug-in?
SF.

3
@SF Vedi :help shell-window. (Risposta breve: no.)
muru,

3

Con VIM credo che i plugin che sono lì per fare questo non siano poi così fantastici, anche se Vimshell IMO è il più vicino. Tuttavia, devi capire che si tratta di un problema in 2 parti.

  1. VIM non è stato progettato per essere in grado di fare cose del genere, soprattutto ingombrante è essere in grado di eseguire qualsiasi attività di lunga durata e parlare in modo asincrono senza bloccare VIM. In questo caso non è solo la shell stessa, ma anche altre attività che è possibile eseguire all'interno del processo di shell.
  2. La filosofia modale di VIM non gioca molto bene con il modo in cui interagiamo con una shell. In una shell è modificabile solo la riga corrente, sebbene sia possibile scorrere e vedere il testo più vecchio della cronologia con shell non è possibile modificarlo. Ciò non rientra affatto nella filosofia di VIM, se si premesse ESC e si tornasse alla modalità normale, sarebbe abbastanza difficile impedire a un utente di tornare indietro e modificare parti della cronologia di cui sopra.

Secondo me ci sono 2 approcci che funzionano molto meglio in questo senso.

  1. Utilizzo di TMUX / Screen e finestre multiplex per avere sia la vim che la shell. In questo modo i due sono ben separati e tuttavia è possibile visualizzarli entrambi con uno sforzo minimo e i due possono lavorare al meglio delle proprie potenzialità senza essere in conflitto con il flusso reciproco.
  2. Usando plugin come tpope / vim-dispatch e simili, puoi facilmente lanciare comandi off-shell e farli funzionare in modo asincrono in background in una shell terminale reale e riportare i risultati in vim una volta completato. Questo ti fornisce anche lo stesso livello di isolamento tra i due e quindi i due possono di nuovo lavorare al meglio delle loro capacità senza calpestare le dita degli altri.

Vorrei aggiungere che esiste una buona probabilità che NeoVIM possa apportare un cambiamento in questo aspetto poiché uno dei suoi obiettivi principali è la capacità di eseguire lavori in modo asincrono. Ma fino ad allora questo è il massimo che possiamo ottenere secondo me.


3

Nel :help shell-window possiamo leggere sull'esecuzione dei comandi della shell in una finestra:

Ci sono state domande sulla possibilità di eseguire una shell in una finestra all'interno di Vim.

La risposta: non puoi!

Includere questo aggiungerebbe molto codice a Vim, che è una buona ragione per non farlo. Dopotutto, Vim è un editor , non dovrebbe svolgere attività di non editing. Tuttavia, per ottenere qualcosa del genere, potresti provare a dividere lo schermo del terminale o la finestra di visualizzazione con " splitvt programma ".

Un'alternativa è il comando " finestra ", presente sui sistemi Unix BSD, che supporta più finestre sovrapposte. O il programma " schermo ".

Tuttavia ci sono alcune soluzioni che puoi usare:

  • uso screenappositamente progettato per quel tipo di cose, ad esempio:

    • Ctrl+ a, Sper dividere la finestra corrente in orizzontale
    • Ctrl+ a,Tab per passare da una finestra all'altra
    • Ctrl+ a,X per rimuovere la regione corrente
    • Ctrl+ a, Qper rimuovere tutte le regioni tranne una

    Vedi di più su: GNU Screen Survival Guide su stackoverflow SE

    Oppure: GNU Screen Splitting , Guida rapida dello schermo per maggiori dettagli.

  • VIM-Shell - una patch di terze parti

    VIM-shell è un'estensione per VIM che presenta finestre divise e questa patch consente di avviare shell in quelle finestre. È disponibile solo per i sistemi POSIX

  • vterm - Emulatore di terminale all'interno di vim.

    L'obiettivo di vterm è fornire un clone di unix terminal all'interno di vim che funzioni immediatamente senza alcuna dipendenza.

  • Vimux - interagisce facilmente con tmux di vim.

    Ispirato da tslime.vim , un plug-in che consente di inviare input a tmux, vimux è di rendere semplice l'interazione con tmux da vim.

  • altro già menzionato: Conque

Correlati: Come eseguire un terminale all'interno di VIM? su stackoverflow


Come sbarazzarsi della divisione ?? : - /
0xc0de

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.