Come gestisco un terminale all'interno di Vim?


306

Sono abituato a Emacs, ma sto provando Vim per vedere quale mi piace di più.

Una cosa che mi piace di Emacs è la capacità di gestire un terminale all'interno di Emacs. È possibile all'interno di Vim? So che puoi eseguire comandi da Vim, ma vorrei essere in grado di eseguire un terminale all'interno di una scheda.



42
È :! <command>quello che stai cercando?
data

48
Da Vim 8.0, esiste un :termcomando che apre un nuovo terminale in una nuova finestra divisa. Se non funziona per te, controlla vim --version | grep -o .terminalse questa funzione è disponibile ( +terminal) o non disponibile ( -terminal).
Susam Pal

Risposte:


123

Consiglierei sicuramente screenqualcosa del genere. Vim è un editor di testo, non una shell.

Userei Ctrl+ASper dividere la finestra corrente in orizzontale, o nella schermata di Ubuntu e in altre versioni patchate, puoi usare Ctrl+A|(pipe) per dividere verticalmente. Quindi utilizzare Ctrl+ATab(o equivalentemente su alcuni sistemi, Ctrl+ACtrl+Iche potrebbe essere più facile da digitare) per passare da una finestra all'altra. Esistono altri comandi per modificare le dimensioni e la disposizione delle finestre.

O un uso meno avanzato di screenè solo per aprire più finestre a schermo intero e passare da una all'altra. Questo è ciò che faccio normalmente, utilizzo solo occasionalmente la funzione di schermo diviso.

La domanda della GNU Screen Survival Guide ha una serie di buoni consigli se non si ha familiarità con il suo utilizzo.


7
+1 Ho ricevuto di recente solo il vangelo dello schermo. Mi chiedo come ho vissuto senza di essa.
pistole

118
preferirei scegliere tmux invece di schermo.
tomaszkubacki,

81
Sì, ovviamente si può eseguire screen, o tmux, o terminator, oppure aprire un'altra finestra e alt-tab, o persino usare un interruttore KVM attivato con un pedale. Ma non è questo il punto: tutte queste soluzioni sacrificano l' integrazione tra terminale e VIM, motivo per cui ci si dovrebbe preoccupare di cercare soluzioni in questo spazio. Non capisco come questa risposta sia anche una risposta, figuriamoci la risposta migliore o accettata. Penso che andrò a provare Conque.
Stabledog,

33
come è questa la risposta migliore ??? devi annullare la votazione e votare la risposta successiva in basso, che in realtà risponde alla tua domanda. L'uso dello schermo non esegue una shell all'interno di vim. È come dire a qualcuno di iniziare un'altra shell. E per coloro che continuano a buttare fuori ":!" ha già detto che sapeva eseguire i comandi, che NON è quello che ha chiesto ... sheesh. L'arroganza è così densa qui che puoi tagliarla con un coltello.
Osirisgothra,

6
Questa risposta dovrebbe essere aggiornata a causa della nuova funzionalità Terminal Window
Alan Garrido,

232

Non aggiornato da agosto 2011

Dai un'occhiata a Conque Shell (anche su GitHub ). Ti permette di eseguire qualsiasi programma interattivo all'interno di vim, non solo una shell.


21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash.... l'orrore ricorsiva !!
keflavich,

1
Psihodelia sembra aver ragione. Ho appena compilato vim con --enable-pythoninterp (cygwin non distribuisce vim con + python) e dopo aver installato ConqueTerm, ricevo un errore da #set_buffer_settings. Non sono stato in grado di rintracciare dove vive quella funzione, né avere idea di cosa significhi l'errore. Il messaggio include un'istruzione su un argomento non valido "edit ++ enc = utf-8 bash \ - \ 2". Argh.
Nate Kennedy,

47
Per capire la ricorsione, devi prima capire la ricorsione.
Stabledog,

19
@ Łukasz Niemier VIMCEPTION
Sebastián Grignoli

1
Sembrerebbe che questo non sia più supportato, qualcuno ha un supplente?
dykeag,

204

Non sono sicuro di cosa stai cercando di ottenere (non ho mai usato Emacs), ma puoi eseguire comandi in Vim digitando:

:! somecommand [ENTER]

E se vuoi digitare diversi comandi o giocare in una shell per un po ', puoi sempre usare:

:! bash (or your favourite shell) [ENTER]

Una volta terminato il comando o la shell, ti verrà data la possibilità di premere Enterper tornare alla finestra dell'editor

Vim è intenzionalmente leggero e privo della capacità di fare cose di tipo non editoriale, proprio come eseguire una shell completa all'interno di un riquadro / scheda Vim, ma come menzionato sopra ci sono componenti aggiuntivi di terze parti come vim-shell che ti consentono per fare quel genere di cose.

In genere se voglio passare da Vim alla mia shell (Bash), premo CTRL+ Zper mettere in pausa il processo Vim, giocare nella mia shell, quindi digitare 'fg' quando voglio tornare a Vim - mantenendo il mio editor e il mio conchiglia bella e separata.


17
E se vuoi copiare l'output del comando nel buffer corrente:: r! dir
Cyber ​​Oliveira,

6
Uso sia Emacs che Vim (e ho molta più esperienza con Vim). Ma ho scoperto che spesso è più bello e più semplice lavorare con due viste contemporaneamente (una per vedere cosa stai modificando e un'altra per lavorare all'interno di una shell interattiva, ad esempio per testare l'effetto di una modifica di configurazione che hai appena modificato). Aiuta anche con la mia cognizione, la conservazione e i flussi di lavoro mentali quando le cose importanti che potrei aver bisogno di monitorare da vicino non scompaiono dallo schermo (come quello che succede quando usi Ctrl-Z o: shell in Vim).
mvanle,

È un'ottima risposta che mi farà risparmiare molto tempo.
jerry_sjtu,

Bella risposta! Per complimentarmi ulteriormente, aggiungerei anche il :r! command [ENTER]menzionato nei commenti.
Jeach,

152

Il modo in cui mi aggiro è:

  • mettere in pausa Vim con Ctrl+ Z,
  • gioca nel terminal,
  • poi torna esattamente dove hai lasciato con Vim semplicemente digitando il comando fg.

14
:!bashè un modo migliore per farlo
0atman

Penso che voglia una sorta di dreampie come funzionalità
Adam Miller,

10
@Oatman Perché è :!bashpiù bello di Ctrl+z? (Mi chiedo solo)
Sebastián Grignoli,

2
@ SebastiánGrignoli perché con Ctrl+Z, ad esempio, puoi spostarti in un'altra cartella, lsquindi git status, ecc. Ctrl+ZÈ una "pausa", puoi "riprenderla" con fg. Ma con:! Bash, come so finora, puoi eseguire un solo comando alla volta, o anche se puoi eseguire più di un comando alla volta, non è ancora conveniente. Quindi, nel complesso, 'Ctrl + Z' è molto meglio
Leo

+1 perché funziona praticamente in qualsiasi ambiente. Lavorando su un sistema estraneo che non posso personalizzare e tramite una shell PuTTY economica, funziona alla grande.
t3sture

121

Se abilitato nella tua versione di Vim, è possibile avviare un terminale con il :termcomando.

Il supporto della finestra del terminale è stato aggiunto a Vim 8. È una funzione opzionale che può essere abilitata durante la compilazione di Vim con la funzione + terminale. Se la tua versione di Vim ha un supporto terminale, :echo has('terminal')verrà visualizzato "1".

L'inserimento :termti porterà in modalità Terminale-Lavoro , dove puoi utilizzare il terminale come previsto.

Nella modalità Terminale-Lavoro , premendo Ctrl-W No si Ctrl-\ Ctrl-Npassa alla modalità Terminale-Normale , che consente di spostare il cursore e di eseguire i comandi in modo simile alla modalità Normale di Vim . Per tornare alla modalità Terminale-Lavoro , premere i.

Altre risposte menzionano funzionalità simili in Neovim.


5
+1 per come tornare alla modalità terminale cmd con idopo il passaggio dalla modalità di navigazione ctrl-wN. Questa è una funzione killer anche su tmux e funziona anche su Windows.
Radke,

1
È possibile dividere in verticale usando :term?
Vitaly Zdanevich,

1
super! Fantastico che il terminale sia integrato, quindi non abbiamo problemi con più plugin. Aggiornato a vim 8 via brew install vim --override-system-vie :termfunziona perfettamente. Grazie per la condivisione!
LeOn - Han Li,

18
@VitalyZdanevich, :vertical :termsi dividerà verticalmente con il terminale nella finestra di sinistra. :vertical :botright :termsi dividerà verticalmente con il terminale nella finestra di destra. In alternativa, è possibile disporre manualmente le finestre, quindi utilizzare :term ++curwinper aprire un terminale nella finestra attiva.
Daniel S.

esc ctrl-w w ti permette di passare da una finestra
all'altra

87

:shpoi ctrl+dper tornare in (bash)

Aggiornamento :

È possibile mappare ctrl+dVIM per l'esecuzione :sh, che consente di alternare rapidamente tra bash e vim.

noremap <C-d> :sh<cr>


1
Penso ctrl+ze fgsono leggermente più veloci, dato che non è necessario digitare :shin quel caso.
Alex,

@Alex no non devi digitare :shse fai la mappa. Dopo noremap, puoi solo Ctrl+Dda VIM a sh, e poiché ^Dè EOF, che termina il sh, quindi tornerai a VIM. L'unica chiave può alternare tra she vim.
no1xsyzy,

42

La nuova principale funzionalità di Vim 8.1 è il supporto per l'esecuzione di un terminale in una finestra di Vim.

:term aprirà il terminale in un'altra finestra all'interno di Vim.


2
funziona perfettamente, grazie! la tua risposta è molto più nello spirito della domanda originale
subelsky

Ciao, sai come uscire da questa modalità?
user3289737

2
come nel normale terminale, exituscirà dal terminale, quindi userà :qper chiudere la finestra
Yossarian42

2
@ user3289737 In alternativa, è possibile premere Ctrl + W due volte di seguito per passare da una finestra all'altra. Questo non è specifico per le finestre dei terminali, ma funziona altrettanto bene.
flarn2006,

39

Alla fine un :terminalcomando nativo è stato aggiunto a vim nel 2017.

Ecco un estratto dal readme: terminal :

Questa funzione è per l'esecuzione di un emulatore di terminale in una finestra di Vim. Un lavoro può essere avviato collegato all'emulatore di terminale. Ad esempio, per eseguire una shell:

 :term bash

O per eseguire il comando build:

 :term make myprogram

Il lavoro viene eseguito in modo asincrono da Vim, la finestra verrà aggiornata per mostrare l'output del lavoro, anche durante la modifica in un'altra finestra.


Il terminale viene eseguito in un buffer nella stessa scheda. quindi se sei abituato ad usare più file in vim, potresti incontrare qualche difficoltà. la commutazione dei buffer alla fine arriverà al terminale da dove è un punto di non ritorno, è necessario uccidere il terminale. fintanto che ne sei consapevole, dovrebbe andare bene. spero che gli sviluppatori arrivino con una soluzione alternativa per questo.
ArunMKumar,

1
@ArunMKumar Usa [Ctrl + W] per "scappare" dal terminale, quindi fai :bncome al solito. Non c'è bisogno di uccidere il terminal e non è un punto di non ritorno :)
fjardon,

Grazie, amico, mi sono perso del tutto. Ho creato una chiave : bn su una chiave e ha smesso di funzionare, sta funzionando di nuovo. E 'stato il mio male.
ArunMKumar,

2017? Intendi il 2018?
flarn2006,

1
@ flarn2006, rispetto al 2017 rispetto al 2018, Vim 8.1 è stato annunciato su vim.org il 18 maggio 2018, con "supporto per l'esecuzione di un terminale in una finestra di Vim" elencato come "principale novità". La funzionalità era disponibile per la prima volta in precedenza, il 7 luglio 2017, nella patch 8.0.0693. github.com/vim/vim/commit/…
Daniel S.

32

Questa domanda è piuttosto vecchia, ma per coloro che la trovano, c'è una nuova possibile soluzione: Neovim contiene un emulatore di terminale di prima classe a tutti gli effetti, che fa esattamente ciò che ConqueTerm ha provato a fare. Corri semplicemente :term <your command here>.

<C-\><C-n>tornerà dalla modalità termine alla modalità normale. Se sei come me e preferisci che l'uscita esca ancora dalla modalità termine, puoi aggiungerla al tuo nvimrc:

tnoremap <ESC><ESC> <C-\><C-N>

Quindi, premendo due volte ESC, si tornerà dalla modalità terminale alla modalità normale, in modo da poter manipolare il buffer su cui sta scrivendo il comando ancora in esecuzione.

Anche se tieni a mente, dato che nvim è in fase di forte sviluppo nel momento in cui invio questa risposta, potrebbe essere aggiunto un altro modo per uscire dalla modalità terminale. Dal momento che Ctrl+\Ctrl+npassa alla modalità normale da quasi tutte le modalità, non mi aspetto che questa risposta si sbagli, ma tieni presente che se non funziona, questa risposta potrebbe non essere aggiornata.

https://github.com/neovim/neovim


29

:term

Questa funzione è stata recentemente aggiunta in Vim 8.1, che a partire da questo post è stato appena rilasciato di recente, quindi potrebbe essere necessario aggiornarlo per poterlo utilizzare.


È stato aggiunto prima di vim 8.1. È solo la principale funzionalità principale che vim 8.0.001 non aveva. Ecco perché è pubblicizzato come una novità di vim 8.1. Vedi la risposta di Daniel dall'ottobre 2017 e quella di Fjardon nell'aprile 2018. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Luc Hermitte,

17

So che non sto rispondendo direttamente alla domanda, ma penso che sia un buon approccio. Nessuno ha menzionato tmux (o almeno non come risposta autonoma). Tmux è un terminale multiplexor come lo schermo. La maggior parte delle cose può essere fatta in entrambi i multiplexor, ma in breve è più facile da configurare. Anche tmux in questo momento è stato sviluppato più attivamente dello schermo e c'è un grande ecosistema attorno ad esso, come strumenti che aiutano la configurazione, ecc.

Anche per vim, c'è un altro plugin: ViMUX , che aiuta molto nell'interazione tra entrambi gli strumenti. Puoi chiamare i comandi con:

:call VimuxRunCommand("ls")

Questo comando crea una piccola divisione orizzontale sotto il riquadro corrente in cui si trova vim.

Può anche consentire l'esecuzione da un prompt nel caso in cui non si desideri eseguire l'intero comando:

<Leader>vp :VimuxPromptCommand<CR>

Dato che non era abbastanza, ci sono almeno 6 "plugin specifici per piattaforma":

  • vim-vroom : runner per rspec, cetriolo e test / unità; supporto vimux viag:vroom_use_vimux
  • vimux-ruby-test : un insieme di comandi per eseguire facilmente test ruby
  • vimux-cucumber : esegui Cucumber Features attraverso Vimux
  • vim-turbux : test Turbo Ruby con tmux
  • vimux-pyutils : un set di funzioni per vimux che consentono di eseguire blocchi di codice in ipython
  • vimux-nose-test : esegue test del naso in vimux

Ecco un bel "caso d'uso": Test su richiesta usando Vimux e Turbux con Spork e Guard


Vuoi spiegare perché è stato sottoposto a downvoting? (Oltre a essere una risposta di 6 anni fa)
Pablo Olmos de Aguilera C.

13

Qualcuno ha già suggerito https://github.com/Shougo/vimshell.vim , ma non ha menzionato il perché. Di conseguenza, quando mi sono allontanato da questa domanda, ho perso molto altro tempo a provare le altre opzioni (molto più alte).

Shougo / vimshell è la risposta. Ecco perché:

Oltre ad essere un emulatore di terminale, VimShell ti consente di navigare attraverso l'output del terminale in modalità normale e visiva. Pertanto, se un comando che esegui genera un output che desideri copiare e incollare usando solo la tastiera ... VimShell copre questo.

Nessuna delle altre opzioni menzionate, incluso il comando: terminal in NeoVim, lo fa. Neovim's: il terminal si avvicina, ma fallisce almeno nei seguenti modi dal 18/02/2017:

  • Sposta il cursore alla fine del buffer, anziché mantenerlo nello stesso punto come fa VimShell. Enorme perdita di tempo.

  • Non supporta modifiable = 1vedere una discussione su questo su Github , quindi plug-in utili come vim-easymotion non possono essere utilizzati.

  • Non supporta la visualizzazione di numeri di riga come Vimshell.

Non perdere tempo con le altre opzioni, incluso Neovim: terminal. Vai con VimShell.


1
NeoVim ti consente di navigare e copiare dall'output del terminale in modalità normale / visiva. Lo faccio sempre. Usando NVIM 0.1.6-dev
Alice Heaton,

Grazie, proverò VimShell. Mi sono preso la libertà di rimuovere un'affermazione errata dalla risposta, tuttavia. Come sottolineato da @Alice, NeoVim :terminalpuò assolutamente fare lo stesso.
Konrad Rudolph,

:terminalnon può fare lo stesso :VimShellin termini di navigazione e modifica e in modi fondamentali. Vedi spiegazione modifica sopra.
user3751385,

9

Potresti dare un'occhiata al :shcomando (vedi :help shin Vim).

Vari comandi


Quindi non usare zsh con vim. set shell=/bin/shfarà usare a Vim una shell più silenziosa per i suoi comandi.
Ross Presser,

8

2
NON PRENDERE IL CONSIGLIO DI splitvt: manipola i codici di controllo del colore e rende vimcompletamente inutilizzabile.
nuovo123456,

12
"No" è una cattiva risposta. Una risposta migliore è "Per impostazione predefinita, no." Tecnicamente, può essere fatto e forse devi scrivere un nuovo codice sorgente e compilarlo da solo o scrivere un plugin. È facile? Forse no, ma può essere fatto. Dire semplicemente No è ​​più come dire "no, non lo farò".
trusktr,

2
@AnishRamaswamy Non è ancora possibile eseguire una shell all'interno di un buffer vim usando stock vim (a differenza di emacs). Questa è la domanda del PO.
Ambra,

1
@Amber, Sì, andrebbe bene, tranne che l'OP non ha fatto menzione dell'uso del magazzino.
Anish Ramaswamy,

3
Qualcuno dovrebbe semplicemente modificare questa risposta per dire che non puoi farlo con stock vim.
still_dreaming_1

4

L'unico modo che conosco è usando vim-shell , una patch di terze parti.


Per essere pedante, vim-shell è una patch, non un 'componente aggiuntivo' (che almeno per me implica che è una sceneggiatura). Non l'ho provato personalmente, ma la pagina vim-shell sul wiki di Vim purtroppo suggerisce che non si compili con Vim 7.1+.
Yewge,

Modificato per placare il pedante. :) (Ho dovuto digitare qualcosa di più lungo di 15 caratteri. "Risolto" non era abbastanza lungo)
romanda il

Shougo / vimshell ( github.com/Shougo/vimshell.vim ) sembra funzionare piuttosto bene. Richiede la costruzione di una libreria dinamica, ma è abbastanza semplice (cd <vim> / vimproc; make)
Wayne Walker,


2

Prova vterm , che è una shell praticamente completa all'interno di vim. È leggermente difettoso con la sua storia e le sue chiare funzioni, ed è ancora in fase di sviluppo, ma è ancora abbastanza buono


2

Supponendo che la tua versione di vim supporti +termprima il comando, imposta la shell affinché vim venga utilizzata in un comando (ad es. set=/usr/bin/zsh), Quindi esegui il comando +term(ad es bo 15vs +term.). potrebbe essere necessario eseguire alcune manovre aggiuntive delle finestre (ovvero eliminarne una e ruotarle), ma si avrà il terminale.


0

Riconosco che non sto rispondendo rigorosamente alla tua domanda, ma ciò che ha funzionato meglio per me quando uso Vim e Terminali nella stessa finestra è Tmux (che è una specie di "esecuzione nel software in background" come, simile allo schermo, anche se questo si lavora meglio con divisioni e schede).

Questo post ti aiuterà a capire come lavorano insieme: "Tmux e Vim - ancora meglio insieme" .

In questo modo possiamo convertire Vim in un potente IDE


0

Dividi lo schermo ed esegui il comando term ++curwinper eseguire il terminale all'interno del buffer Vim. Il seguente comando fa entrambe le cose e ha funzionato per me:

:bo 10sp | term ++curwin
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.